Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Установка png с alpha каналом на Button


Автор: piritus 26.8.2009, 00:56
Здравствуйте. 
Пробовал на окно установить png с alpha каналом - получилось.
А на кнопку не получается, т.е. прозрачные обласни закрашиваются черным цветом.
Кнопка имеет WS_CHILD, а с ним WS_EX_LAYERED не совмещается.

Подскажите, как установить на кнопку png - изображение с альфа-каналом?

Автор: Andrey44 26.8.2009, 07:06
Цитата(piritus @  26.8.2009,  00:56 Найти цитируемый пост)
Подскажите, как установить на кнопку png - изображение с альфа-каналом?
Покажите как делаете вы.

Автор: piritus 26.8.2009, 08:29
Вобще на асме, но думаю это не столь важно:
Код

        invoke LoadPng,2,addr pngSize
        mov hBitmap,eax
        push pngSize.dWidth
        pop winSize.dWidth
        push pngSize.dHeight
        pop winSize.dHeight

        invoke GetDC,0
        mov hScreenDC,eax
        invoke CreateCompatibleDC,hScreenDC
        mov hMemDC,eax
        invoke SelectObject,eax,hBitmap
        mov hOldBmp,eax
        invoke CreateCompatibleDC,hScreenDC
        mov hMemDC2,eax
        invoke CreateCanvas,hMemDC2,pngSize.dWidth,pngSize.dHeight
        mov hBitmap2,eax
        invoke SelectObject,hMemDC2,hBitmap2
        mov hOldBmp2,eax
                
        invoke SetWindowLong,hWnd,GWL_EXSTYLE,WS_EX_LAYERED
        invoke GetModuleHandle,CTEXT("User32")
        invoke GetProcAddress,eax,CTEXT("UpdateLayeredWindow")
        .if eax==NULL
            invoke MessageBox,hWnd,CTEXT("Couldn't find UpdateLayeredWindow API. You need Windows XP or 2000 to run this program."),0,MB_OK
            invoke SendMessage,hWnd,WM_CLOSE,0,0
        .endif
        mov pUlw,eax
        
        invoke BitBlt,hMemDC2,0,eax,pngSize.dWidth,pngSize.dHeight,hMemDC,0,0,SRCCOPY
;        invoke FadeBitmap,hBitmap2
        
        push ULW_ALPHA
        push offset blender
        push 0
        push offset ptZero
        push hMemDC2
        push offset winSize
        push NULL
        push hScreenDC
        push hWnd
        mov eax,pUlw
        call eax


Автор: Andrey44 26.8.2009, 09:03
Ну по-моему пнг с альфа каналом надо рисовать через GDI+
Или я не прав? smile 

Автор: piritus 26.8.2009, 10:14
Вот пример применения этого кода для диалога без WS_CHILD:
user posted image

а вот с WS_CHILD:
user posted image

Кнопка имеет стиль WS_CHILD и поэтому получается:
user posted image

Там где черная обводка вокруг кнопки, должно быть прозрачно.
Вот. Можно ли для кнопки что-нибудь придумать, что бы как на первой картинке?

Автор: NeoRus 26.8.2009, 13:25
могу ошибаться, но почему бы не вырезать кнопку по региону, обрезав червый цвет ?

Автор: piritus 27.8.2009, 14:09
можно пример?
кнопка может быть еще круглой...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)