我目前正在用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?
希望大家能帮助我。
答案 0 :(得分:0)
我猜文本已被绘制,但在下一个窗口消息被设置为默认文本。
尝试使用SendMessage(..,WM_SETTEXT,...);
设置文本答案 1 :(得分:0)
使用SetDlgItemText()设置控件的文本。
您正在尝试直接绘制到静态控件的设备上下文中。 这不会那么简单,因为:
只要更新区域无效,控件就会重新绘制
通常控件与父窗口共享设备上下文,因此您在GetDC(...)中获得的实际上是对话框的设备上下文。
因此,使用SetDlgItemText或SetWindowText来设置窗口的文本。
要使用自定义字体(或设置文本/背景颜色),请在WindowProc中处理WM_CTLCOLORSTATIC消息。
答案 2 :(得分:0)
如果您想手动绘制文本,因为设置控件文本不能执行您想要的操作,那么您需要告诉Windows您正在执行此操作。否则,无论何时需要重绘,控件都将自行处理。
要自己绘制,请通过设置SS_OWNERDRAW
样式将控件标记为所有者绘制,然后处理WM_DRAWITEM
消息以在父窗口的窗口过程中绘制它,或者将窗口子类化并在新窗口过程中处理WM_PAINT
消息。