Научите правильно отображать иконки 32 бита в TreeView. Мои иконки содержат 3 варианта: 32 бита, 265 цв. и 8 цв. Загружаю так: Код (Text): hImageList = ImageList_Create(16, 16, ILC_COLOR32|ILC_MASK, 6, 0); // Добавление в image list hIcon = LoadIcon(hInstance, "Icon1"); ImageList_AddIcon(hImageList, hIcon); DeleteObject(hIcon); // ... SendMessage(hwndTreeView, TVM_SETIMAGELIST, 0, (LPARAM)hImageList); Манифест для 6 версии есть. Получается, что отображается либо 256-цветная версия, либо 32-битная, но alpha-канал залит черным. Пока ничего умнее придумать не могу.
alterego Попробуйте LoadImage вместо LoadIcon. Если не поможет - храните иконки в BMP, а потом LoadBitmap и ImageList_AddMasked.
У меня такой код работает нормально: Код (Text): HIMAGELIST hImageList = ImageList_Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR32, 1, 1); ImageList_AddIcon( hImageList, LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); TreeView_SetImageList( hwndTreeView, hImageList, TVSIL_NORMAL);
Спасибо. Но все равно ничего не выходит. Паникую. Мне кажется, что ошибка в каком-то другом месте. Я смогу разобраться, если увижу чужой полный код. Правда, могу прислать свой сокращенный, но сомневаюсь, что кто-то захочет его копать . Объясню, что у меня получается: Если я ставлю 32-битную картинку первой в иконке, то все нормально - она загружается, но возникает странный эффект (см. 1.bmp. обратите внимание на то, что 1-ая иконка отличается от 2-ой, а 3-яя от 6-ой каким-то затемнением). Если я располагаю иконки наоборот, то загружаются 256-цветные версии (см 2.bmp). Ну не знаю, где лохонулся. 786403486__wasm.pic.zip
3-яя от 6-ой, IMHO, не отличаются, а 1-ая похожа на оверлей, т.е. рисуется иконка и сверху она же как оверлей. См. ImageList_SetOverlayImage и INDEXTOOVERLAYMASK и всё что с этим связано. Для 32-х битных иконок флаг ILC_MASK точно не нужен. "Using 32-Bit Anti-Aliased Icons Windows XP imagelists, which are collections of images used with certain controls such as list-view controls, support the use of 32-bit anti-aliased icons and bitmaps. Color values use 24 bits, and 8 bits are used as an alpha channel on the icons. To create an imagelist that can handle a 32 bits-per-pixel (bpp) image, call the ImageList_Create function passing in an ILC_COLOR32 flag." Порядок иконок в файле и прочую ботву см в статье "Creating Windows XP Icons" в MSDN. Как правильно загружать иконки 32 бита я не знаю, но в WinObjEx я делал так: Код (Text): // // Load object icons // for(int i = 0; i < IMG_ID_MAX; i++) { g_ahObjectIcons[i] = LoadIcon( g_hInstance, (LPCTSTR) (IDI_OBJECTICON_ADAPTER + i) ); } // // Create Image List // if ( IsWindowsXpOrLater() ) { HWND hwndDesktop; HDC hdc; int nBitsPixel; hwndDesktop = GetDesktopWindow(); hdc = GetDC( hwndDesktop ); nBitsPixel = GetDeviceCaps( hdc, BITSPIXEL ); ReleaseDC( hwndDesktop, hdc ); if ( nBitsPixel == 0 || nBitsPixel == 32 ) g_hImageList = ImageList_Create( CX_SMALLICON, CY_SMALLICON, ILC_COLOR32, IMG_ID_MAX, 0 ); else g_hImageList = ImageList_Create( CX_SMALLICON, CY_SMALLICON, ILC_COLOR24 | ILC_MASK, IMG_ID_MAX, 0 ); } else { g_hImageList = ImageList_Create( CX_SMALLICON, CY_SMALLICON, ILC_COLOR24 | ILC_MASK, IMG_ID_MAX, 0 ); } // // Fill image list with icons. // for(int j = 0; j < IMG_ID_MAX; j++) { ImageList_AddIcon( g_hImageList, g_ahObjectIcons[j] ); } TreeView_SetImageList( g_hwndTreeView, g_hImageList, TVSIL_NORMAL ); Определить поддержку иконок с альфа-каналом можно ещё по версии comctl32.dll. Если > 6.00, то альфа-канал поддерживается. Код примерно такой: Код (Text): BOOL bIsComCtl6 = FALSE; HMODULE hComCtlDll = LoadLibrary( "comctl32.dll" ); if ( hComCtlDll ) { typedef HRESULT (CALLBACK *PFNDLLGETVERSION)(DLLVERSIONINFO*); PFNDLLGETVERSION pfnDllGetVersion = (PFNDLLGETVERSION) GetProcAddress( hComCtlDll, "DllGetVersion" ); if ( pfnDllGetVersion ) { DLLVERSIONINFO dvi; ZeroMemory( &dvi, sizeof(dvi) ); dvi.cbSize = sizeof(dvi); HRESULT hRes = (*pfnDllGetVersion)( &dvi ); if ( SUCCEEDED(hRes) && dvi.dwMajorVersion >= 6) { bIsComCtl6 = TRUE; } } FreeLibrary( hComCtlDll ); } if (bIsComCtl6) iBmpDepth = ILC_COLOR32; // 32-bit images are supported else iBmpDepth = ILC_COLOR24;
Нет слов! Спасибо! Я так и думал, что все придется делать программисту, но надеялся, что ImageList сам должен все сделать. Даже не знаю, что такое оверлей. Буду разбираться. ------------------------------------- На последок прикол "Как я раньше проверял то, что нахожусь в XP". Я юзаю тулбары из shell32.dll, и сделал такой код: hLib = LoadLibrary("shell32.dll"); hTbBmp = LoadBitmap(hLib, (LPCTSTR)215); FreeLibrary(hLib); if (hTbBmp){ // XP } else { // не XP (взять тулбар из comctl32.dll и shell32.dll) } Ж-)
Кстати, я крякнул GIF Movie Gear 4, рекламируемый в "Creating Windows XP Icons" в MSDN. Могу объяснить, как сделал.
alterego О том, что ImageList ничего никому не должен, можно почитать в Control Spy - вообще очень хорошие, хоть и устаревшие, статьи по контролам в Win32.
Да, извиняюсь! Переставил иконки как положено ("Creating Windows XP Icons"). С флагом ILC_COLOR32 все равно грузится 256-цветная версия :'<(. Мне кажется, что дело в чем-то другом. Буду грузить .bmp в зависимости от версии. Потом покажу, что получилось. Огромное спасибо всем.