由龍書的第一章開始
他的代碼編譯就無法通過,主要是寬字節問題
我把每一個字符串“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),粗心大意了,后果很費時。