【发布时间】:2013-12-09 09:47:08
【问题描述】:
我尝试了所有来源,通过实现子类化来替换按钮的背景。
当我改变背景时,我得到了一个正方形,无法点击它。 有人可以分享一个好的教程或代码示例吗?
无论如何, 这是我的代码:
LRESULT CALLBACK DrawPushButton(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdcMem;
HBITMAP hbmMem;
HANDLE hnd;
PAINTSTRUCT ps;
HDC hdc;
int win_width=100;
int win_height=50;
switch(uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
hbmMem = CreateCompatibleBitmap(hdc, win_width, win_height);
hnd = SelectObject(hdcMem, hbmMem);
BitBlt(hdc, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
return 0;
break;
}
return CallWindowProc (OldWndProc, hwnd, uMsg, wParam, lParam);
}
编辑: 我在按钮中添加了 BS_OWNERDRAW 窗口样式:
HWND hWndButton=CreateWindowEx(NULL,L"BUTTON",L"OK",WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON|BS_OWNERDRAW,50,220,100,24,hWnd,(HMENU)IDC_MAIN_BUTTON,GetModuleHandle(NULL),NULL);
我更改了回调,但 WM_DRAWITEM 没有调用:
LRESULT CALLBACK DrawPushButton(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_DRAWITEM:
HDC hdc = GetDC(hwnd);
TextOut(hdc,0,0,L"itay",4);
break;
}
return 0;
}
【问题讨论】:
-
要自定义绘制一个按钮,你需要给它
BS_OWNERDRAW窗口样式,然后处理WM_DRAWITEM消息。 -
您认为您不应该删除您正在创建的 DC 和位图每次按钮绘制时?
-
@RemyLebeau 我添加了 BS_OWNERDRAW 但是当我调试程序时,WM_DRAWITEM 没有调用。见我上面的评论。
-
@ItayAvraham: 如果你read the documentation,
WM_DRAWITEM将被发送到按钮的父窗口,而不是按钮的窗口。 -
@ItayAvraham:为什么要费这么大的劲来改变按钮的背景?您可以在没有子类化的情况下实现这一点。在我对this question 的回答中,您可以看到更改按钮背景的所有选项,以及其中一些选项的实现。希望这会对您有所帮助。最好的问候和圣诞结婚。
标签: c++ winapi subclassing wm-paint