Как правильно загружать иконки 32 бита?

Тема в разделе "WASM.WIN32", создана пользователем alterego, 29 июл 2005.

  1. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Научите правильно отображать иконки 32 бита в TreeView. Мои иконки содержат 3 варианта: 32 бита, 265 цв. и 8 цв. Загружаю так:


    Код (Text):
    1.     hImageList = ImageList_Create(16, 16, ILC_COLOR32|ILC_MASK, 6, 0);
    2.     // Добавление в image list
    3.     hIcon = LoadIcon(hInstance, "Icon1");        
    4.     ImageList_AddIcon(hImageList, hIcon);  
    5.     DeleteObject(hIcon);
    6.     // ...
    7.     SendMessage(hwndTreeView, TVM_SETIMAGELIST, 0, (LPARAM)hImageList);


    Манифест для 6 версии есть. Получается, что отображается либо 256-цветная версия, либо 32-битная, но alpha-канал залит черным.



    Пока ничего умнее придумать не могу.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    ILC_MASK предполагает использование битмапа-маски. Ты её загружал в Image_List?
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    alterego

    Попробуйте LoadImage вместо LoadIcon. Если не поможет - храните иконки в BMP, а потом LoadBitmap и ImageList_AddMasked.
     
  4. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    В общем ничего у меня хорошего не получилось.
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    У меня такой код работает нормально:


    Код (Text):
    1. HIMAGELIST hImageList = ImageList_Create(
    2.      GetSystemMetrics(SM_CXSMICON),
    3.      GetSystemMetrics(SM_CYSMICON),
    4.      ILC_MASK|ILC_COLOR32, 1, 1);
    5.  
    6. ImageList_AddIcon(
    7.      hImageList,
    8.      LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
    9.  
    10. TreeView_SetImageList(
    11.      hwndTreeView,
    12.      hImageList,
    13.      TVSIL_NORMAL);
     
  6. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Спасибо. Но все равно ничего не выходит. Паникую. Мне кажется, что ошибка в каком-то другом месте.



    Я смогу разобраться, если увижу чужой полный код. Правда, могу прислать свой сокращенный, но сомневаюсь, что кто-то захочет его копать :).



    Объясню, что у меня получается:



    Если я ставлю 32-битную картинку первой в иконке, то все нормально - она загружается, но возникает странный эффект (см. 1.bmp. обратите внимание на то, что 1-ая иконка отличается от 2-ой, а 3-яя от 6-ой каким-то затемнением).



    Если я располагаю иконки наоборот, то загружаются 256-цветные версии (см 2.bmp).



    Ну не знаю, где лохонулся.

    [​IMG] 786403486__wasm.pic.zip
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    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):
    1. //
    2. //  Load object icons
    3. //
    4.  
    5. for(int i = 0; i < IMG_ID_MAX; i++) {
    6.  
    7.     g_ahObjectIcons[i] = LoadIcon( g_hInstance, (LPCTSTR) (IDI_OBJECTICON_ADAPTER + i) );
    8. }
    9.  
    10. //
    11. // Create Image List
    12. //
    13.  
    14. if ( IsWindowsXpOrLater() ) {
    15.  
    16.     HWND    hwndDesktop;
    17.     HDC     hdc;
    18.     int     nBitsPixel;
    19.  
    20.     hwndDesktop = GetDesktopWindow();
    21.     hdc = GetDC( hwndDesktop );
    22.  
    23.     nBitsPixel = GetDeviceCaps( hdc, BITSPIXEL );
    24.     ReleaseDC( hwndDesktop, hdc );
    25.  
    26.     if ( nBitsPixel == 0  ||  nBitsPixel == 32 )
    27.         g_hImageList = ImageList_Create( CX_SMALLICON, CY_SMALLICON, ILC_COLOR32, IMG_ID_MAX, 0 );
    28.     else
    29.         g_hImageList = ImageList_Create( CX_SMALLICON, CY_SMALLICON, ILC_COLOR24 | ILC_MASK, IMG_ID_MAX, 0 );
    30.  
    31. } else {
    32.  
    33.     g_hImageList = ImageList_Create( CX_SMALLICON, CY_SMALLICON, ILC_COLOR24 | ILC_MASK, IMG_ID_MAX, 0 );
    34. }
    35.  
    36. //
    37. // Fill image list with icons.
    38. //
    39.  
    40. for(int j = 0; j < IMG_ID_MAX; j++) {
    41.  
    42.     ImageList_AddIcon( g_hImageList, g_ahObjectIcons[j] );
    43. }
    44.  
    45. TreeView_SetImageList( g_hwndTreeView, g_hImageList, TVSIL_NORMAL );
    46.  




    Определить поддержку иконок с альфа-каналом можно ещё по версии comctl32.dll. Если > 6.00, то альфа-канал поддерживается. Код примерно такой:


    Код (Text):
    1.  
    2. BOOL bIsComCtl6 = FALSE;
    3.  
    4. HMODULE hComCtlDll = LoadLibrary( "comctl32.dll" );
    5.  
    6. if ( hComCtlDll ) {
    7.  
    8.     typedef HRESULT (CALLBACK *PFNDLLGETVERSION)(DLLVERSIONINFO*);
    9.  
    10.     PFNDLLGETVERSION pfnDllGetVersion = (PFNDLLGETVERSION) GetProcAddress( hComCtlDll, "DllGetVersion" );
    11.  
    12.     if ( pfnDllGetVersion ) {
    13.  
    14.         DLLVERSIONINFO dvi;
    15.         ZeroMemory( &dvi, sizeof(dvi) );
    16.         dvi.cbSize = sizeof(dvi);
    17.  
    18.         HRESULT hRes = (*pfnDllGetVersion)( &dvi );
    19.  
    20.         if ( SUCCEEDED(hRes) && dvi.dwMajorVersion >= 6) {
    21.  
    22.             bIsComCtl6 = TRUE;
    23.         }
    24.     }
    25.  
    26.     FreeLibrary( hComCtlDll );
    27. }
    28.  
    29. if (bIsComCtl6)
    30.     iBmpDepth = ILC_COLOR32;  // 32-bit images are supported
    31. else
    32.     iBmpDepth = ILC_COLOR24;
     
  8. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Нет слов! Спасибо!



    Я так и думал, что все придется делать программисту, но надеялся, что ImageList сам должен все сделать.



    Даже не знаю, что такое оверлей. Буду разбираться.



    -------------------------------------

    На последок прикол "Как я раньше проверял то, что нахожусь в XP".

    Я юзаю тулбары из shell32.dll, и сделал такой код:



    hLib = LoadLibrary("shell32.dll");

    hTbBmp = LoadBitmap(hLib, (LPCTSTR)215);

    FreeLibrary(hLib);



    if (hTbBmp){



    // XP



    } else {



    // не XP (взять тулбар из comctl32.dll и shell32.dll)



    }





    Ж-)
     
  9. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Кстати, я крякнул GIF Movie Gear 4, рекламируемый в "Creating Windows XP Icons" в MSDN. Могу объяснить, как сделал.
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    alterego

    О том, что ImageList ничего никому не должен, можно почитать в Control Spy - вообще очень хорошие, хоть и устаревшие, статьи по контролам в Win32.
     
  11. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Да, извиняюсь! Переставил иконки как положено ("Creating Windows XP Icons"). С флагом ILC_COLOR32 все равно грузится 256-цветная версия :'<(. Мне кажется, что дело в чем-то другом. Буду грузить .bmp в зависимости от версии. Потом покажу, что получилось. Огромное спасибо всем.