最近在做一个工程的代码优化工作,想整理下遇到的问题,以便日后查找方便。
1.MFC读写配置文件。
读写配置文件主要依赖于两个函数,分别是:WritePrivateProfileString和GetPrivateProfileString,其函数原型分别如下:
1 BOOL WritePrivateProfileString(
2 LPCTSTR lpAppName, // 指向指定字段的字符串
3 LPCTSTR lpKeyName, // 指向指定键的字符串
4 LPCTSTR lpString, // 指向指定值的字符串
5 LPCTSTR lpFileName // 指向文件名称字符串
6 );
1 DWORD GetPrivateProfileString(
2 LPCTSTR lpAppName, //指向指定字段的字符串
3 LPCTSTR lpKeyName, //指向键的字符串
4 LPCTSTR lpDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
5 LPTSTR lpReturnedString, //存放INI文件中值的目的缓存区
6 DWORD nSize, //目的缓冲区的大小,以字节为单位
7 LPCTSTR lpFileName //指向INI文件名称的字符串
8 );
前一个为写入,后一个为读取。实例如下:
WritePrivateProfileString("Pen","pensize","2",inistr+"//default.ini");
和
LPSTR in=new char[100];
GetPrivateProfileString("Pen","pensize","Get didn't work",in,100,inistr+"//default.ini");
需要注意的是:由GetPrivateProfileString读到的in这个变量为LPSTR,其和cstring是可以互转的,强制转换即可。
读到的in为字符串形式,需要转化成最终需要的变量还需要做点工作。
int atoi( const char *string );
这个函数的主要目的就是将cstring转化成int。
2.配置文件中颜色信息的处理
因为项目中有些变量是COLORREF的,这是MFC中的颜色类型,其一般都是以类似RGB(0,0,255)这种形式赋值,如果以这种形式存储读取会很困难。
看了下COLORREF的原型,发现它是个32bit的数据,和int型应该是互通的。例如RGB(0,255,0)就应该是以二进制00000000|00000000|11111111|00000000形式存储,所以其int的值为65280,debug跟踪证实了这个想法。
所以,以RGB(0,255,0)为例,在ini中存储65280,读取时先将字符串转化为int型,再进行COLORREF的强制转化。
3.View类中志向doc类的全局指针
view类中访问doc类有一个现成的函数GetDocument(),想设一个全局指针访问到doc类,但是不知道在哪里进行初始化赋值,写在构造函数里发现程序崩了,因为在构造函数运行时应该还没有函数GetDocument(),查了一番,发现OnCreate函数运行在初始化之后,却提前于其他函数,因此重载OnCreate,搞定!