我试图在我的窗口应用程序的客户区显示,例如系统本地小时。
在rezult中我收到一个错误:IntelliSense:类型" CHAR *"的参数与" LPCWSTR"类型的参数不兼容在TextOut函数(参数4)。 有人可以帮帮我吗?
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SYSTEMTIME lt;
GetLocalTime(<);
CHAR info[20] ;
_itoa(lt.wHour,info,16);
TextOut(hdc,200,200,info,strlen(info));
EndPaint(hWnd, &ps);}
break;
答案 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(<);
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进行编程时,您将很快使用这些宽字符串函数而不是常规字符串函数。