wsprintfW打印只有几十个

wsprintfW printing only tens?

本文关键字:十个 打印 wsprintfW      更新时间:2023-10-16

我有一个跟踪栏,在某些时候它的值应该改变文本:

case WM_HSCROLL:
    {
        LRESULT pos = SendMessage(trackBar, TBM_GETPOS, 0, 0);
        WCHAR buf[3];
        wsprintfW(buf, L"%ld", pos);
        SetWindowText(trackBarValue, (LPCSTR)buf);
    }
    break;

轨迹条的范围从15到35。由于某些原因,只有十位被打印到文本中(当我的trackbar的值在15到19之间时,文本为1;当我的trackbar的值在20到29之间时,文本为2;当我的trackbar的值在30到35之间时,文本为3)。

当然,我希望我的文本显示我的trackbar的绝对值,而不仅仅是它的十位!

我该怎么办?

编辑:运行调试器后,我知道,但确实成为跟踪栏的值。问题似乎与SetWindowText行有关。

编辑:一个解决方案是将SetWindowText更改为SetWindowTextW并删除(LPCSTR)强制转换。由于人。

您正在将宽字符字符串转换为简单字符串,这是错误的。你必须使用WideCharToMultiByte,像这样:

size_t size = WideCharToMultiByte(CP_ACP, 0, buf, -1, NULL, 0, NULL, NULL);
CHAR *szTo = new CHAR[size];
WideCharToMultiByte(CP_ACP, 0, buf, -1, szTo, size, NULL, NULL);
// don't forget to delete[] szTo

或者,您可以将您的应用程序定义为unicode兼容,因此SetWindowText宏将解析为SetWindowTextW:

#define UNICODE
#define _UNICODE
#include <windows.h>

LRESULT被定义为LONG_PTR,每当PTR出现在名称中时,您应该期望它足够大以容纳指针。指针在32位上是4字节,在64位上是8字节,所以如果编译为64位,LRESULT将不适合long(4字节)。所以使用wsprintfW(buf, L"%llu", pos)