アプリケーションを作成する場合、通常、ComboBox や ListBox などの共通コンポーネントは、テキストの表示だけでなく、テキストに関連するアイコンの表示にも使用されます。一般的な Windows アプリケーションでは、リストされた表示テキストの変更に応じて、これらのアイコンの表示が変更されます。たとえば、現在のディレクトリ内のすべてのファイルがコンボ ボックスにリストされている場合、コンボ ボックスの左側の表示はそのファイルに関連付けられます。接続されたアイコンは動的アイコンと呼ばれます。 Delphi で動的アイコンを使用する手順は次のとおりです。 1. アイコンを取得する
動的アイコンを使用するには、まず表示テキストとそれに関連付けられたアイコン ハンドルを取得する方法を解決する必要があります。アイコンはファイルの関連付けを通じてシステム レジストリによって決定され、Windows プログラミングでは、同じファイル (またはサブディレクトリ、またはフォルダー) がデスクトップ上に 2 つの表示結果 (DOS ファイル名と表示名 (表示名)) を持つ場合もあります。 。アプリケーションが Windows リソース ブラウザと同じ効果を持つ必要がない場合は、FindFirst() 関数と FindNext() 関数、および FindClose() プロセスを使用して DOS ファイル名を取得できます。それ以外の場合は、Windows API を使用する必要があります。表示名を取得します。ファイル名を取得する際、ShellAPI.pas の SHGetFileInfo() 関数を使用して、そのアイコン ハンドル HICON を取得できます。手順は次のとおりです。
function 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: Integer; //アイコンのシステムインデックス番号。
dwAttributes: DWORD; //ファイルの属性値
szDisplayName: AnsiChar の配列 [0..MAX_PATH-1] // ファイルの表示名;
szTypeName: array [0..79] of AnsiChar // ファイルのタイプ名;
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. アイコンの読み込み
Delphi が提供する TImageList コンポーネントを使用して、CommCtrl.pas の関数 ImageList_AddIcon() を呼び出して取得したアイコンをロードし、そのインデックス番号が表示されたテキストに対応していることを確認します。手順は次のとおりです。
function ImageList_AddIcon(ImageList: HIMAGELIST; //アイコンの ImageList ハンドルをロードします
Icon: Hicon //ロードされたアイコンハンドル): Integer; //ImageList 内のアイコンのインデックス番号を返します。
ImageList_AddIcon() の戻り値は、アイコンのインデックス番号を指定する必要がある場合に使用できます。 3. アイコンとテキストのグラフィック出力
コンボ ボックスやリスト ボックスなど、アイコンとテキストを同時に表示する必要があるため、アイコンを直接表示できないコンポーネントの場合は、対応する Style プロパティを設定することで実現できます。例は次のとおりです。
コンボ ボックス: ComboBox1.Style:=csOwnerDrawVariable 実際の使用経験によると、ObjectInspector フォームに直接設定しないことをお勧めします。代わりに、コードをプログラム内の適切な場所に追加する必要があります。そうしないと、高さが不規則に変更されます。描画領域のズレが発生する可能性があります。
リスト ボックス: ListBox1.Style:=lbOwnerDrawVariable
ステータス バー: StatusBar1.Panels[i].Style:= psOwnerDraw は単純なステータス バーを使用できません。i は、アイコンが描画されるステータス バー内の特定のペインのインデックス番号です。グラフィック出力は ImageList1.Draw を使用できます。 TImageList の () メソッドとテキスト出力では、コンポーネントの Canvas プロパティから継承される TCanvas の TextOut() メソッドを使用できます。明らかに、Canvas プロパティのないコンポーネントはこのメソッドを使用してアイコンを表示できません。
アイコンを直接表示できるコンポーネントの場合は、対応するTimageListコンポーネント名にImagesやStateImagesなどの必要なアイコンプロパティを直接指定し、アイコンのインデックス番号を指定することでアイコンを表示できます。大きなアイコンを使用する場合は、最初に TImageList の CreateSize() メソッドを呼び出してロード可能なアイコンのサイズを指定し、TImageList の Clear メソッドを呼び出すたびに CreateSize() を再度呼び出す必要があることに注意してください。
TImageList の ImageList1.Clear メソッドを使用して、読み込まれたアイコンをクリアします。これは、更新が必要な場合によく使用されます。