Rumah  >  Soal Jawab  >  teks badan

c++ - Win32 API调用TextOut()出现乱码

问题出现在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中文网2765 hari yang lalu651

membalas semua(1)saya akan balas

  • 黄舟

    黄舟2017-04-17 14:28:34

    TextOut 最后一个参数要的是字串的长度,你定义的宏常量是加了 _T 的,如果你选择 UNICODE 字符集编译,对应的字串长必须是以“多少个UNICODE字符”来描述,所以必须是 lstrlen 才能计算正确。

    你用 sizeof 能计算出字节数,一个 UNICODE 字符长度并非1字节,所以你用 sizeof 计算的值会大于实际的 UNICODE 字符数,TextOut 拿到这个错误的长度,就会把字串后面的数据当作字符展示——那就是你看到的乱码。

    另:若你不指定 UNICODE 字符集编译,按 ANSI 编码,1字符刚好等于1字节,展示内容可能是正确的,但 sizeof 计算的依然不是字符数,因为后面还有个 \0,不过这个 \0 本身不可显示,即使多了这1个字节,TextOut 也不会显示乱码。

    balas
    0
  • Batalbalas