最近在将一个以前的大项目从VC6升级到VC2005时,也就是VC8时,遇到了一个非常让人困惑的问题,那就是:
在vs2005新建一个sdi文档中的view里的ondraw函数不可以执行pDC->TextOut(5,5,"hello");该语句,编译无法通过。
但该升级的项目程序中包含有大量的类似于pDC->TextOut(x,y,"xxxx");的语句,确没有任何改动,而顺利通过编译。
这是为什么呢?
为了解决这个问题,我特意如下做了一个测试:
1、在vc6下创建了一个sdi文档的程序,并在view中的ondraw函数中增加pDC->TextOut(5,5,"hello");函数,编译运行测试,毫无疑问,是OK的。
2、将改程序直接用VS2005打开,自动升级完毕,ondraw函数中也没有任何改变,单击运行,OK,也是正常的。
3、在VC2005下创建了一个sdi文档的程序,并在view中的ondraw函数中增加以下语句:
pDC->TextOut(5,5,"hello"); //error
pDC->TextOut(5,5,_T("hello")); //ok
pDC->TextOut(5,5,L"hello"); //ok
编译运行测试,结果如注释部分所示。
通过一个下午的摸索,终于我自己也算是部分找到了答案:
VC8默认编译环境为unicode
vc6升级到vc8之后,其环境默认为Use Multi-Byte character set
字符集环境设置:menu->Project->Tmd Properties->Configuartions Properties->Character Set,该选项包含下面3种:
1、No Set
2、Use unicode character set //必须加_T或L对“XXXX”字符串进行转换
3、Use Multi-Byte character set
如果是从升级过来的程序,无论选择1、2、3哪个选项:
pDC->TextOut(5,5,"hello");
均没有任何编译错误。不知道为什么对于选择2,编译器却没有做出错误提示,而是顺利通过???
但是下面的语句:
str.Format("%.2f",2.1);
则无法在选择2的情况下通过,其它1、3则OK。
如果是直接从vs2005创建的程序上面两个语句在选择2的情况下均无法通过编译,加_T("")或者L""之后才OK。如果选择1和3,则亦可以顺利编译通过并正确运行。
呵呵,如果各位高人有更好的答案,欢迎留言补充。