由龙书的第一章开始
他的代码编译就无法通过,主要是宽字节问题
我把每一个字符串“hello world for example.”
加上一个宏TEXT()
=>
TEXT(“hello world for example.”)
就可以解决这种Unicode的问题,但strcpy(dt.FaceName,"OHFK")这种问题就比较麻烦了
它可能会产生一系列的错误信息,例如:
error C2664: 'strcpy ' : cannot convert parameter 1 from 'WCHAR [32] ' to 'char * '
//
warning 'strcpy' was declared deprecated
replace 'srcpy_s' instead .......................
然后今天,在我想为我的directx测试程序加上字体的时候,
由于曲折离奇的原因,我发现了更便利的解决方法:
Project->*** Properties->Configuration Properties->General->Char set->use Multi-bytes character set
// 项目->属性->配置属性->常规->字符集->使用多字节字符集
这样,就不用考虑Unicode 还是Ascii,W还是A的问题了,直奔主题,做自己打开VS想要做的事。
在这之前,我找到了很多东西:
将字符串改成双字节的 L"黑体"
用'wcscpy'/'wcscpy_s'替换 'strcpy'
最后发现,
龙书的例程
LOGFONT lf; ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 25; // in logical units lf.lfWidth = 12; // in logical units lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold) lf.lfItalic = false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet = DEFAULT_CHARSET; lf.lfOutPrecision = 0; lf.lfClipPrecision = 0; lf.lfQuality = 0; lf.lfPitchAndFamily = 0; strcpy(lf.lfFaceName, "Times New Roman"); // font style // // Create an ID3DXFont based on 'lf'. // if(FAILED(D3DXCreateFontIndirect(Device, &lf, &Font))) { ::MessageBox(0, "D3DXCreateFontIndirect() - FAILED", 0, 0); ::PostQuitMessage(0); }
会出错:
error C2664: 'D3DXCreateFontIndirectA' : cannot convert parameter 2 from 'LOGFONT *__w64 ' to 'const D3DXFONT_DESCA *'
这些代码都没有运行过来检测,悲剧
然后我换成另外一种创建字体的方式,完全正确了:
D3DXCreateFont(Device,50,30,FW_BOLD,1,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,TEXT("System"),&font);
font到一段落。
还有,检测指针是否为空的时候,记得不要写错了
原本我要的是if(font)
写成了 if(!font),粗心大意了,后果很费时。