Прозрачные изображения (32bpp) на Toolbar-е
От: unreg_flex  
Дата: 25.11.04 09:27
Оценка:
Эксперты помогите!
Никак не могу заставить WinXP правильно отображать 32-х битные изображения.
Ужо чего только не пробовал!
Она настырно не хочет интерпретировать альфа канал!
Изображения я создавал с помощью FreeHand9 & PhotoShop5.5.
Можно указать прозрачный цвет (1 bit alpha), но в этом случае края выглядят коряво,
а нужно как в explorer'е (8 bit alpha)!
Подскажите что не так plz (четвертый день парюсь)!

Вот мой код:

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

HWND CreateToolbarSimply(
HINSTANCE hInstance,
HWND hwndOwner,
LPTBBUTTON lpButtons,
LPTBRBUTTON lpRButtons,
int nButtons,
int nButtonHeight,
int nButtonWidth) {

HWND hwndToolbar;
HBITMAP hBitmap,hHotBitmap;
HIMAGELIST hImageList,hHotImageList;
int nIndex;


hwndToolbar=CreateWindowEx(
WS_EX_TOOLWINDOW,
TOOLBARCLASSNAME,
NULL,
TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|
CCS_TOP|
WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
0,0,0,0,
hwndOwner,
NULL,
hInstance,
NULL);

SendMessage(
hwndToolbar,
TB_BUTTONSTRUCTSIZE,
(WPARAM)sizeof(TBBUTTON),
0);

SendMessage(
hwndToolbar,
TB_SETMAXTEXTROWS,
1,
0);

SendMessage(
hwndToolbar,
TB_SETBITMAPSIZE,
0,
(LPARAM)MAKELONG((WORD)nButtonWidth,(WORD)nButtonHeight));

SendMessage(
hwndToolbar,
TB_SETBUTTONWIDTH,
0,
(LPARAM)MAKELONG((WORD)nButtonWidth,(WORD)nButtonHeight));

hImageList=ImageList_LoadImage(
hInstance,
(LPCTSTR)lpRButtons->uBitmaps,
nButtonWidth,
0,
0,
IMAGE_BITMAP,
LR_DEFAULTCOLOR|LR_CREATEDIBSECTION);

hHotImageList=ImageList_LoadImage(
hInstance,
(LPCTSTR)lpRButtons->uHotBitmaps,
nButtonWidth,
0,
0,
IMAGE_BITMAP,
LR_DEFAULTCOLOR|LR_CREATEDIBSECTION);

SendMessage(
hwndToolbar,
TB_SETIMAGELIST,
0,(LPARAM)hImageList);

SendMessage(
hwndToolbar,
TB_SETHOTIMAGELIST,
0,(LPARAM)hHotImageList);

SendMessage(
hwndToolbar,
TB_ADDBUTTONS,
(UINT)nButtons,
(LPARAM)lpButtons);

ShowWindow(hwndToolbar,SW_SHOW);

return hwndToolbar;
}

---------------
Re: Прозрачные изображения (32bpp) на Toolbar-е
От: AlexGluharev  
Дата: 25.11.04 12:02
Оценка:
Здравствуйте, unreg_flex, Вы писали:

_>Эксперты помогите!

_>Никак не могу заставить WinXP правильно отображать 32-х битные изображения.
_>Ужо чего только не пробовал!
_>Она настырно не хочет интерпретировать альфа канал!
_>Изображения я создавал с помощью FreeHand9 & PhotoShop5.5.
_>Можно указать прозрачный цвет (1 bit alpha), но в этом случае края выглядят коряво,
_>а нужно как в explorer'е (8 bit alpha)!
_>Подскажите что не так plz (четвертый день парюсь)!


/*  Создаем ImageList */
        iml_ToolBar_n = ImageList_Create (0,0, ILC_COLOR32 | ILC_MASK, NULL, NULL);
    
        /*  Загружаем рисунки ToolBar */
        iml_ToolBar_n = ImageList_LoadImage( hInstDll, /* Здесь изображение */, 0, 0, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION);
        iml_ToolBar_h = ImageList_LoadImage( hInstDll, /* Здесь изображение, когда мышь на кнопке */, 0, 0, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION);
    
        /* Подключаем рисунки */
        SendMessage (hToolBar, TB_SETIMAGELIST,        0, (LPARAM) iml_ToolBar_n);
        SendMessage (hToolBar, TB_SETHOTIMAGELIST,    0, (LPARAM) iml_ToolBar_h);


Я тут свои параметры не убирал, разберёшся надеюсь.
А вообще, пиши на мыло, кину файл справки, там об этом написано.
Re: Прозрачные изображения (32bpp) на Toolbar-е
От: allco Лес http://www.asdevel.com
Дата: 25.11.04 12:49
Оценка:
Здравствуйте, unreg_flex, Вы писали:

_>Эксперты помогите!

_>Никак не могу заставить WinXP правильно отображать 32-х битные изображения.
_>Ужо чего только не пробовал!
_>Она настырно не хочет интерпретировать альфа канал!
_>Изображения я создавал с помощью FreeHand9 & PhotoShop5.5.
_>Можно указать прозрачный цвет (1 bit alpha), но в этом случае края выглядят коряво,
_>а нужно как в explorer'е (8 bit alpha)!
_>Подскажите что не так plz (четвертый день парюсь)!

_>Вот мой код:


_>-------------


_>HWND CreateToolbarSimply(

_> HINSTANCE hInstance,
_> HWND hwndOwner,
_> LPTBBUTTON lpButtons,
_> LPTBRBUTTON lpRButtons,
_> int nButtons,
_> int nButtonHeight,
_> int nButtonWidth) {

_> HWND hwndToolbar;

_> HBITMAP hBitmap,hHotBitmap;
_> HIMAGELIST hImageList,hHotImageList;
_> int nIndex;


_> hwndToolbar=CreateWindowEx(

_> WS_EX_TOOLWINDOW,
_> TOOLBARCLASSNAME,
_> NULL,
_> TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|
_> CCS_TOP|
_> WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
_> 0,0,0,0,
_> hwndOwner,
_> NULL,
_> hInstance,
_> NULL);

_> SendMessage(

_> hwndToolbar,
_> TB_BUTTONSTRUCTSIZE,
_> (WPARAM)sizeof(TBBUTTON),
_> 0);

_> SendMessage(

_> hwndToolbar,
_> TB_SETMAXTEXTROWS,
_> 1,
_> 0);

_> SendMessage(

_> hwndToolbar,
_> TB_SETBITMAPSIZE,
_> 0,
_> (LPARAM)MAKELONG((WORD)nButtonWidth,(WORD)nButtonHeight));

_> SendMessage(

_> hwndToolbar,
_> TB_SETBUTTONWIDTH,
_> 0,
_> (LPARAM)MAKELONG((WORD)nButtonWidth,(WORD)nButtonHeight));

_> hImageList=ImageList_LoadImage(

_> hInstance,
_> (LPCTSTR)lpRButtons->uBitmaps,
_> nButtonWidth,
_> 0,
_> 0,
_> IMAGE_BITMAP,
_> LR_DEFAULTCOLOR|LR_CREATEDIBSECTION);

_> hHotImageList=ImageList_LoadImage(

_> hInstance,
_> (LPCTSTR)lpRButtons->uHotBitmaps,
_> nButtonWidth,
_> 0,
_> 0,
_> IMAGE_BITMAP,
_> LR_DEFAULTCOLOR|LR_CREATEDIBSECTION);

_> SendMessage(

_> hwndToolbar,
_> TB_SETIMAGELIST,
_> 0,(LPARAM)hImageList);

_> SendMessage(

_> hwndToolbar,
_> TB_SETHOTIMAGELIST,
_> 0,(LPARAM)hHotImageList);

_> SendMessage(

_> hwndToolbar,
_> TB_ADDBUTTONS,
_> (UINT)nButtons,
_> (LPARAM)lpButtons);

_> ShowWindow(hwndToolbar,SW_SHOW);


_> return hwndToolbar;

_>}

_>--------------



www.codeproject.com
там есть пример полноцветного тулбара
Re: Прозрачные изображения (32bpp) на Toolbar-е
От: Sergei I. Gorelkin Россия  
Дата: 25.11.04 13:14
Оценка:
Здравствуйте, unreg_flex, Вы писали:

_>Эксперты помогите!

_>Никак не могу заставить WinXP правильно отображать 32-х битные изображения.
_>Ужо чего только не пробовал!
_>Она настырно не хочет интерпретировать альфа канал!
_>Изображения я создавал с помощью FreeHand9 & PhotoShop5.5.

<skipped>

Windows ни при чем — Photoshop 5.5 не умеет сохранять битмапы с 8-битным альфа-каналом...
Нужно либо более старшую версию использовать (7-я умеет), либо сохранять .psd с альфа-каналом и потом
конвертировать ее с помощью, например Gif Movie Gear
Re[2]: Прозрачные изображения (32bpp) на Toolbar-е
От: unreg_flex  
Дата: 25.11.04 14:48
Оценка:
Здравствуйте, AlexGluharev, Вы писали:

AG>Здравствуйте, unreg_flex, Вы писали:


_>>Эксперты помогите!

_>>Никак не могу заставить WinXP правильно отображать 32-х битные изображения.
_>>Ужо чего только не пробовал!
_>>Она настырно не хочет интерпретировать альфа канал!
_>>Изображения я создавал с помощью FreeHand9 & PhotoShop5.5.
_>>Можно указать прозрачный цвет (1 bit alpha), но в этом случае края выглядят коряво,
_>>а нужно как в explorer'е (8 bit alpha)!
_>>Подскажите что не так plz (четвертый день парюсь)!


AG>
AG>/*  Создаем ImageList */
AG>        iml_ToolBar_n = ImageList_Create (0,0, ILC_COLOR32 | ILC_MASK, NULL, NULL);
    
AG>        /*  Загружаем рисунки ToolBar */
AG>        iml_ToolBar_n = ImageList_LoadImage( hInstDll, /* Здесь изображение */, 0, 0, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION);
AG>        iml_ToolBar_h = ImageList_LoadImage( hInstDll, /* Здесь изображение, когда мышь на кнопке */, 0, 0, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION);
    
AG>        /* Подключаем рисунки */
AG>        SendMessage (hToolBar, TB_SETIMAGELIST,        0, (LPARAM) iml_ToolBar_n);
AG>        SendMessage (hToolBar, TB_SETHOTIMAGELIST,    0, (LPARAM) iml_ToolBar_h);
AG>


AG>Я тут свои параметры не убирал, разберёшся надеюсь.

AG>А вообще, пиши на мыло, кину файл справки, там об этом написано.

Я использовал этот код, но результат аналогичный!
XP интерпретирует альфа канал как однобитный
т.е. изображение либо абсолютно прозрачно, либо абсолютно непрозрачно
и правильного смешивания цветов не порисходит.
в результате гробятся края при переходе с прозрачного на непрозрачный!
Изображение которое гружу гарантированно 32bpp с 8bit alpha
причем 0<alpha<255 (проверено по F3)!
Re[2]: Прозрачные изображения (32bpp) на Toolbar-е
От: unreg_flex  
Дата: 25.11.04 15:03
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Здравствуйте, unreg_flex, Вы писали:


_>>Эксперты помогите!

_>>Никак не могу заставить WinXP правильно отображать 32-х битные изображения.
_>>Ужо чего только не пробовал!
_>>Она настырно не хочет интерпретировать альфа канал!
_>>Изображения я создавал с помощью FreeHand9 & PhotoShop5.5.

SIG><skipped>


SIG>Windows ни при чем — Photoshop 5.5 не умеет сохранять битмапы с 8-битным альфа-каналом...

SIG>Нужно либо более старшую версию использовать (7-я умеет), либо сохранять .psd с альфа-каналом и потом
SIG>конвертировать ее с помощью, например Gif Movie Gear

Именно Gif Movie Gear я и пользовался!
Изображения гарантированно 32bpp (проверял по F3)!
Re[3]: Прозрачные изображения (32bpp) на Toolbar-е
От: Штыров Денис Россия  
Дата: 27.11.04 04:29
Оценка:
Здравствуйте, unreg_flex, Вы писали:

[skipped]

_>Я использовал этот код, но результат аналогичный!

_>XP интерпретирует альфа канал как однобитный
_>т.е. изображение либо абсолютно прозрачно, либо абсолютно непрозрачно
_>и правильного смешивания цветов не порисходит.
_>в результате гробятся края при переходе с прозрачного на непрозрачный!
_>Изображение которое гружу гарантированно 32bpp с 8bit alpha
_>причем 0<alpha<255 (проверено по F3)!

Попробуй создавать список изображения простым вызовом ImageList_LoadImage (без ImageList_Create) со следующими параметрами:

HIMAGELIST hImgList = ImageList_LoadImage(_Instance, _Resource, cx, nGrow, crMask, uType, uFlags);

// Для полноцветных изображений:
// crMask - игнорируется
// uType = IMAGE_BITMAP
// uFlags = LR_CREATEDIBSECTION


И на всякий случай создай .manifest для своего проекта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.