在win32 API中将int转换为string

Convert int to string in win32 API

本文关键字:转换 string int 中将 win32 API      更新时间:2023-10-16

我试图在我的窗口应用程序的客户端区域显示,例如一个系统本地小时。

在结果中我得到一个错误:智能感知:类型"CHAR *"的参数与类型"LPCWSTR"的参数在TextOut函数(参数4)不兼容。有人能帮帮我吗?

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
       SYSTEMTIME lt;
       GetLocalTime(&lt);
       CHAR info[20] ;
       _itoa(lt.wHour,info,16);
       TextOut(hdc,200,200,info,strlen(info));
    EndPaint(hWnd, &ps);}
break;

您正在为Unicode编译程序,这意味着对文本进行操作的Win32函数被映射为宽版本。因此,TextOut是一个扩展为TextOutW的宏,并期望使用UTF-16编码的const wchar_t*文本。但是你提供的是8位文本。

一个简单的修复方法是调用TextOut的ANSI版本,即TextOutA

TextOutA(hdc, 200, 200, info, strlen(info));

但从长远来看,你可能会考虑坚持使用本机宽API。这将要求您使用任何文本处理函数的广泛版本。您还可以很好地避免itoa,并开始使用标准的c++方法在文本和整数之间进行转换。

例如,使用c++ 11时,您可以使用std::to_wstring .

std::wstring hour = std::to_wstring(lt.wHour);
TextOut(hdc, 200, 200, hour.c_str(), hour.length());

通常您需要的是使用宽字符替代_itoa()。在本例中,您需要_itow()。参考。

你可以这样写:

case WM_PAINT: {
    hdc = BeginPaint(hWnd, &ps);
    SYSTEMTIME lt;
    GetLocalTime(&lt);
    WCHAR info[20];
    _itow(lt.wHour, info, 16);
    TextOut(hdc, 200, 200, info, wcslen(info));
    EndPaint(hdc, &ps);
}
break;

特别要注意使用WCHAR代替CHAR,使用_itow()代替_itoa(),使用wcslen()代替strlen()

另外,请注意字符串"以字符为单位"的长度(如TextOut()的文档所指出的)和它的"以字节为单位"的长度的区别。在所谓的"Ansi字符串"中,它们是相同的,但在WCHAR字符串中它们是不同的(BMP中的每个字符占用两个字节;BMP之外的每个字符占用4个字符)。

否则,代码是直接类似的。在使用UTF-16编程时,您将及时掌握使用这些宽字符字符串函数而不是常规字符串函数的窍门。