总结一下近期code时遇到的几个问题,从小到大说起。
1.VC提供了一中ATL对象RichTextBox,可以很方便的在界面中插入RTF等格式的资源,比如可以插入公式编辑器中的内容等,但是存在一个问题,如果当我们使用了皮肤库(总之造成对话框背景颜色发生变化),变成非系统支持的颜色时,RichTextBox的背景是不可以透明的。自己实现了一个累CMyRichTextBox来实现背景透明。但问题出现了,当将一个RichTextBox对象关联了一个CMyRichTextBox对象时,如果在他之上圈一个Group(注意先后顺序)则不会出错。但如果先放了一个Group,再在它上面放RichTextBox并关联对象,那么RichTextBox就不会显示。
2.代码中我想对一个bool变量比如叫flag赋值为true,不小心写成了flag == true,然后浪费了一个小时调试,粗心大意害死人。
3.在一个对话框类的头文件中定义了一个宏(为了替换基类)
#define CDialog CXTResizeDialog
导致在另一个对话框类,比如叫CTestDlg中关联RadioButton的int类型的成员变量无法初始化也出发赋值,它始终是一个负的很大的数。跟踪调试发现,CTestDlg类居然是CXTResizeDialog的子类(但CTestDlg的头文件中它是派生自CDialog),通过查找#include发现了问题:
CMainFrame.cpp中include了IncidentRayTableDlg.h,也就是包含了上述那个宏;
而这之后CMainFrame.cpp中又include了TestDlg.h;
这就表示,在编译CTestDlg这个类时,CDialog已经被替换成了 CXTResizeDialog ,导致出错。
所以,头文件的包含顺序很重要,切忌不可随意包含。
4.项目的Release版本需要确保在未配置OpenCASCADE开发环境的机器上运行,多次尝试,均出现启动系统的时候Runtime Error。参看晚上的解决方法(如修改环境变量等)都不好使,因为我把我开发它时用的机器上面的与OpenCASCADE有关的环境变量都删了后仍然看可以顺利运行,这说明与环境变量无关。通过在测试机器上不重新编译直接调试Debug版本发现,在文档类的构造函数中,去掉下面几行代码,Release即可运行:
Handle_AIS_Trihedron aTrihedron;
Handle_Geom_Axis2Placement aTrihedronAxis=new Geom_Axis2Placement(gp::XOY());
aTrihedron=new AIS_Trihedron(aTrihedronAxis);
myAISContext->Display(aTrihedron);
这几行代码属于OpenCASCADE开源库,作用是在三维空间产生一个三维坐标参考系的函数。