在win32 API中将int转换为string

时间:2014-05-04 13:26:56

标签: c++ api winapi

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

在rezult中我收到一个错误:IntelliSense:类型" 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;

2 个答案:

答案 0 :(得分:3)

您正在为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());

答案 1 :(得分:0)

通常你想要的是使用_itoa()的宽字符替代品。在这种情况下,您需要_itow()Reference

所以你这样做:

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之外的每个字符占用四个字符。)

否则,代码直接类似。在使用UTF-16进行编程时,您将很快使用这些宽字符串函数而不是常规字符串函数。