有几件事我不确定:
当您使用 MFC 应用程序向导(我们称之为 TestMfc)创建基本 SDI 时,您将得到:
4个主要类(class):
CTestMfcApp
CTestMfcView
CTestMfcDoc
CMainFrame
我注意到 CTestMfcApp
有这些声明
ON_COMMAND(ID_APP_ABOUT, &CTestMfcApp::OnAppAbout)
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup)
而CTestMfcView
有这些:
BEGIN_MESSAGE_MAP(CTestMfcView, CEditView)
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, &CEditView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CEditView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()
我不明白的是为什么 MFC 要创建这种分离? 我不明白为什么应用程序类需要声明处理事件的函数......这不是 View 的工作吗?例如,如果窗口很少,它甚至会变得更加清晰。
第二,这些事件是如何被调用的?我知道应该有 WINPROC 函数来获取 MSG 并调用正确的处理程序。 ON_COMMAND 是设置某种指针函数的宏,该函数稍后可用于 WINPROC 函数。 为什么 ON_COMMAND 没有获得 WINDOWS 句柄...如果程序中存在另一个具有相同 ID 的 WINDOW?
第三个也是最后一个,假设我想将某些窗口的线程更改为警报状态。 为此,我想更改主循环(它不断调用 getmessage/dispatchmessage 等等并插入 waitformultibleonject 函数。 winmain函数在哪里?当应用程序向导为我完成所有工作时,我找不到它。
谢谢!!
最佳答案
在 MFC 中,消息会“冒泡”直到找到处理程序。 IIRC 它是 View -> 文档 -> 文档模板 -> MainFrame -> 应用程序。这允许处理 View 中特定于 View 的事件、文档中特定于文档的事件等。
通常,全局处理程序最终出现在大型机类中。但是,您可以使用多个大型机窗口 - 即使具有不同的行为 - 其中“MainFrame”和“App class”之间的区别变得很重要。
不过,特定于控件的处理程序确实属于 View 类。我只会将 WM_COMMAND 处理程序放入更高的类中。
对于你的第三个问题:我不会那样做。虽然 MFC 避免了一些常见的模态循环,但您无法避免全部。 OnIdle 是实现延迟更新的好地方。
[更新] MFC 使用一个全局 WNDPROC 来处理所有消息。它使用 HWND 到 CWnd 的映射来定位 MFC 对象。当 WNDPROC 看到 WM_COMMAND 消息时,它将首先检查接收者窗口的消息映射是否包含该消息的处理程序。如果没有,它将进行各种检查,例如“这不只是一个CWnd,还是一个CView吗?”是 --> 获取文档并查看文档消息映射是否具有该特定命令的处理程序。
关于c++ - MFC基本结构题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1958177/