我目前正在编写自己的迷你可视化框架以将纯 WinAPI 包装在类中。
目前分析消息的流程如下:
静态
Application::Run
有一个消息循环;它获取新消息并将其分派(dispatch)到适当的 WndProc。我创建的所有窗口都是从同一个类创建的(就 WinAPI 而言),所以相同
WndProc
正在被调用。实际上,它是一个静态的FormAPI::WndProc
方法。这个检查消息指向哪个窗口并调用它的WndProc
.Form::WndProc
方法被调用,它分析消息。假设,它是一个WM_MOUSEMOVE
.它调用ProcessMouseMove
然后DefWindowProc
.记住这一点作为[1]。私有(private)
Form::ProcessMouseMove
从消息中获取实际数据(例如 x、y、移位状态),将其转换为可用数据并调用 protectedForm::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/