gpt4 book ai didi

c++ - WinAPI。如何重绘没有背景的窗口?

转载 作者:可可西里 更新时间:2023-11-01 10:47:15 24 4
gpt4 key购买 nike

您好,我有 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但是在调整主窗口的大小后,我的标签变得可读了。

最佳答案

您的代码没有为 DrawText() 设置设备上下文的文本前景色,尽管默认值为黑色。参见 SetTextColor() .

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

关于c++ - WinAPI。如何重绘没有背景的窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18608852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com