简体   繁体   中英

Displaying 32 bit image with alpha channel in Win32

Screenshot: http://i.imgur.com/hbExq9N.jpg

Hello, I am trying to set png with alpha channel on top of static control, but transparent pixels always fill white or black color.

It's not critical if the image is on top of the static control or just drawn on main window.

If you have some ideas please give feedback.
THX

Sorry I should have post code before

//First try loading icon with transparency to static control or button:
//static control;

HWND hL;
HICON iStick;
case WM_CREATE:
iStick = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 0, 0, LR_LOADTRANSPARENT);
hL = CreateWindow(L"STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP/*SS_ICON*/, 193, 290, 32, 32, hwnd, NULL, hInst, NULL);
SendMessage(hL, STM_SETIMAGE, IMAGE_ICON, (LPARAM)iStick);
//SendMessage(hL, STM_SETICON, IMAGE_ICON, (LPARAM)iStick);

//Second try to draw on background 32bit bmp A8R8G8B8 : 

PAINTSTRUCT ps;
HDC hdc;
RECT r;
static HDC membit;
static BITMAP bm;

case WM_CREATE:
    SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_TOPMOST | WS_EX_LAYERED);
    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE |SWP_NOSIZE);
    SetLayeredWindowAttributes(hWnd, 0, (255 * 100) / 100, LWA_ALPHA);
    hStick = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP15));
    GetObject(hStick, sizeof(bm), &bm);
    membit = CreateCompatibleDC(hdc);
    SelectObject(membit, hStick);
    ReleaseDC(hWnd, hdc);

case WM_CTLCOLOREDIT:
    SetTextColor((HDC)wParam, RGB(65, 65, 65));      //
    return 0;

//MakeStaticbackground transparent
case WM_CTLCOLORSTATIC:       
    SetBkMode((HDC)wParam, TRANSPARENT);             //  
    SetTextColor((HDC)wParam, RGB(38, 205, 247));    //
    return (BOOL)GetStockObject(NULL_BRUSH);    

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    GetClientRect(hWnd, &r);

    FillRect(hdc, &r, hBrush);
    SetBkMode(hdc, TRANSPARENT);

    BLENDFUNCTION BlendFunction;
    BlendFunction.AlphaFormat = AC_SRC_ALPHA;
    BlendFunction.BlendFlags = 0;
    BlendFunction.BlendOp = AC_SRC_OVER;
    BlendFunction.SourceConstantAlpha = 255;

    //BitBlt(hdc, 500, 280, bm.bmWidth, bm.bmHeight, membit, 0, 0, SRCCOPY);

    AlphaBlend(hdc, 500, 280, bm.bmWidth, bm.bmHeight, membit, 0, 0, 32, 32, BlendFunction);

    //TransparentBlt(hdc, 500, 300, 32, 32, membit, 32, 32, 32, 32, RGB(255, 255, 255));

    EndPaint(hWnd, &ps);

    break;

case WM_ERASEBKGND:
    return (LRESULT)1;

And more which I don`t remember but background pixels always fill white or black colour.

I think you just want transparency, not alpha channel. You would need LWA_COLORKEY instead of LWA_ALPHA

SetLayeredWindowAttributes(hWnd, window_background_brush, 255, LWA_COLORKEY);

This will replace window_background_brush with transparent color. If background brush is not set, you need to set, preferably white color. Also it's better to use icon otherwise you end up with rough edges. Here is sample code for drawing icon:

HDC hDC = ::GetDC(m_hWnd);
HICON hicon = (HICON)LoadImage(NULL, "fullpath.ico", IMAGE_ICON, w, h, LR_LOADFROMFILE);
DrawIconEx(hDC, x, y, hicon, w, h, 0, NULL, DI_NORMAL);
DestroyIcon(hicon);
::ReleaseDC(m_hWnd, hDC);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM