编程中常犯的错误
1.WIN32 API 在消息回调函数中的局部变量定义问题。
对不是临时使用的局部变量要定义成 static 类型,才能在每次消息响应时都能保留值。跨case段的变量,基本上都要声明 static。
2.在CreateWindow执行中会响应WM_CREATE消息,然后CreateWindow函数才返回。在创建窗口时,变量是否被赋值,要注意先后顺序。
3.在C++封装的时候,基类WM_CREATE的消息响应函数中如果包含有必要的初始化,则子类复写的OnCreate函数中要调用基类的OnCreate,否则基类中必要的初始化不会被执行,这个函数也不适合定义成虚函数,如果是虚函数,基类的初始就只能在子类中全部重写。
4. 容器定义的字符串数组,在插入局部字符串变量时,插入的是地址,重复的插入处理,只会得到相同的最后一个数据。
std::vector <TCHAR *> wRes;
TCHAR wBuf[1024];
wRes.push_back(wBuf);
而listView的插入或设置操纵,虽然赋值是地址,插入(设置)操作时却是复制指针所指的内容。
lvColum.pszText = wBuf;
ListView_InsertColumn(m_hListView1,i, &lvColum);
5.windows程序中容易混淆的变量: 对象指针, 窗口句柄。 命名时要有统一并且明显的特征,避免找错。
6. wsprintf 不支持 %f浮点输出格式, 可以用 swprintf 输出 %f
7. 设备接口,比如网络,最好用多线程而不是定时器,避免接口阻塞导致操作界面卡住。
8.全局变量影响代码段的封装性,可以用静态变量,静态成员变量的初始化要注意,和成员函数的样子相似。
9. 用类的静态成员保留数据时要注意,静态变量是被所有实例对象公用的。可以借助GWL_USERDATA
10. 控件的过程回调函数没有WM_CREATE响应,应该是安装回调函数已经是后来的事情了。
11. WM_COMMAND 响应顺序:框架子类,框架父类,View子类,View 父类, 最好不要在框架中定义视图相关的 WM_COMMAND。
编程体会:
1. 尽量把程序段写成函数,以后借用时比较方便复制粘贴。
2. 尽量不要在成员函数里用静态变量,用成员变量更安全。