c++ - 使用 GDI+ 的带有 PNG 的按钮

标签 c++ winapi graphics gdi+

我正在尝试将 png 加载到我的按钮,但它没有在我的按钮中显示 png。

我用这个函数创建我的按钮:

HWND MyControls::CreateButton(LPCTSTR text, int x, int y, int w, int h, HMENU id, HWND hwnd, HINSTANCE hInst, bool png){
        if (png){
            return CreateWindow("BUTTON", text, BS_BITMAP | WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                x, y, w, h, hwnd, id, hInst, NULL);
        }
        else{
            return CreateWindow("BUTTON", text, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                x, y, w, h, hwnd, id, hInst, NULL);
        }   
}    

将 PNG 添加到按钮(WM_CREATE):

void MyControls::AddPngBtn(HWND hwnd, const WCHAR* fileName){
    Bitmap bmp(fileName);
    HBITMAP tBmp;
    bmp.GetHBITMAP(Color(0, 0, 0, 0), &tBmp);
    SendMessage(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)tBmp);
    ShowWindow(hwnd, SW_SHOW);
    DeleteObject(tBmp);
}    

以及我如何初始化 GDI+:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(szCmdLine);
    UNREFERENCED_PARAMETER(iCmdShow);

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    if (!Wnd.RegClassEx(hInstance)) return 0;
    if (!Wnd.CreateMyWindow(hInstance)) return 0;

    GdiplusShutdown(gdiplusToken);

    return Wnd.MyMsg();
}    

The LPARAM is not NULL;
My button size: 25x25;
My png size: 24x24;
And i don't have a error in the "Error List".

我应该怎么做,或者我做错了什么?

最佳答案

正如 Jonathan Potter 在评论中指出的那样,STM_SETIMAGE 需要 HBITMAP 才能坚持下去。清理语义是 somewhat convoluted , 但通常不能在 WM_DESTROY 之前调用 DeleteObject

关于c++ - 使用 GDI+ 的带有 PNG 的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663784/

相关文章:

C++11 线程安全的多态性,更简洁

c++ - 获取邻接表中的元素

c++ - 更改过滤器时 GetOpenFileName() 不刷新

c++ - 我可以使用 %p 说明符输出 Windows 句柄吗?

javascript - 从不在矩形中间的点以一定 Angular 查找矩形边界点

algorithm - 是否有一种算法可以就地乘方阵?

c# - Winforms 图形闪烁。 (双缓冲没有帮助!)

c++ - 4x4 矩阵重置缩放?

c++ - 在 24 核 CPU 中增加线程数超过 4 会导致性能下降

c++ - std::function/std::bind 的生命周期管理(在 Windows PostMessage 中传递一个仿函数作为 lparam)