【发布时间】:2021-03-16 22:54:18
【问题描述】:
前言:我有一个 MFC MDI,使用 VS2017 中的向导创建项目...它可以正常工作。
目标:使用 ID_FILE_OPEN 执行正常的文档创建而不修改,但使用相同的 ID 触发我自己的函数并行写入底部的输出选项卡。
所以这就是正在发生的事情。当我从菜单或工具栏按钮中选择文件>打开时,文件打开对话框按预期工作并且文档正常打开。我想要做的是触发我自己的函数,该函数在状态输出窗口选项卡中写入“文件打开过程”的状态消息。我发现,即使在我调试它并调用 open 命令时,即使消息映射使用 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();
}
【问题讨论】:
标签: c++ visual-studio-2017 mfc