我正在尝试制作自定义退出按钮,我已经为photoshop中的按钮创建了自定义图形。我有这个代码定义的按钮:
button = CreateWindow(L"BUTTON", L"", WS_VISIBLE | WS_CHILDWINDOW, 400, 4, 480, 24, hWnd, button_id, hInstance, NULL);
我想将close.bmp
或close.png
或close.ico
(以最简单的方式)放在按钮上,但是如果没有MFC,我找不到办法。请帮忙!!!
由于
答案 0 :(得分:3)
使用BS_BITMAP
或BS_ICON
按钮样式。创建按钮后,将带有句柄的BM_SETIMAGE
消息发送到您的位图或图标。要获取位图或图标的句柄,请使用LoadImage
。
如果您的图片具有Alpha通道(透明度),请确保将其保存为每像素32位的位图。您可以使用图标,但边缘可能不会那么平滑。
答案 1 :(得分:3)
主要有两种可能性:
如果您只想将位图放在常规按钮上,请创建包含WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP
样式组合的按钮,使用LoadBitmap
加载位图,并通过将其句柄发送到BM_SETIMAGE
消息中的按钮,将加载的位图放在按钮上。
如果您想更改整个按钮的外观,请使用WS_CHILD|WS_VISIBLE|BS_OWNERDRAW
样式组合创建它,然后处理WM_DRAWITEM
消息。将此邮件的lParam
投射到LPDRAWITEMSTRUCT
,并使用其hDC
成员绘制按钮。在您的情况下,使用LoadBitmap
预加载位图,并使用BitBlt
或TransparentBlt
(source)在DC上绘制位图。或者,您可以使用LoadIcon
和DrawIconEx
(source)。 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 标志