如何使用图标创建C ++按钮

时间:2012-11-19 20:28:45

标签: c++ winapi visual-studio-2012

我正在尝试制作自定义退出按钮,我已经为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 个答案:

答案 0 :(得分:3)

使用BS_BITMAPBS_ICON按钮样式。创建按钮后,将带有句柄的BM_SETIMAGE消息发送到您的位图或图标。要获取位图或图标的句柄,请使用LoadImage

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

答案 1 :(得分: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成员绘制按钮。在您的情况下,使用LoadBitmap预加载位图,并使用BitBltTransparentBltsource)在DC上绘制位图。或者,您可以使用LoadIconDrawIconExsource)。 DRAWITEMSTRUCT的其他成员可用于选择位图,即按钮的外观,具体取决于当前操作或状态。

答案 2 :(得分:1)

这很棘手......

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

然后,只要重新绘制按钮,按钮(父窗口)的所有者就会收到消息WM_DRAWITEM

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

为了简化工作,Windows函数DrawFrameControl()绘制了几种框架样式,包括标准按钮框架。

答案 3 :(得分: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);

P.S:当CreateWindow()

时,你需要使用 BS_BITMAP 标志