VC生成SDI时的问题.

Rodgu 2002-08-02 11:14:59
用vc生成一个标准SDI程序,在点菜单的"保存"时,会弹出一个文件对话框.

但我一直没找到弹出对话框的这段代码写在哪了,查IDC_FILE_SAVE,也没有映射到任何方法上,请问这段代码在哪里?程序是如何响应IDC_FILE_SAVE的?
...全文
48 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
锦紫川 2002-08-02
  • 打赏
  • 举报
回复
人们总是VC提供的许多标准化的支持表示困惑。因为原本需要手工做的东西被他自动完成了。但到底自动化到什么程度并不是很清楚。比如ID_FILE_SAVE、ID_FILE_SAVE_AS、ID_HELP、等等vc都提供了标准的的响应支持,我们可以称之为标准消息(Standard Command IDs)当然你可以自己程序中响应这些消息以完成自己特殊需要。一般情况下,他具体由框架结构完成还是由CWinAPP完成我们不需要关心,如果这位朋友一定要把这个ID_FILE_SAVE响应搞清楚,可参阅msdn的CWinApp 相关内容。
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
终于找到了,没想到原来里面如此复杂.
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
好的,我试一下,谢谢
jingyad 2002-08-02
  • 打赏
  • 举报
回复
是这样的:
FrameWnd收到命令后,首先让App处理而App又首先让活动View处理,活动View首先让Document处理,而我们的Doc一般都是从MFC的CDocument派生而来,因此当命令进入到CDocument::OnCmdMsg()中时,CDocument开始查找消息入口,事实上CDocument确实正如我们从上面的文件中看到的存在这个函数的入口,因此执行转向它

你覆盖CMainFrame的OnCmdMsg虚函数
在里面加入下面的行:
if(nID == 0xE103 && nCode != -1 && pExtra == 0) {
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
在if体内设一个断点,选择保存文件到达断点按F11进去看看就都明白了

Rodgu 2002-08-02
  • 打赏
  • 举报
回复
to:sniper81

应该是这样
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
to jingyad()

你这是刚生成的SDI吗?
sniper81 2002-08-02
  • 打赏
  • 举报
回复
那如果在最初应用程序向导建立的SDI程序中不需要“文件”菜单,是不是只要在资源编辑器中删除菜单中的“文件”菜单和对应的文件菜单中的ID、加速键,那些“隐含”的保存、打开之类的消息映射函数也被去掉了?从而可以使生成的文件小一些?
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
可是不管怎样,菜单响应消息这部分在程序里总该能找到吧.

而且它弹出的是CFileDialog对话框,我查询"CFileDialog",在整个工程里都没有找到.
jingyad 2002-08-02
  • 打赏
  • 举报
回复
下面是我查到的MFC源程序:
void CDocument::OnFileSave()
{
DoFileSave();
}

BOOL CDocument::DoFileSave()
{
DWORD dwAttrib = GetFileAttributes(m_strPathName);
if (dwAttrib & FILE_ATTRIBUTE_READONLY)
{
// we do not have read-write access or the file does not (now) exist
if (!DoSave(NULL))
{
TRACE0("Warning: File save with new name failed.\n");
return FALSE;
}
}
else
{
if (!DoSave(m_strPathName))
{
TRACE0("Warning: File save failed.\n");
return FALSE;
}
}
return TRUE;
}
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
To:Jingyad

我查了文档的h和cpp文件了,没有发现对ID_FILE_SAVE等作过什么处理.
jingyad 2002-08-02
  • 打赏
  • 举报
回复
MFC中所有的消息映射其实都是一个静态的数组,每当有命令需要处理时MFC就去这些数组中找对应的处理函数,MFC中有一些类已经包含了一些标准的命令ID和他们的处理函数。

可以在MSDN文档TN022中找到详细的介绍
howtotell 2002-08-02
  • 打赏
  • 举报
回复
ID_FILE_SAVE 可能被宏定义了,当ID是它时就调用文件保存对话框.也可以重载它的.
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
我并不是要添加什么响应函数.

在刚生成标准SDI程序中,你选择菜单中的"保存"时会弹出对话框,我现在就是找不到这个"保存"怎么响应的消息.

jingyad 2002-08-02
  • 打赏
  • 举报
回复
CDocument中对ID_FILE_CLOSE,ID_FILE_SAVE,ID_FILE_SAVEAS都进行了处理。可以参照CDocument的头文件和实现文件。
  • 打赏
  • 举报
回复
你在"ClassView"中选择你的视图类,然后右击鼠标,选择添加windows消息相应函数。然后在"Class or Object to handle"中选择ID_FILE_SAVE,然后在"New windows message"/events中选择"command",然后双击它就可以了。所有的主菜单都是相应WM_COMMAND消息。
Rodgu 2002-08-02
  • 打赏
  • 举报
回复
这个问题不会没人注意到吧?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧