你好,
绘制鼠标移动的最佳做法是什么? 当在 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
消息。这会产生两个直接后果:
- 在(可能代价高昂的)渲染发生之前处理输入消息。这会带来响应速度更快的用户界面。
- 对
InvalidateRect
的多次调用合并到单个WM_PAINT
消息中。这降低了渲染的总体成本。
您在版本 2 下发布的代码能够从系统提供的优化中获益。
版本 1 的缺点是,当系统决定生成 WM_PAINT
消息时,它呈现在屏幕上的任何内容都将被覆盖。它既更浪费,也可能无法呈现所需的结果。
问题中没有具体询问,但如果您需要比合并到单个
WM_MOUSEMOVE
消息中的鼠标移动事件更精确的鼠标移动事件,您可以调用 GetMouseMovePointsEx获取最多 64 个先前(中间)鼠标指针位置。
关于c - 在 WM_MOUSEMOVE 中绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35351073/