美好的一天,
绘制鼠标移动的最佳做法是什么? 在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 。
答案 0 :(得分:3)
除非你有明显的理由,否则渲染应始终在WM_PAINT
处理程序中执行。如果更新区域非空并且消息队列中没有其他更高优先级的消息,则根据需要生成WM_PAINT
消息。这有两个直接后果:
InvalidateRect
的多次调用合并为一条WM_PAINT
条消息。这降低了渲染的总体成本。您在第2版下发布的代码可以从系统提供的优化中获益。
版本1 的缺点是,当系统决定生成WM_PAINT
消息时,无论它呈现给屏幕的是什么,都会被覆盖。它更浪费,并且可能无法产生预期的结果。
WM_MOUSEMOVE
消息的更高精度的鼠标移动事件,则可以调用GetMouseMovePointsEx来获得最多64个前一个(中间)鼠标指针位置。