我目前正在编写自己的迷你可视化框架,以便在类中包装纯WinAPI.
目前,分析消息的过程如下:
static Application::Run有一个消息循环; 它获得新消息并将其发送给适当的WndProc.
我创建的所有窗口都是从同一个类创建的(就WinAPI而言),因此WndProc调用它们.实际上,这是一种静态FormAPI::WndProc方法.这个检查消息所引用的窗口并调用它WndProc.
Form::WndProc调用方法,分析消息.假设,这是一个WM_MOUSEMOVE.它打电话ProcessMouseMove然后DefWindowProc.请记住这一点[1].
private Form::ProcessMouseMove从消息中获取实际数据(例如,x,y,shift状态),将其转换为可用数据并调用protected Form::OnMouseMove.
最后,受保护的OnMouseMove检查,是否设置了事件处理程序(即std::function<void(Form *, int, int, ShiftState)>),如果是,则调用处理程序.否则它什么都不做.
我担心的是打电话DefWindowProc.看起来,它只是"为我做默认行为",但有时它实际上做了一些关键的事情.例如,WM_LBTNDOWN通过不调用禁用DefWindowProc将导致无法通过单击[X]按钮关闭窗口.
另一方面,有时候我不想打电话DefWindowProc.例如,如果WM_CLOSE来,我可能决定不关闭申请.DefWindowProc在这种情况下调用DestroyWindow.
我的问题是:我应该打电话DefWindowProc吗?如果是这样,总是或有时候?
Han*_*ant 13
在决定如何处理消息时,您有三个选择:
不调用DefWindowProc().适用于您希望完全自定义消息处理方式而不希望默认实现的情况.WM_COMMAND和WM_PAINT是典型的例子.
做一些自定义的事情,然后调用DefWindowProc().适合您喜欢或需要默认实现.WM_CLOSE是一个典型的例子.
首先调用DefWindowProc(),然后在适当的情况下更改结果.一个典型的例子是WM_NCHITTEST
选择适当的选择没有黄金法则,它在很大程度上取决于特定的消息和窗口的特定默认处理.请注意,如果您是窗口的子类,则这可能不是文档化的默认处理.然而,通常很容易诊断出错.