关于MFC几点笔记 :: Bordern 随笔
来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=167970 存档链接: https://web.archive.org/web/20040815231226id_/http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=167970
Bordern 随笔 边看、边做、边想、边写 <<<过节啦 | 首页 | 老胡的婚礼>>> 关于MFC几点笔记 时间:2004-05-08 使用MFC Application Wizard生成一个MDI骨干程序时,发现程序运行后,总是自动打开一个ChildFrame,初步排除发现程序确实运行了CDocument::OnNewDocument(),但是程序是从那里得到运行该函数的命令的呢?着实让人摸不清方向。 晚饭时问cai这个问题,cai说记得论坛里有关于这个问题的主题讨论,靠,还不如我自己摸索摸索呢。不过,liusp说改写CWndApp的FileNew()可以解决这个问题,可是我记得CWndApp是没有这个虚函数的啊,哪里来的改写呢。晚饭后追到他实验室让他现场演示一把,结论就是确实可以。只不过,这个方法割断了“新建”菜单命令与处理函数的联系,即导致了“新建”菜单命令也同时失效。可见,CWindApp并没有FileNew()可供改写,此方法表面可行,但是不实用,因为程序终究需要菜单命令来执行命令的,一旦这个联系重新建立后,问题会再次出现。肯定有高手知道实怎么回事的,不过借助工具自己发现问题总归是一条解决问题兼学习的好方法啦。 Debug工具用的又不熟悉--,只好一边调试一边摸索这个工具的使用,感觉调试工具使用熟练了,可以大大提高程序的调试效率的。随着调试工具的熟悉,程序跟踪起来也越来越精确、到位。期中,bingzhang这头猪在msn上非让我请他吃龙虾,倒激起了让他请我吃龙虾的念头,最终证明此人就是一只铁公鸡--。功夫不负有心人这句话真TMD的灵光,最后跟踪到两句以前一直不知道干什么用的语句,把这些语句注释后,解决前面的问题。 BOOL CScribbleApp::InitInstance() { ....... CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo)) return FALSE; ...... } 查了一下msdn,CCommandLineInfo是帮组解析程序启动时的命令行参数的,仔细浏览了它所有的成员,在介绍CCommandLineInfo::m_nShellCommand时,资料上明确指出了默认情况下程序启动时命令行解析语句会指示程序执行“新建”命令,并给出了解决的方法,就是在把处理命令行前,设置参数: cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; 该参数设置要求程序启动时不要执行“新建”命令,也容易见到,原来的默认设置应该是: cmdInfo.m_nShellCommand = CCommandLineInfo::FileNew; 到此,这个问题总算水落石出啦。另外,在MFC 4.2中CCommandLineInfo并非继承自CObject,但是在6.0中已经是继承自它了。不单这一个类,好多类改写后都是继承自CObject了,也就都拥有了动态生成等特点了。再有,Serial函数是在CDocument的open和save方法中被调用的,所以,在我么自己的程序中只需要改写这两个函数,而不需要关心程序where&when调用Serial操作的了。 bordern 发表于 2004-05-08 20:32 引用Trackback(0) | 编辑 评论 发表评论 最后更新 MCI的使用 VC中标注控件属性修改 孤单的暑假 离别的日子 参加同学婚宴 旧地重吃^_^ 首访独一处 再吃散伙饭 第一次吃小尾羊 不属于自己的散伙饭