c - 在 WM_MOUSEMOVE 中绘图

标签 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 的优缺点。

最佳答案

除非您有明显的理由不这样做,否则渲染应该始终在 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/

相关文章:

c++ - exe 文件无法启动,因为缺少 libgomp_64-1.dll (Eclipse)

c++ - win32 api c++ 中的 Checkbox Checked 问题

c++ - 在整数数组中查找前 log(n) 或前 sqt(n) 值

c++ - 你怎么能在llvm中打印指令

c - 带字符串数组的 strcpy

windows - 使用 NAnt 在构建脚本中安装/卸载 Windows 服务

windows - 使用通配符查找零字节文件并检查主 BATCH 文件是否已打开

c++ - Win32 resource.hpp 为什么资源 ID 这么高?

c++ - GDI+ 双缓冲 : backbuffer dual-colored monochrome

c++ - Clang 的 -Wall 和 -Wextra 中包含哪些警告?