【问题标题】:Use DrawText to update label使用 DrawText 更新标签
【发布时间】:2010-02-22 10:06:52
【问题描述】:

我目前正在用 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?

希望大家能帮帮我。

【问题讨论】:

    标签: c++ winapi gdi


    【解决方案1】:

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

    尝试用 SendMessage(..,WM_SETTEXT,...); 设置文本;

    【讨论】:

    • WM_SETTEXT 对我不起作用,因为由于某种原因,如果文本太长,标签不会显示省略号。
    • 忘掉我刚才说的话,它工作得很好!我只是有一个问题,我想用结束省略号显示两行文本,而 MSDN 说你必须为此使用 DrawText。
    【解决方案2】:

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

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

    • 每当它的更新区域失效时,控件都会重新绘制自己

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

    所以,使用 SetDlgItemText 或 SetWindowText 来设置窗口的文本。

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

    【讨论】:

      【解决方案3】:

      如果您想手动绘制文本,因为设置控制文本不能满足您的要求,那么您需要告诉 Windows 您正在这样做。否则,无论何时需要重绘,控件都会将自己绘制在您所做的任何事情上。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        相关资源
        最近更新 更多