c++ - 使用或不使用 DefWindowProc

标签 c++ winapi

我目前正在编写自己的迷你可视化框架以将纯 WinAPI 包装在类中。

目前分析消息的流程如下:

  • 静态 Application::Run有一个消息循环;它获取新消息并将其分派(dispatch)到适当的 WndProc。

  • 我创建的所有窗口都是从同一个类创建的(就 WinAPI 而言),所以相同 WndProc正在被调用。实际上,它是一个静态的 FormAPI::WndProc方法。这个检查消息指向哪个窗口并调用它的WndProc .

  • Form::WndProc方法被调用,它分析消息。假设,它是一个 WM_MOUSEMOVE .它调用ProcessMouseMove然后 DefWindowProc .记住这一点作为[1]。

  • 私有(private)Form::ProcessMouseMove从消息中获取实际数据(例如 x、y、移位状态),将其转换为可用数据并调用 protected Form::OnMouseMove .

  • 最后, protected OnMouseMove检查是否设置了事件处理程序(即 std::function<void(Form *, int, int, ShiftState)> ),如果是,则调用处理程序。否则它什么都不做。

我担心的是打电话 DefWindowProc .看起来,它只是“为我做默认行为”,但有时它实际上做了一些关键的事情。例如,禁用 WM_LBTNDOWN不打电话 DefWindowProc将导致无法通过单击 [X] 按钮关闭窗口。

另一方面,有时我不想调用 DefWindowProc .例如,如果 WM_CLOSE来了,我可能会决定不关闭应用程序。 DefWindowProc在这种情况下调用 DestroyWindow .

我的问题是:我应该调用 DefWindowProc 吗?或不?如果是这样,是总是还是只是有时?

最佳答案

在决定如何处理消息时,您有三种选择:

  • 没有调用 DefWindowProc()。当您想要完全自定义处理消息的方式并且不想要默认实现时是合适的。 WM_COMMAND 和 WM_PAINT 是典型的例子。

  • 做一些自定义的事情,然后调用 DefWindowProc()。适用于您喜欢或需要默认实现的情况。 WM_CLOSE 就是一个典型的例子。

  • 首先调用 DefWindowProc(),然后根据需要更改结果。一个典型的例子是 WM_NCHITTEST

选择合适的选项没有黄金法则,这在很大程度上取决于特定消息和窗口的特定默认处理。请注意,如果您正在子类化窗口,这可能不是记录的默认处理。然而,出错通常很容易诊断。

关于c++ - 使用或不使用 DefWindowProc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14500614/

相关文章:

c++ - 在 Windows 中通过 RPC 发送 UDT

c++ - 在 Windows 中使用 C++ 检查用户是否是本地计算机上的管理员

c++ - 如何确保并强制拥有句柄以防止不需要的 CloseHandle 调用?

c++ - 无法在迷宫中追踪灰色细胞

c++ - WINDOWPLACEMENT 的 showCmd...总是 1?

c++ - 仅在 Vista 上的子窗口绘画问题

c++ - Cmake include_directories()

c++ - 编辑后保留文件的旧时间戳

c++ - 由于 undefined symbol 'start_time',MEX 文件无效

c++ - 将多个网格绘制到不同位置 (DirectX 12)