2

嗨,我有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);
}

结果是我在以前绘制了新文本,在设置textsome longer text标签的一部分后被破坏了!看到这个,但是在调整主窗口的大小后,我的标签变得可读了。

4

3 回答 3

1

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

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

于 2013-09-05T02:56:06.767 回答
0

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

答案本质上是,到目前为止,您为制作透明窗口所做的一切都是错误的。看起来窗口是透明的,但实际上并非如此,正如您在移动和调整窗口大小时所描述的行为中所看到的那样。这是典型的症状。

换句话说,您还没有使窗口透明,您只是停止绘制背景。您所看到的背景只是第一次绘制窗口时发生在窗口下方的任何内容。

您需要制作一个分层窗口。要了解如何制作透明窗口,请转到此处:

于 2013-09-06T07:42:44.897 回答
-1

你想让文本/检查/标签在父表单上透明吗?

您可以添加 WS_CLIPSIBLINGS 和 WS_EX_TRANSPARENT..

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

于 2016-06-23T02:09:30.027 回答