分类: C/C++
2008-08-01 16:54:38
现在对问题一(为什么要调用IsDialogMessage?)的回答也同时解决了问题四中的前半部分。
下一个要解决的问题是:MFC如何进行对话框消息的解释?在MFC中使用了一个复杂的虚函数:CWnd::PreTranslateMessage,这个虚函数让任何窗口消息自己进入主消息循环,而不用去修改窗口自身的循环。以下是CDialog::PreTranslateMessage的缺省实现代码:
BOOL CDialog::PreTranslateMessage(MSG* pMsg) { ...... // many lines of intimidating code ...... return PreTranslateInput(pMsg); }换句话说,CDialog还传递消息到另一个虚函数:CWnd::PreTranslateInput
BOOL CWnd::PreTranslateInput(LPMSG lpMsg) { if (/* keyboard or mouse message */) { return IsDialogMessage(lpMsg); } return FALSE; }你可能想到了CWnd::IsDialogMessage实际上是一个用m_hWnd作为HWND参数调用全程::IsDialogMessage的打包函数。这就导致了MFC中每一个对话框解释自己的输入。如果你同时运行五个对话框,每一个对话框的PreTranslateMessage都调用IsDialogMessage-所以说你就不必做什么了。MFC实在是牛啊,你压根就不必去操心IsDialogMessage,它会自己运转良好。 下载本文示例代码