繁体   English   中英

在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个先前(中间)的鼠标指针位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM