使用DrawText更新标签 我目前正在编写一个C++程序,没有MFC,希望用Win32 DRAWTEX函数更新标签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);

使用DrawText更新标签 我目前正在编写一个C++程序,没有MFC,希望用Win32 DRAWTEX函数更新标签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);,c++,winapi,gdi,C++,Winapi,Gdi,正如您看到的GetDlgItem。。。我正在使用ATL,但在我看来这应该不是一个问题。当我在GetDC方法中指定NULL时,文本将按原样绘制在屏幕的左上角,因为该方法将DC返回到整个屏幕。 为什么这不适用于标签的DC 希望你们能帮助我。我猜文本是绘制的,但在下一个窗口消息被设置为默认文本 尝试使用SendMessage..,WM_SETTEXT,…,设置文本 使用SetDlgItemText设置控件的文本 您正试图直接在静态控件的设备上下文上绘制。 这不会这么简单,因为: 每当控件的更新区域无效

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


希望你们能帮助我。

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


尝试使用SendMessage..,WM_SETTEXT,…,设置文本

使用SetDlgItemText设置控件的文本

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

每当控件的更新区域无效时,该控件将重新绘制自身

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

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


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

如果您想手动绘制文本,因为设置控件文本不符合您的要求,则需要告诉Windows您正在这样做。否则,每当需要重新绘制控件时,它都会将自己绘制到您所做的任何操作之上


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

WM_SETTEXT对我不起作用,因为由于某种原因,如果文本的长度与预期的一样长,则标签不会显示省略号。忘了我刚才说的,它工作得很好!我只是有一个问题,我想用结尾省略号显示两行文字,MSDN说你必须使用DrawText。