我目前正在编写自己的迷你可视化框架来将纯 WinAPI 包装在类中。
目前分析消息的过程如下:
static
Application::Run有一个消息循环;它获取新消息并将其分派给适当的 WndProc。我创建的所有窗口都是从同一个类创建的(就 WinAPI 而言),所以同样
WndProc被调用。实际上,它是一种静态FormAPI::WndProc方法。这一项检查消息所指的窗口并调用它的WndProc.Form::WndProc方法被调用,它分析消息。假设它是一个WM_MOUSEMOVE. 它调用ProcessMouseMove然后DefWindowProc。将此点记为 [1]。private
Form::ProcessMouseMove从消息中获取实际数据(例如 x, y, shift state),将其转换为可用数据并调用 protectedForm::OnMouseMove。最后,protected
OnMouseMove检查是否设置了事件处理程序(即std::function<void(Form *, int, int, ShiftState)>),如果是,它调用处理程序。否则它什么也不做。
我关心的是打电话DefWindowProc。看起来,它只是“为我做默认行为”,但有时它实际上做了一些关键的事情。例如,WM_LBTNDOWN通过不调用禁用DefWindowProc将导致无法通过单击 [X] 按钮关闭窗口。
另一方面,有时我不想打电话DefWindowProc。例如,如果WM_CLOSE来了,我可能决定不关闭应用程序。DefWindowProc在这种情况下调用DestroyWindow.
我的问题是:我应该打电话DefWindowProc还是不打电话?如果是这样,总是还是有时?