c++ - Win32 API调用TextOut()出现乱码
PHP中文网
PHP中文网 2017-04-17 14:26:34
0
1
611

问题出现在WM_PAINT里,具体代码如下:

        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            SelectObject(hdc, GetStockObject(BLACK_PEN));
            SelectObject(hdc, GetStockObject(WHITE_BRUSH));
            //BLOCK是宏定义的常量
            Rectangle(hdc, 0, 0, 25 * BLOCK, 50 * BLOCK);
            TextOut(hdc, 26 * BLOCK, 5 * BLOCK, text1, sizeof(text1));
            TextOut(hdc, 26 * BLOCK, 15 * BLOCK, text2, sizeof(text2));
            EndPaint(hwnd, &ps);
            break;

其中

    const char *text1 = _T("下一个:");
    const char *text2 = _T("得分:");

运行结果如下

原本text1后面也出现上图中的乱码,我把TextOut()最后一个参数的值+1再运行就没了,可是text2用同样方法就不行,把sizeof改为lstrlen就不会出现乱码了,求解其中原因.

PHP中文网
PHP中文网

认证0级讲师

全部回覆(1)
黄舟

TextOut 最後一個參數要的是字符串的長度,你定義的宏常數是加了_T 的,如果你選擇UNICODE 字符集編譯,對應的字符串長必須是以“多少個UNICODE字元」來描述,所以必須是lstrlen 才能計算正確。

你用sizeof 能計算出一個位元組數,一個UNICODE 字元長度並非1位元組,所以你用sizeof 計算的值會大於實際的UNICODE 字元數,TextOut 拿到這個錯誤的長度,就會把字符串後面的資料當作字元展示——那就是你看到的亂碼。

另:若你不指定UNICODE 字符集編譯,按ANSI 編碼,1字符剛好等於1字節,展示內容可能是正確的,但sizeof 計算的依然不是字符數,因為後面還有個

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!