嗨我有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);
}
在我创建带有标签的窗口后,我看到了标签,但是如果我想更改它上面的文字,它就不会改变(我需要手动调整窗口大小,之后它会发生变化)。但是当我以前有彩色背景时,我没有遇到这个问题,例如我的窗口类有这个:
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
部分标签后,我在之前绘制了新文本! see this但在调整主窗口大小后,我的标签变得可读。
答案 0 :(得分:1)
您的代码不会为DrawText()
设置设备上下文的文本前景色,尽管默认为黑色。请参阅SetTextColor()。
SetBkMode(..., TRANSPARENT)
只设置DrawText()
rect的背景颜色/模式,而不是整个窗口。
答案 1 :(得分:0)
您正在询问如何绘制窗口以使其透明,但问题根本不在于绘图。
答案基本上是你到目前为止制作透明窗口所做的一切都是错误的。 看起来就像窗口是透明的一样,但事实上并非如此,正如您在移动窗口和调整窗口大小时所描述的行为中所看到的那样。这是典型的症状。
换句话说,你没有让窗口透明,你刚刚停止绘制背景。你所看到的背景就是窗口首次被绘制时所发生的一切。
您需要创建一个分层窗口。要了解如何制作透明窗口,请访问:
答案 2 :(得分:-1)
您希望文本/检查/标签在父表单上是透明的吗?
您可以添加WS_CLIPSIBLINGS和WS_EX_TRANSPARENT ..
使用SetBkMode(hDC,TRANSPARENT)当WM_PAINT消息
时