使用DrawText更新标签

时间:2010-02-22 10:06:53

标签: c++ winapi gdi

我目前正在用c ++(没有MFC)编写程序,并希望使用win32 DrawText函数更新标签(win32静态控件)。但是,当我调用该函数时,没有任何内容写入标签。我使用以下代码:

    HDC devCon = ::GetDC(GetDlgItem(IDC_TITLE).m_hWnd);
    RECT rect = {10, 10, 100, 15};
    ::DrawText(devCon, _T("TEST DC TEXT!!!"), -1, &rect, DT_NOCLIP);
    ::ReleaseDC(GetDlgItem(IDC_TITLE).m_hWnd, devCon);

正如你在GetDlgItem(...)中看到的那样,我正在使用ATL,但在我看来这应该不是问题。当我在GetDC方法中指定NULL时,文本将被绘制在屏幕的左上角,因为该方法将DC返回到整个屏幕。 为什么这不适用于标签的DC?

希望大家能帮助我。

3 个答案:

答案 0 :(得分:0)

我猜文本已被绘制,但在下一个窗口消息被设置为默认文本。

尝试使用SendMessage(..,WM_SETTEXT,...);

设置文本

答案 1 :(得分:0)

使用SetDlgItemText()设置控件的文本。

您正在尝试直接绘制到静态控件的设备上下文中。 这不会那么简单,因为:

  • 只要更新区域无效,控件就会重新绘制

  • 通常控件与父窗口共享设备上下文,因此您在GetDC(...)中获得的实际上是对话框的设备上下文。

因此,使用SetDlgItemText或SetWindowText来设置窗口的文本。

要使用自定义字体(或设置文本/背景颜色),请在WindowProc中处理WM_CTLCOLORSTATIC消息。

答案 2 :(得分:0)

如果您想手动绘制文本,因为设置控件文本不能执行您想要的操作,那么您需要告诉Windows您正在执行此操作。否则,无论何时需要重绘,控件都将自行处理。

要自己绘制,请通过设置SS_OWNERDRAW样式将控件标记为所有者绘制,然后处理WM_DRAWITEM消息以在父窗口的窗口过程中绘制它,或者将窗口子类化并在新窗口过程中处理WM_PAINT消息。