1

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

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

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

谢谢

4

4 回答 4

3

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

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

于 2012-11-19T21:14:21.840 回答
3

主要有两种可能性:

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

  2. 如果你想改变整个按钮的外观WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,然后用样式组合创建它,并处理WM_DRAWITEM消息。将此lParam消息的 转换为LPDRAWITEMSTRUCT,并使用其hDC成员绘制按钮。在您的情况下,使用 预加载位图,并使用或( source )LoadBitmap在 DC 上绘制它。或者,您可以使用and ( source )。其他成员可用于选择位图,即按钮的外观,取决于当前的操作或状态。BitBltTransparentBltLoadIconDrawIconExDRAWITEMSTRUCT

于 2012-11-19T21:53:40.293 回答
1

这很棘手...

您最好的选择是使用带有样式位的 Owner-Draw 按钮BS_OWNERDRAW

然后,按钮的所有者(父窗口)将WM_DRAWITEM在按钮被重绘时收到消息。

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

DrawFrameControl()为了简化工作,绘制多种样式的框架(包括标准按钮框架)的 Windows 功能可能很有用。

于 2012-11-19T20:52:07.107 回答
1

发送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: CreateWindow() 时需要使用BS_BITMAP标志

于 2014-01-16T17:02:12.887 回答