2012-05-26 62 views
0

我想爲列表視圖創建一個HIMAGELIST。它實際上需要由文件圖標組成。試圖創建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); 

有三個元素現在有三個應用項目的列表視圖。

但是,當我嘗試添加另一個圖標(在這種情況下爲IDI_HAND)時,我仍然得到相同的3個圖標。

另一個問題我已經是我無法獲取我需要實際的文件圖標:

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

這導致空的圖標,而不是txt圖標我想要的。

我一直在爲此而苦苦掙扎,我非常感謝您的幫助。

UPDATE

我使用的示例代碼我在互聯網上發現,填補了列表視圖(顯然這不是我想要的):

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]); 
+1

(1)請提供更多關於「我仍然擁有相同的3個圖標」的信息。你的代碼中沒有任何地方會嘗試使用你添加的任何圖標。 (2)如果你通過'SHGFI_SYSICONINDEX',那麼你就說「我不想要'hIcon',我只對'iIcon'感興趣。」既然你想要'hIcon',你就不應該通過這個標誌。 –

+0

@雷蒙德,我已經更新了我的問題。我通過'ListView_InsertItem'將這些項添加到列表視圖中。我用'ListView_SetImageList(listView,imageList,LVSIL_SMALL)設置圖像列表;' – Alex

回答

3

iImageLVICON的成員是您傳遞給ListView_SetImageList的圖像列表中的圖標索引。您正在傳遞系統圖像列表中圖標的索引,但您傳遞給ListView_SetImageList的圖像列表是您的私人圖像列表。無論是

  1. 使用ListView_SetImageList到ImageList與您的私人圖像列表相關聯,並設置iImage到索引中您的私人圖像列表(從ImageList_AddIcon返回值)
  2. 使用ListView_SetImageList到ImageList與系統圖像列表相關聯,並將iImage設置爲系統圖像列表中的索引。
+0

您是不是指「LVIEM的iImage會員」? – Alex

+0

我很抱歉,我很困惑。一旦我調用ListView_SetImageList,我將我的圖像列表分配給列表視圖。它只有一個圖像,它出現在列表視圖的所有項目中。添加第二個圖像什麼都不做。我試圖將LVITEM的iImage值設置爲來自'ImageList_AddIcon'的返回值,但是什麼也沒有。我所得到的是添加到列表中的第一個圖像乘以行數。 – Alex

+0

您沒有設置LVIF_IMAGE來表示您要設置圖像。 –

2

對於你的第二個問題,嘗試通過只是。擴展名,你的情況通過.TXT作爲第一個參數,而這些標誌:SHGFI_SYSICONINDEX或SHGFI_USEFILEATTRIBUTES或SHGFI_SMALLICON或SHGFI_ICON和回報,sfi.hIcon應包含txt文件圖標的手柄

如果沒有SHGFI_ICON,SHGetFileInfo只是填入sfi.iIcon,它是系統圖像列表中圖標的索引,通過添加SHGFI_ICON,SHGetFileInfo也會填充你想要的sfi.hIcon。

你如何添加列表視圖項?在填充LVITEM結構的地方顯示代碼。

+0

感謝您的擴展提示!現在我確實得到了我需要的圖標。我已經爲該問題添加了代碼。 – Alex

相關問題