0

HIMAGELISTリストビューのを作成したい。実際にはファイルアイコンで構成する必要があります。

これが私が持っているコードです:

HIMAGELIST imageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
                                          GetSystemMetrics(SM_CYSMICON),
                                          ILC_MASK, 1, 1);

HICON ico = reinterpret_cast<HICON>(LoadImage(0,IDI_APPLICATION,
                                                IMAGE_ICON,0,0,LR_SHARED));
ImageList_AddIcon(imageList, ico);

ListView_SetImageList(listView, imageList, LVSIL_SMALL);

3つの要素を持つリストビューに、3つのアプリケーションアイテムが含まれるようになりました。

ただし、別のアイコン(この場合)を追加しようとするとIDI_HAND、同じ3つのアイコンが表示されます。

私が抱えているもう1つの問題は、必要な実際のファイルアイコンを取得できないことです。

SHFILEINFO sfi;
SHGetFileInfo (L"C:\\test.txt", NULL, &sfi, sizeof (sfi), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ImageList_AddIcon(imageList, sfi.hIcon);

これにより、必要なアイコンではなく、空のアイコンが表示されますtxt

私はこれまでずっとこれに苦労してきました、そして私はここであなたの助けに大いに感謝します。

アップデート

私はインターネットで見つけたサンプルコードを使用してリストビューを埋めています(明らかにそれは私が望むものではありません):

UINT columnMask = LVCF_TEXT|LVCF_FMT|LVCF_SUBITEM|LVCF_WIDTH;
LVCOLUMN lc[] = {
{ columnMask, 0, 150, L"Text...",0, 0,0,0 },
{ columnMask, LVCFMT_CENTER, 70, L"Number",0, 1,0,0 },
{ columnMask, 0, 100, L"Whatever",0, 2,0,0 },
};

ListView_InsertColumn(listView, 0, &lc[0]);
ListView_InsertColumn(listView, 1, &lc[1]);
ListView_InsertColumn(listView, 2, &lc[2]);

UINT itemMask = LVIF_TEXT;
LVITEM li[] = {
   { itemMask, 0,0, 0,0, L"...for the first item!",0, 0,0,0,0,0,0 },
   { itemMask, 0,1, 0,0, L"1",0, 0,0,0,0,0,0 },
   { itemMask, 0,2, 0,0, L"14 bucks",0, 0,0,0,0,0,0 },
   { itemMask, 1,0, 0,0, L"...for the second item!",0, 0,0,0,0,0,0 },
   { itemMask, 1,1, 0,0, L"24",0, 0,0,0,0,0,0 },
   { itemMask, 1,2, 0,0, L"2 suns",0, 0,0,0,0,0,0 },
   { itemMask, 2,0, 0,0, L"...for the second item!",0, 0,0,0,0,0,0 },
   { itemMask, 2,1, 0,0, L"24",0, 0,0,0,0,0,0 },
   { itemMask, 2,2, 0,0, L"2 suns",0, 0,0,0,0,0,0 },
   { itemMask, 3,0, 0,0, L"...for the second item!",0, 0,0,0,0,0,0 },
   { itemMask, 3,1, 0,0, L"24",0, 0,0,0,0,0,0 },
   { itemMask, 3,2, 0,0, L"2 suns",0, 0,0,0,0,0,0 },
};

// setting an icon like this doesn't work
li[0].iImage = sfi.iIcon;

ListView_InsertItem(listView, &li[0]);
ListView_SetItem(listView, &li[1]);
ListView_SetItem(listView, &li[2]);

ListView_InsertItem(listView, &li[3]);
ListView_SetItem(listView, &li[4]);
ListView_SetItem(listView, &li[5]);

ListView_InsertItem(listView, &li[6]);
ListView_SetItem(listView, &li[7]);
ListView_SetItem(listView, &li[8]);
4

2 に答える 2

3

iImageメンバーLVICONは、に渡したイメージリスト内のアイコンのインデックスですListView_SetImageList。システムイメージリストでアイコンのインデックスを渡しますが、渡したイメージリストListView_SetImageListはプライベートイメージリストです。また

  1. ListView_SetImageListイメージリストをプライベートイメージリストに関連付け、プライベートイメージリストiImageのインデックスに設定するために使用します(からの戻り値ImageList_AddIcon
  2. ListView_SetImageListイメージリストをシステムイメージリストに関連付け、をシステムイメージリストiImageのインデックスに設定するために使用します。
于 2012-05-26T18:28:24.913 に答える
2

2番目の問題については、.extensionのみを渡してみてください。この場合、最初のパラメーターとして.txtを渡してください。これらのフラグは、SHGFI_SYSICONINDEXまたはSHGFI_USEFILEATTRIBUTESまたはSHGFI_SMALLICONまたはSHGFI_ICONであり、戻ったときにsfi.hIconにtxtファイルアイコンのハンドルが含まれている必要があります。

SHGFI_ICONがない場合、SHGetFileInfoはシステムイメージリストのアイコンのインデックスであるsfi.iIconを入力するだけです。SHGFI_ICONを追加することにより、SHGetFileInfoは必要なsfi.hIconも入力します。

リストビューアイテムをどのように追加していますか?LVITEM構造体に入力するコードを表示します。

于 2012-05-26T18:11:48.573 に答える