我正在尝试使用子类单选按钮和 WM_PAINT 绘制具有透明背景的单选按钮。我知道如何使用 TransparentBlt 功能和屏幕外(后)缓冲区来做到这一点。
我的问题是,默认情况下,单选按钮最初会绘制一些文本和圆圈(见图 1)。我的 WM_PAINT 消息仅包含 BeginPaint() 和 EndPaint()。当我最小化窗口然后再次激活窗口时,默认文本和圆圈会被您期望的黑色方块替换(参见图 2)。
黄色窗口也使用 WM_PAINT 以相同的方式绘制。
根据自定义绘画和双缓冲的要求,两个过程都为 WM_ERASEBKGND 返回 1,为 WM_PAINT 返回 0。
这是正常行为吗?我通过使用 WS_EX_TRANSPARENT 找到了一个“修复”,但我想首先了解为什么单选按钮最初被画成这样以确定这是否适合我。
提前致谢。
单选按钮创建:
MControlRect rect(0, 0, 100, 20);
unsigned long style = WS_CHILD | BS_AUTORADIOBUTTON;
if (isGroupStarter) {
style += WS_GROUP;
}
::HWND hWnd = _create(pControlParent, WC_BUTTON, style, rect);
::WNDPROC systemProc = (::WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
::SetWindowLong(hWnd, GWL_WNDPROC, (long)customRadiobuttonProcedure);
::SetWindowLong(hWnd, GWL_USERDATA, (long)systemProc);
::UpdateWindow(hWnd);
::ShowWindow(hWnd, SW_SHOW);
单选按钮程序:
switch (msg) {
case WM_ERASEBKGND:
{
return 1;
break;
}
case WM_NCPAINT:
{
return 0;
break;
}
case WM_PAINT:
{
::PAINTSTRUCT ps;
::HDC hdc = ::BeginPaint(hWnd, &ps);
::EndPaint(hWnd, &ps);
return 0;
break;
}
}
::WNDPROC defaultWindowProc = (::WNDPROC)::GetWindowLong(hWnd, GWL_USERDATA);
return ::CallWindowProc(defaultWindowProc, hWnd, msg, wParam, lParam);