嗨,我有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() rect设置背景颜色/模式,而不是整个窗口。

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

10-11 23:58
查看更多