MFC MDI ID_FILE_OPEN 非覆盖,但使用变量作为状态消息

MFC MDI ID_FILE_OPEN Non override, but use the variable for status message

前言:我有一个 MFC MDI,使用 VS2017 中的向导创建项目...它可以正常工作。

目标:使用 ID_FILE_OPEN 执行正常的文档创建而不修改但使用相同的 ID 并行触发我自己的函数写入底部的输出选项卡。

这就是正在发生的事情。当我 select 文件>从菜单或工具栏按钮打开时,文件打开对话框按我预期的方式工作,文档打开正常。我想要做的是启动我自己的函数,该函数在状态输出 window 选项卡中写入“文件打开过程”的状态消息。我发现的是,即使消息映射使用 ID_FILE_OPEN ID 和我的独特功能(它与其他非系统绑定的 ID 一起工作),当我调试它并调用打开命令时,文件对话框打开,但它从未进入我的独特功能,只需将“文件打开过程”字符串写入输出窗格。我在这里阅读了有关覆盖此特定变量的默认处理程序的信息:

https://docs.microsoft.com/en-us/cpp/mfc/reference/cwinapp-class?view=msvc-160#onfileopen

我不想更改它或重写文件打开对话框,因为它已经由框架处理,我想做的就是跟踪 ID_FILE_OPEN 并让它触发我的功能为用户编写状态消息。看来我可以做一个或另一个,但不能同时做两个?所以下面是我的消息映射的样子和我的功能,有没有办法跟踪 ID_FILE_OPEN 这样我就可以让它像我期望的那样做?

留言

在我的 Application.cpp:

我试过了....

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpenMe)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpenMe)
ON_COMMAND(ID_FILE_OPEN, OnFileOpenMe)


BEGIN_MESSAGE_MAP(CApplication, CWinAppEx)
  ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpenMe)  // << This never fires even with &CwinApp
  ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  ON_UPDATE_COMMAND_UI(ID_WINDOW_NEW, DisableNewWindowMenuItem) 
END_MESSAGE_MAP()

Application.cpp 中的状态消息函数可与其他 ID 一起使用,但从未使用 ID_FILE_OPEN ID 从消息映射中调用:

    void CApplication::OnFileOpenMe()
{
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    pMainFrame->m_wndOutput.AddStringStatusTab(_T("File Open Process"));
}

这是Application.h

中的原型
class CApplication : public CWinAppEx
{
protected:
    .......... //More message above omitted 
    afx_msg void DisableNewWindowMenuItem(CCmdUI *ppkCmdUI);
    afx_msg void OnFileOpenMe();
}

好的,我想出了一个更优雅的方法来处理这个问题,同时又不影响解决方案和默认框架。

在这里使用这个post:

我修改了消息映射:

BEGIN_MESSAGE_MAP(CApplication, CWinAppEx)
    ON_COMMAND(ID_FILE_OPEN, OnFileOpen) // Leave active, not used, needed to keep control active to call open
    ON_COMMAND(ID_FILE_BRANCH_OPEN, OnFileBranchOpen)

END_MESSAGE_MAP()

我在所有用于调用 ID_FILE_OPEN 的菜单和按钮中将 ID_FILE_OPEN 上的 ID 更改为 ID_FILE_BRANCH_OPEN。

使用上面列出的线程,我的函数现在看起来像:

void CApplication::OnFileBranchOpen()
{       
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    pMainFrame->m_wndOutput.AddStringStatusTab(_T("File Open Process"));
    AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILE_OPEN, 0); // Open File Open Dialog and load
}

请注意,即使 unused/called,ID_FILE_OPEN 仍保留在消息映射中,我的理解是它在使用我的新菜单 ID 触发时保持框架调用 function/handling 不变打开文件对话框框架调用,同时还按照我的初衷处理我的状态消息。

我希望这对将来的人有所帮助,并在处理系统保留的消息映射时展示一种不同的方式来完成这项工作。

如果我对我所做的任何描述需要澄清,请随时添加您的评论。

感谢阅读。