一种MFC对话框程序排错的方法
2017-08-30 19:16
204 查看
近日在开发MFC对话框程序时遇到界面卡住无法显示的问题。通过使用一种排查方法,成功解决了这个问题。
具体来说,项目是由Web页面加载OCX控件,OCX控件中创建MFC窗口并显示。此时,Web创建窗口并加载OCX控件,但是加载后MFC窗口并没有完全显示,而是需要把程序窗口最小化,然后再还原才能正常显示。
初步判断该问题为MFC对话框工程中某个窗口创建异常导致。
于是,通过分析该工程框架结构,认清各个窗口之间的关系,从所有窗口的父窗口开始,逐个排查。比如主对话框创建了3个子对话框,就依次把创建3个对话框的代码屏蔽(注释),然后编译生成并运行,查看效果。
通过排查发现,如果把第2个创建窗口的代码屏蔽掉,程序运行后窗口可以正常显示;如果不屏蔽,则窗口无法显示。所以判定出问题的应该是在第2个窗口中。
同理,找到第2个窗口创建子窗口的代码,依次屏蔽掉其子窗口创建的代码,并编译运行,查看效果...最后定位到一个窗口创建的代码。该窗口没有子窗口,把该窗口初始化的代码屏蔽掉,发现仍存在问题。于是通过仔细观察发现,该对话框控件在窗口类中定义了一个自定义控件类型的变量。于是将该变量的定义和相关使用处屏蔽,发现程序可以运行。那么这个问题就定位为该自定义控件类型变量存在问题。经过分析发现,该自定义控件类在构造函数中的代码导致了整个窗口刷新异常。然后通过修改该自定义控件类的构造函数最终解决了窗口刷新异常的问题。
该排除法适合于程序存在异常但无法立即准确定位时,通过逐个排除,最终定位并解决异常。
具体来说,项目是由Web页面加载OCX控件,OCX控件中创建MFC窗口并显示。此时,Web创建窗口并加载OCX控件,但是加载后MFC窗口并没有完全显示,而是需要把程序窗口最小化,然后再还原才能正常显示。
初步判断该问题为MFC对话框工程中某个窗口创建异常导致。
于是,通过分析该工程框架结构,认清各个窗口之间的关系,从所有窗口的父窗口开始,逐个排查。比如主对话框创建了3个子对话框,就依次把创建3个对话框的代码屏蔽(注释),然后编译生成并运行,查看效果。
通过排查发现,如果把第2个创建窗口的代码屏蔽掉,程序运行后窗口可以正常显示;如果不屏蔽,则窗口无法显示。所以判定出问题的应该是在第2个窗口中。
同理,找到第2个窗口创建子窗口的代码,依次屏蔽掉其子窗口创建的代码,并编译运行,查看效果...最后定位到一个窗口创建的代码。该窗口没有子窗口,把该窗口初始化的代码屏蔽掉,发现仍存在问题。于是通过仔细观察发现,该对话框控件在窗口类中定义了一个自定义控件类型的变量。于是将该变量的定义和相关使用处屏蔽,发现程序可以运行。那么这个问题就定位为该自定义控件类型变量存在问题。经过分析发现,该自定义控件类在构造函数中的代码导致了整个窗口刷新异常。然后通过修改该自定义控件类的构造函数最终解决了窗口刷新异常的问题。
该排除法适合于程序存在异常但无法立即准确定位时,通过逐个排除,最终定位并解决异常。
相关文章推荐
- MFC中解决基于对话框程序按下Enter,Esc程序自动退出的方法
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
- 非MFC程序TRACE和ASSERT宏的一种实现方法
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
- MFC 程序内部保存数据的一种方法
- MFC 对话框程序的键盘事件响应方法及与按钮事件的整合
- 基于对话框的MFC程序启动时完全隐藏的简单方法
- 用MFC写对话框形式的DLL并用程序进行调用方法
- 基于对话框的MFC程序中捕捉WM_KEYDOWN消息的方法----PreTranslateMessage(MSG* pMsg) 转帖
- MFC中edit控件中同一程序中对话框间的传值与显示方法
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- [转]VC: 非MFC程序TRACE和ASSERT宏的一种实现方法
- 在一个MFC的对话框应用程序中,实现程序开始时就隐藏对话框界面方法(收集)
- 基于对话框的MFC程序启动时完全隐藏的简单方法
- 5种方式关闭 MFC 对话框程序时,几个主要方法的执行顺序。
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- 在VS2010里MFC对话框中使用OpenGL绘图,添加的控件不显示的一种解决方法
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法