WinAPI的。 如何重画没有背景的窗口?

您好我有WNDCLASSEX结构有这个数据:

 m_wndClass.cbSize = sizeof(WNDCLASSEX); m_wndClass.style = CS_NOCLOSE; m_wndClass.lpfnWndProc = WndProc; m_wndClass.cbClsExtra = 0; m_wndClass.cbWndExtra = 0; m_wndClass.hInstance = GetModuleHandle(NULL); m_wndClass.hIcon = NULL; m_wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); m_wndClass.hbrBackground = NULL; m_wndClass.lpszMenuName = NULL; m_wndClass.lpszClassName = Checkbox::CHECKBOX_CLASS.c_str(); m_wndClass.hIconSm = NULL; 

我需要有没有背景的窗口,因为我需要在父窗口上绘制文本,文本可能是任何颜色。

绘图工作正常,绘图代码:

 case WM_PAINT: { PAINTSTRUCT ps; HDC dc = BeginPaint(window, &ps); if (!classInfo->m_text.empty()) { HDC wdc = GetDC(window); SetBkMode(wdc,TRANSPARENT); DrawText(wdc, classInfo->m_text.c_str(), -1, &classInfo->m_textRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP); ReleaseDC(window, wdc); } EndPaint(window, &ps); break; } 

不过我有办法改变标签的文字:

 void Checkbox::SetText(const String& text) { m_text = text; SetTextRectSize(); //calculates size of RECT if (m_window != NULL) InvalidateRect(m_window, NULL, TRUE); } 

当我创build带有标签的窗口后,我看到了标签,但是如果我想更改它上面的文本,它不会改变(我需要手动调整窗口大小,然后改变它)。 但是当我以前有过彩色背景的时候,我没有这个问题,例如我的窗口类有这个:

 m_wndClass.hbrBackground = HBRUSH(COLOR_3DFACE+1); 

我想问,如何更新哪个窗口,没有背景。

编辑:我试过一些东西

FillRect(dc, &rect, (HBRUSH)GetStockObject(NULL_BRUSH));

也试图改变窗口程序:

 case WM_CTLCOLORSTATIC: { HDC hdc = (HDC) wp; SetBkMode (hdc, TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH); } 

结果是我在前面画了新的文字,把text放到some longer text部分后变成了corupted! 看到这个,但调整后的主窗口我的标签变得可读。

您的代码不会为DrawText()设置设备上下文的文本前景色,但默认为黑色。 请参阅SetTextColor() 。

SetBkMode(..., TRANSPARENT)只是设置DrawText()矩形的背景颜色/模式,而不是整个窗口。

您正在问如何绘制窗口,使其透明,但问题不在于绘图。

答案基本上就是你所做的所有事情都是错误的。 它看起来像窗口是透明的,但实际上并不是,正如您从移动窗口和调整窗口大小时所描述的行为中所看到的那样。 这是典型的症状。

换句话说,你还没有使窗口透明,你刚刚停止绘制背景。 你所看到的背景就是刚开始画的时候发生的事情。

您需要创建一个分层窗口。 要了解如何制作透明窗口,请点击此处:

你希望文本/检查/标签在父母表单上透明吗?

您可以添加WS_CLIPSIBLINGS和WS_EX_TRANSPARENT ..

使用SetBkMode(hDC,TRANSPARENT)当WM_PAINT消息