wsprintfW印刷只有几十?

时间:2013-04-01 18:26:39

标签: c++ winapi

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

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.由于某种原因,只有十位打印到文本上(因为我的轨迹栏值在15到19之间,文本为1,当我的轨迹栏值在20到29之间时,我的文字是2,它变为3,因为我的轨迹栏值在30到35之间。

当然,我希望我的文字显示我的轨迹栏的绝对值,而不仅仅是它的十位!

我该怎么办?

编辑:运行调试器后,我知道buf DOES会按轨迹栏的值变为。问题似乎与SetWindowText行有关。

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

2 个答案:

答案 0 :(得分:2)

您正在将一个宽字符串转换为一个简单的字符串,这是错误的。您必须使用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>

答案 1 :(得分:1)

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