我目前正在编写自己的迷你可视化框架来将纯 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
还是不打电话?如果是这样,总是还是有时?