Есть у моей программы в ресурсах иконка большая-пребольшая. Я хочу добавить элемент в treeview с этой иконкой, делаю так: Код (C): Icon=LoadIconW(hInst,L"FILEICON"); int RootIconIndex=ImageList_AddIcon(ImgList,Icon); SendDlgItemMessageW(hDlg,0,TVM_SETIMAGELIST,TVSIL_NORMAL,(LPARAM)ImgList); TVINSERTSTRUCTW tvi; tvi.hParent=TVI_ROOT; tvi.hInsertAfter=TVI_ROOT; ZeroMemory(&tvi.item,sizeof(TVITEMW)); tvi.item.mask=TVIF_TEXT | TVIF_IMAGE; tvi.item.pszText=(LPWSTR)L"Root"; tvi.item.cchTextMax=4; tvi.item.iImage=RootIconIndex; SendDlgItemMessageW(hDlg,0,TVM_INSERTITEMW,0,(LPARAM)&tvi); Но только иконка добавляется на весь treeview, как можно (если можно) добавить элемент с маленькой иконкой имея в ресурсах большую?
Правильным решением здесь будет добавить в ресурсы джве иконки: одну большую-пребольшую 256х256 для того, чтобы программа в проводнике выглядела модно молодежно и вторую маленькую 16х16, чтобы показывать ее в контролах.
Сделал, как советовали оба: Код (C): Icon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(2),IMAGE_ICON,32,32,0);//LoadIcon(hInst,MAKEINTRESOURCE(2)); DirIconIndex=ImageList_AddIcon(ImgList,Icon); SendDlgItemMessageW(hDlg,0,TVM_SETIMAGELIST,TVSIL_NORMAL,(LPARAM)ImgList); TVINSERTSTRUCTW tvi; tvi.hParent=TVI_ROOT; tvi.hInsertAfter=TVI_ROOT; ZeroMemory(&tvi.item,sizeof(TVITEMW)); tvi.item.mask=TVIF_TEXT | TVIF_IMAGE; tvi.item.pszText=(LPWSTR)L"Root"; tvi.item.cchTextMax=4; tvi.item.iImage=DirIconIndex; SendDlgItemMessageW(hDlg,0,TVM_INSERTITEMW,0,(LPARAM)&tvi); Результат не слишком радует:
Ты бы скинул сюда проект где ошибка, так можно много гадать. К примеру как создавался ImageList? Там есть параметры cx и cy, мб ты их выставил неправильно?
Вот собственно вы и ответили на вопрос: нужно было правильный размер в ImageList_Create выставлять. Всем спасибо.
Не буду создавать ещё одну тему, так что напишу здесь. После добавления элемента описанным способом: Код (C): ImgList=ImageList_Create(16,16,ILC_COLOR32,3,0); HICON Icon=LoadIcon(hInst,MAKEINTRESOURCE(0)); FileIconIndex=ImageList_AddIcon(ImgList,Icon); Icon=LoadIcon(hInst,MAKEINTRESOURCE(1)); GrowDirIconIndex=ImageList_AddIcon(ImgList,Icon); Icon=LoadIcon(hInst,MAKEINTRESOURCE(2)); DirIconIndex=ImageList_AddIcon(ImgList,Icon); SendDlgItemMessageW(hDlg,0,TVM_SETIMAGELIST,TVSIL_NORMAL,(LPARAM)ImgList); TVINSERTSTRUCTW tvi; tvi.hParent=TVI_ROOT; tvi.hInsertAfter=TVI_ROOT; ZeroMemory(&tvi.item,sizeof(TVITEMW)); tvi.item.mask=TVIF_TEXT | TVIF_IMAGE; tvi.item.pszText=(LPWSTR)L"Root"; tvi.item.cchTextMax=4; tvi.item.iImage=DirIconIndex; SendDlgItemMessageW(hDlg,0,TVM_INSERTITEMW,0,(LPARAM)&tvi); всё вроде-бы хорошо, но при щелчке по данному элементу его иконка меняется, как этого избежать?
Код (C): tvi.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.item.iImage = tvi.item.iSelectedImage = DirIconIndex; И cchTextMax используется только когда ты запрашиваешь у контрола текст. При сообщениях Add, Set, Insert, etc. это поле игнорируется.