【问题标题】:DrawStatusText does not draw text on first call, only on subsequent callsDrawStatusText 在第一次调用时不绘制文本,仅在后续调用时绘制
【发布时间】:2019-02-17 15:28:44
【问题描述】:

我有一个程序在WM_PAINT 消息期间使用了DrawStatusTextW() 函数。当它被调用时,不会绘制任何文本。但是,在随后的调用中,例如在任务栏下移动窗口然后将其拉回,文本会被绘制。

我尝试在函数中使用不同的标志,并尝试将其放在WM_CREATE 消息中。没有影响。

   RECT status_rect;
HDC status_dc;

SNDMSG(controls.status_bar, SB_GETRECT, 0, reinterpret_cast<LPARAM>(&status_rect));
status_dc = GetDC(controls.status_bar);
SelectObject(status_dc, status_font);
DrawStatusText(status_dc, &status_rect, L"Ready.", SBT_NOBORDERS);
ReleaseDC(controls.status_bar, status_dc);

它应该在第一次调用时绘制状态文本。我不应该在窗口周围移动,以便它自己重绘。

【问题讨论】:

  • 该代码来自您的WM_PAINT 消息处理程序吗?您没有使用油漆 DC。为什么不呢?
  • 是的。我以为paint dc仅适用于客户区?还是我错了?
  • 如果不在客户区,你在哪里绘制状态栏文本?
  • 客户区是指“窗口”。我认为 BeginPaint 的 hdc 不会包含状态栏和其他控件。我正在状态栏中绘制文本。
  • 状态栏窗口绘制自己的文本。你不需要做任何特别的事情。只需在创建时设置它的文本。

标签: c++ winapi statusbar


【解决方案1】:

每个HWND 处理自己的绘画。如果您在绘制父窗口时在状态栏上进行绘制,则状态栏自己的绘制处理将清除您绘制的内容。

如果您想自定义绘制状态栏,make the status bar be owner drawn 并在其父窗口中处理 WM_DRAWITEM 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2013-09-11
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多