wsprintfW 只打印几十个?

Posted

技术标签:

【中文标题】wsprintfW 只打印几十个?【英文标题】:wsprintfW printing only tens? 【发布时间】:2013-04-01 18:26:38 【问题描述】:

我有一个轨迹栏,在某些时候它的值应该会更改文本:

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

        SetWindowText(trackBarValue, (LPCSTR)buf);
    
    break;

trackbar 的范围从 15 到 35。由于某种原因,只有十位被打印到文本中(因为我的 trackbar 的值在 15 和 19 之间,文本是 1,当我的 trackbar 的值在 20 和 29 之间时,我的文本是 2,它变成了 3,因为我的轨迹栏的值在 30 到 35 之间。

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

我该怎么办?

编辑:运行调试器后,我知道 buf 确实是由 trackbar 的值决定的。问题似乎出在 SetWindowText 行上。

编辑:一种解决方案是将 SetWindowText 更改为 SetWindowTextW 并删除 (LPCSTR) 演员表。谢谢大家。

【问题讨论】:

您是否检查过 pos 是否包含整个值,而不仅仅是最左边的数字? 您将宽字符字符串转换为简单字符串,这是错误的。你必须使用WideCharToMultiByte 我明白了,它有效!谢谢! 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

这无济于事......这样做,只有“l”(不是 1)会被打印为文本。 见上面的评论,你需要把你的字符串作为一个 MBCS 传递给 SetWindowText,单纯的转换对你没有帮助

以上是关于wsprintfW 只打印几十个?的主要内容,如果未能解决你的问题,请参考以下文章

sprintf()函数的用法

如何将 va_list 传递给 wsprintfW()?

关于sprintf()

sprintf在C中引领零填充

字符串标记符R“( )“以及sprintf_P打印

使用 sprintf 打印换行符 - 有光泽