VC生成SDI时的问题.

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

但我一直没找到弹出对话框的这段代码写在哪了,查IDC_FILE_SAVE,也没有映射到任何方法上,请问这段代码在哪里?程序是如何响应IDC_FILE_SAVE的?
...全文
12 点赞 收藏 16
写回复
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
这个问题不会没人注意到吧?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告