gpt4 book ai didi

c++ - MFC基本结构题

转载 作者:可可西里 更新时间:2023-11-01 10:30:29 25 4
gpt4 key购买 nike

有几件事我不确定:

当您使用 MFC 应用程序向导(我们称之为 TestMfc)创建基本 SDI 时,您会得到:

4大类:

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 是实现延迟更新的好地方。


[update] MFC 使用一个全局 WNDPROC 来处理所有消息。它使用 HWND 到 CWnd 的映射来定位 MFC 对象。当 WNDPROC 看到 WM_COMMAND 消息时,它将首先检查接收窗口的消息映射,如果它包含该消息的处理程序。如果没有,它将进行各种检查,例如“这不仅仅是一个CWnd,还是一个CView?”是 --> 获取文档并查看文档消息映射是否具有此特定命令的处理程序。

关于c++ - MFC基本结构题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1958177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com