c++ - wsprintfW 只打印几十个?

标签 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;

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

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

我该怎么办?

编辑:运行调试器后,我知道 buf 确实变成了 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>

关于c++ - wsprintfW 只打印几十个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15749241/

相关文章:

c++ - 如何将 Rcpp::List 转换为 std::vector<double>

c++ - 如何在 Lua 中手动销毁包装的 C++ 类

java - 旅游网站背后的算法

java - 精准消费时间解决方案

windows - 在我的程序运行时防止 Windows 进入休眠状态?

c++ - 如何将 HRESULT 转换为错误描述?

c++ - 您将如何为对象产生滚动效果?

c++ - 带有 SetParent() 的 WS_EX_LAYERED 不显示窗口

c - 如何从窗口获取 OpenGL 上下文?

windows - 如何在登录时立即执行任务