如何创建带有图标的C++按钮

How to create a C++ button with an icon

本文关键字:图标 C++ 按钮 何创建 创建      更新时间:2023-10-16

我正在尝试制作一个自定义退出按钮,并且我已经在 photoshop 中为该按钮创建了一个自定义图形。 我有以下代码定义的按钮:

button = CreateWindow(L"BUTTON", L"", WS_VISIBLE | WS_CHILDWINDOW, 400, 4, 480, 24, hWnd, button_id, hInstance, NULL);

我想将close.bmpclose.pngclose.ico(最简单的)放在按钮上,但是如果没有 MFC,我找不到一种方法来做到这一点。 请帮忙!!

谢谢

使用BS_BITMAPBS_ICON按钮样式。 创建按钮后,向其发送一条带有位图或图标句柄的BM_SETIMAGE消息。 若要获取位图或图标的句柄,请使用 LoadImage

如果图像具有 Alpha 通道(透明度),请确保将其另存为每像素 32 位的位图。 您可以使用图标,但边缘可能不会那么平滑。

有两种主要可能性:

  1. 如果只想将位图放在常规按钮上,则使用WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP样式组合创建按钮,使用 LoadBitmap 加载位图,然后通过在BM_SETIMAGE消息中将其句柄发送到按钮来将加载的位图放在按钮上。

  2. 如果要更改整个按钮的外观,请使用WS_CHILD|WS_VISIBLE|BS_OWNERDRAW样式组合创建它,并处理WM_DRAWITEM消息。将此消息的lParam投射到LPDRAWITEMSTRUCT,并使用其hDC成员绘制按钮。在这种情况下,请使用 LoadBitmap 预加载位图,并使用 BitBltTransparentBlt(源)在 DC 上绘制它。或者,您可以使用LoadIconDrawIconEx(源)。DRAWITEMSTRUCT的其他成员可用于选择位图,即按钮的外观,具体取决于当前操作或状态。

很棘手...

最好的选择是使用"所有者绘制"按钮,即样式位BS_OWNERDRAW

然后,每当要重绘按钮时,按钮(父窗口)的所有者将收到消息WM_DRAWITEM

缺点是按钮必须完全绘制,不仅是图标,还有框架、背景、标签(如果需要)、焦点矩形......您必须检查关联的DRAWITEMSTRUCT并确定要绘制的确切样式。

为了简化工作,Windows 函数DrawFrameControl()可以绘制多种样式的框架(包括标准按钮框架)非常有用。

发送BM_SETIMAGE消息,并将加载的图像句柄传递给lParam。

button1 = CreateWindowW(L"BUTTON", L"&Button", WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_BITMAP, 20, 50, 80, 25, hwnd, (HMENU) 600, NULL, NULL);
hImg = LoadImageW(NULL, L"test123.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE | LR_LOADFROMFILE);
SendMessageW(button1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImg);

PS:你需要在创建窗口() 时使用BS_BITMAP标志