c++ - MFC基本结构题

标签 c++ windows multithreading mfc event-handling

有几件事我不确定:

当您使用 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/

相关文章:

python - 如何在 pyautoit 中带来一个始终出现在背景而不是前景中的窗口?

java - 程序使用过时的(不是当前的)环境变量值

java - MySQL事务回滚异常: Deadlock found when trying to get lock;

c++ - 如何在 C/C++ 中获取磁盘驱动器序列号

c++ - 有趣的 C++ 抽象函数

c++ - 线程设计和设计以及在 C++ Win32 中从另一个线程中调用一个函数

c++ - 设计一个 Vector3D 类

c# - 64 位 .Net 应用程序中的内存限制?

java - 异步任务上的多个notifyObservers()不起作用

c++ - 如何通过非常频繁的读取/非常罕见的写入来同步对全局变量的访问?