在WM_MOUSEMOVE中绘图

时间:2016-02-11 22:10:07

标签: c windows winapi gdi

美好的一天,

绘制鼠标移动的最佳做法是什么? 在WM_MOUSEMOVE中执行绘图时,我看到很多示例(在MSDN上)。 但我认为更好的方法是全部用WM_PAINT绘制。

示例:

版本1

case WM_MOUSEMOVE:
{
     DummyFunctionForClientCoords();
     DummyFunctionForDrawing();
}
break;

版本2

    case WM_MOUSEMOVE:
    {
         DummyFunctionForClientCoords();
         InvalidateRect(hwnd, &rc, TRUE); /* For sake of simplicity, update region is all area. */
    }
    break;

case WM_PAINT:
    {
         DummyFunctionForDrawing();
    }
    break;

也许这个问题是基于意见的,但我想知道优点和缺点版本1 版本2

1 个答案:

答案 0 :(得分:3)

除非你有明显的理由,否则渲染应始终在WM_PAINT处理程序中执行。如果更新区域非空并且消息队列中没有其他更高优先级的消息,则根据需要生成WM_PAINT消息。这有两个直接后果:

  • 在呈现之前(可能代价很高)处理输入消息。这会产生更具响应性的用户界面。
  • InvalidateRect的多次调用合并为一条WM_PAINT条消息。这降低了渲染的总体成本。

您在第2版下发布的代码可以从系统提供的优化中获益。

版本1 的缺点是,当系统决定生成WM_PAINT消息时,无论它呈现给屏幕的是什么,都会被覆盖。它更浪费,并且可能无法产生预期的结果。


问题中未明确询问,但如果您需要比合并为单个WM_MOUSEMOVE消息的更高精度的鼠标移动事件,则可以调用GetMouseMovePointsEx来获得最多64个前一个(中间)鼠标指针位置。