求助:关于VS2010中VC++ AppWiza的疑惑
最近在学习VisualC++技术内幕第四版,在学习到第19章切分窗口和多视图时遇到一个问题,纠缠了好几天,未能找到答案,请高手予以解答。问题是这样发生的,该书的Ex9b例程是创建一个应用程序,改程序拥有一个文档类和两个视图类,用于显示一首诗,两个视图类共用一个文档类(其中储存了诗的字符串数组),两个文档类分别显示该诗字符串形式和十六进制编码,采用静态切分窗口显示,即在程序运行之初同时显示在主框架的客户区内,两个视图类没有问题。按照书中的创建方法,应用程序由AppWizard创建,创建方法为在AppWizard的第5步应该选中拆分窗口复选框。此时创建的是由视图菜单“视图-拆分窗口”菜单控制的动态拆分窗口,然后将CMainFrame的OnCreateClient函数用下面的代码替换原代码:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
/*return m_wndSplitter.Create(this,
2, 2, // TODO: 调整行数和列数
CSize(10, 10), // TODO: 调整最小窗格大小
pContext);*/
CRect rcClient;
GetClientRect(&rcClient);
VERIFY(m_wndSplitter.CreateStatic(this,2,1));
VERIFY(m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CStringView),CSize(100,rcClient.bottom/2),pContext));
VERIFY(m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CHexView),CSize(100,rcClient.bottom/2),pContext));
return TRUE;
}
即成为静态切分窗口。但是我在创建程序时不小心,忘了在AppWizard第5步选中“拆分窗口”复选框,因此在应用程序框架创建后手工在MainFrm.h头文件中添加了“protected:
CSplitterWnd m_wndSplitter;”成员和“public:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);”成员函数的声明。并在MainFrm.cpp实现文件中按照上述代码添加了OnCreateClient成员函数的代码,然后对程序进行调试,奇怪的是,该程序出现运行时错误,对错误进行跟踪发现,错误是由视图类的基类CScrollView::OnPrepareDC引起的,引发错误的原因是在该函数中未设置映射模式,而我明明在两个视图类的OnInitialUpdate中度设置过映射模式。而且在出错提示对话框中若一直选择“继续”,程序还可以正常运行。最奇怪的时在VS“生成-配置管理器”将生成模式设置为Release后,不再出现错误,程序能够正常运行。
经过长时间的分析,找不出原因后,我还是按照书中的步骤,老老实实地在AppWizard中选择“拆分窗口”复选框,并按照书中的方法修改代码,再次对程序进行调试,发现此时不管是生成Debug版本还是Release版本,程序都可以正常运行,不再出现报错,不知道这是为什么,请高手能够指点迷津,不胜感谢。