애플리케이션을 작성할 때 ComboBox, ListBox 등의 공통 구성 요소는 일반적으로 텍스트를 표시하는 데뿐만 아니라 텍스트와 관련된 아이콘을 표시하는 데에도 사용됩니다. 일반적인 Windows 응용 프로그램에서는 나열된 표시 텍스트가 변경됨에 따라 이러한 아이콘의 표시도 변경됩니다. 예를 들어, 현재 디렉터리의 모든 파일이 콤보 상자에 나열되면 콤보 상자 왼쪽의 표시는 해당 항목과 관련됩니다. 파일 이름. 연결된 아이콘을 동적 아이콘이라고 합니다. Delphi에서 동적 아이콘을 사용하는 단계는 다음과 같습니다. 1. 아이콘 얻기
동적 아이콘을 사용하기 위해 가장 먼저 해결해야 할 것은 표시 텍스트와 이와 관련된 아이콘 핸들을 얻는 방법입니다. 아이콘은 파일 연결을 통해 시스템 레지스트리에 의해 결정되며 Windows 프로그래밍에서는 동일한 파일(또는 하위 디렉터리 또는 폴더)이 바탕 화면에 DOS 파일 이름과 표시 이름(표시 이름)이라는 두 가지 표시 결과를 가질 수도 있습니다. . 응용 프로그램이 Windows 리소스 브라우저와 동일한 효과를 가질 필요가 없다면 FindFirst() 및 FindNext() 함수와 FindClose() 프로세스를 사용하여 DOS 파일 이름을 얻을 수 있습니다. 그렇지 않으면 Windows API를 사용해야 합니다. 표시 이름을 얻으려면. 파일 이름을 얻는 동안 ShellAPI.pas의 SHGetFileInfo() 함수를 사용하여 해당 아이콘 핸들 HICON을 얻을 수 있습니다. 지침은 다음과 같습니다.
함수 SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWord;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
pszPath 매개변수: 지정된 파일 이름. uFlags 값에 SHGFI_PIDL이 포함되어 있지 않으면 직접 지정할 수 있습니다. 그렇지 않으면 pszPath는 계산을 통해 얻어야 하며 직접 지정할 수 없습니다.
dwFileAttributes 매개변수: 파일 속성, uFlags 값에 SHGFI_USEFILEATTRIBUTES가 포함된 경우에만 유효하며 이 매개변수는 일반적으로 사용되지 않습니다.
psfi 매개변수: 다음 필드가 포함된 레코드 유형인 획득된 파일 정보를 반환합니다.
hIcon: HICON; //파일의 아이콘 핸들
iIcon: 정수; //아이콘의 시스템 인덱스 번호
dwAttributes: DWORD; //파일의 속성값;
szDisplayName: AnsiChar의 배열 [0..MAX_PATH-1] //파일의 표시 이름;
szTypeName: AnsiChar의 배열 [0..79] //파일의 유형 이름;
cbFileInfo 매개변수: psfi의 비트 값;
uFlags 매개변수: 반환해야 하는 파일 정보 식별자를 나타냅니다. 일반적으로 사용되는 상수는 다음과 같습니다.
SHGFI_ICON; //아이콘 가져오기
SHGFI_DISPLAYNAME; //표시 이름을 가져옵니다.
SHGFI_TYPENAME; //유형 이름을 가져옵니다.
SHGFI_ATTRIBUTES;//속성 가져오기
SHGFI_LARGEICON; //큰 아이콘 가져오기
SHGFI_SMALLICON; //작은 아이콘 가져오기
SHGFI_PIDL; // pszPath는 식별자입니다.
SHGetFileInfo() 함수의 반환 값은 uFlags 값에 따라 달라집니다. SHGetFileInfo()를 호출하면 psfi 매개변수에서 파일의 아이콘 핸들을 얻을 수 있지만, uFlags 매개변수에 SHGFI_PIDL을 사용하지 않으면 SHGetFileInfo()는 "내 컴퓨터"와 같은 가상 폴더에 대한 정보를 얻을 수 없다는 점에 유의하세요. 2. 아이콘 로딩
CommCtrl.pas에서 ImageList_AddIcon() 함수를 호출하여 얻은 아이콘을 로드하려면 Delphi에서 제공하는 TImageList 구성 요소를 사용하고 해당 인덱스 번호가 표시된 텍스트와 일치하는지 확인하십시오. 지침은 다음과 같습니다.
function ImageList_AddIcon(ImageList: HIMAGELIST; //아이콘의 ImageList 핸들 로드
Icon: Hicon //로드된 아이콘 핸들): Integer; //ImageList에 있는 아이콘의 인덱스 번호를 반환합니다.
ImageList_AddIcon()의 반환 값은 아이콘 인덱스 번호를 지정해야 할 때 사용할 수 있습니다. 3. 아이콘과 텍스트의 그래픽 출력
아이콘을 직접 표시할 수 없는 콤보 상자, 목록 상자 등의 구성 요소는 아이콘과 텍스트를 동시에 표시해야 하기 때문에 해당 스타일 속성을 설정하면 됩니다. 예는 다음과 같습니다.
콤보 상자: ComboBox1.Style:=csOwnerDrawVariable. 실제 사용 경험에 따르면 ObjectInspector 양식에서 직접 설정하지 않는 것이 가장 좋으며, 대신 프로그램의 적절한 위치에 코드를 추가해야 합니다. 그렇지 않으면 높이가 불규칙하게 변경됩니다. 그리기 영역이 발생할 수 있습니다.
목록 상자: ListBox1.Style:=lbOwnerDrawVariable
상태 표시줄: StatusBar1.Panels[i].Style:= psOwnerDraw는 간단한 상태 표시줄을 사용할 수 없습니다. i는 아이콘이 그려질 상태 표시줄의 특정 창의 인덱스 번호입니다. ImageList1.Draw를 사용할 수 있습니다. () 메서드와 텍스트 출력은 구성 요소의 Canvas 속성에서 상속된 TCanvas의 TextOut() 메서드를 사용할 수 있습니다. 분명히 Canvas 속성이 없는 구성 요소는 이 메서드를 사용하여 아이콘을 표시할 수 없습니다.
아이콘을 직접 표시할 수 있는 컴포넌트의 경우 해당 TimageList 컴포넌트 이름으로 Images, StateImages 등 필수 아이콘 속성을 직접 지정하고, 아이콘의 인덱스 번호를 지정하여 아이콘을 표시할 수 있습니다. 큰 아이콘을 사용할 때는 먼저 TImageList의 CreateSize() 메소드를 호출하여 로드 가능한 아이콘의 크기를 지정하고 TImageList의 Clear 메소드를 호출할 때마다 CreateSize()를 다시 호출해야 한다는 점에 유의해야 합니다.
새로 고침이 필요할 때 자주 사용되는 로드된 아이콘을 지우려면 TImageList의 ImageList1.Clear 메소드를 사용하십시오.