绘图 WM_MOUSEMOVE

Drawing in WM_MOUSEMOVE

美好的一天,

在鼠标移动中绘图的最佳做法是什么? 在 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.

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

  • 输入消息在(可能代价高昂的)呈现发生之前处理。这导致响应更快 UI.
  • InvalidateRect 的多次调用合并为一条 WM_PAINT 消息。这降低了渲染的总体成本。

您在 版本 2 下发布的代码能够从系统提供的优化中获益。

版本 1 的缺点是,当系统决定生成 WM_PAINT 消息时,它呈现在屏幕上的任何内容都将被覆盖。它既更浪费,也可能无法呈现所需的结果。


问题中没有具体询问,但如果您需要比合并到单个 WM_MOUSEMOVE 消息中的鼠标移动事件更精确的鼠标移动事件,您可以调用 GetMouseMovePointsEx 来获取最多 64 个先前(中间)鼠标指针位置。