C++ Int到LPWSTR函数的问题
我正在制作一个win32程序,它是一个级别编辑工具,与我为2D平铺系统创建的库一起使用 我想创建一个对话框,当用户从菜单中选择时显示地图属性。这意味着从int到wchar\t数组的转换。我已经创建了一个函数,我希望它能做到这一点。但是,当前它只返回返回返回变量初始化为的空白字符串。使用“映射属性”对话框调用的SetDlgItemText()函数时,需要进行此转换 以下是我目前拥有的功能:C++ Int到LPWSTR函数的问题,c++,winapi,int,wchar-t,data-conversion,C++,Winapi,Int,Wchar T,Data Conversion,我正在制作一个win32程序,它是一个级别编辑工具,与我为2D平铺系统创建的库一起使用 我想创建一个对话框,当用户从菜单中选择时显示地图属性。这意味着从int到wchar\t数组的转换。我已经创建了一个函数,我希望它能做到这一点。但是,当前它只返回返回返回变量初始化为的空白字符串。使用“映射属性”对话框调用的SetDlgItemText()函数时,需要进行此转换 以下是我目前拥有的功能: LPWSTR IntToLPWSTR(int value) { std::ostringstream
LPWSTR IntToLPWSTR(int value)
{
std::ostringstream convert;
std::string out;
convert << value;
out = convert.str();
const char* in;
in = out.c_str();
LPWSTR ret = L"";
MultiByteToWideChar(CP_ACP, MB_COMPOSITE, in, strlen(in), ret, wcslen(ret));
return ret;
}
要编辑的映射只是指向我自己的映射类的指针,该类包含我要显示的属性。下面三个对SetDlgItemText()的调用将L“”作为字符串传递,目的是在函数运行时也使用该函数。将int转换为
常量wchar\t*
无需花费大量精力。从C++11开始,您可以采取两步方法来实现std::wstring
和const wchar\u t*
:
SetDlgItemText(hDlg, IDC_TILE_WIDTH_LBL, std::to_wstring(mapToEdit->TileWidth()).c_str());
当然,您可以将其放入一个函数中,使其成为一个步骤,但请记住,在使用指针时,您不能让
std::wstring
被破坏。您无需花费大量精力将int转换为常量wchar\t*
。从C++11开始,您可以采取两步方法来实现std::wstring
和const wchar\u t*
:
SetDlgItemText(hDlg, IDC_TILE_WIDTH_LBL, std::to_wstring(mapToEdit->TileWidth()).c_str());
当然,您可以将其放入函数中,使其成为一个步骤,但请记住,在使用指针时,您不能让
std::wstring
被破坏。std::towstring
更简单,但要指出代码中的问题,您从未创建过缓冲区<代码>LPWSTR ret=L“”使ret
成为指向静态内存中保存的数组的指针。无法修改此数组
下面是使用std::wstring
作为缓冲区修复代码的一种方法:
std::wstring IntToWstring(int value)
{
std::ostringstream convert;
std::string out;
convert << value;
out = convert.str();
std::wstring ret;
// Find proper length
int length = MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), nullptr, 0);
ret.resize(length);
// Probably should also check for errors (got rid of MB_COMPOSITE flag)
MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), &ret[0], length);
return ret;
}
std::towstring
更简单,但要指出代码中的问题,您从未创建过缓冲区<代码>LPWSTR ret=L“”使ret
成为指向静态内存中保存的数组的指针。无法修改此数组
下面是使用std::wstring
作为缓冲区修复代码的一种方法:
std::wstring IntToWstring(int value)
{
std::ostringstream convert;
std::string out;
convert << value;
out = convert.str();
std::wstring ret;
// Find proper length
int length = MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), nullptr, 0);
ret.resize(length);
// Probably should also check for errors (got rid of MB_COMPOSITE flag)
MultiByteToWideChar(CP_ACP, 0, out.c_str(), out.length(), &ret[0], length);
return ret;
}
谢谢,我想可能有一个函数,但在搜索msdn时在中看不到它。谢谢,我想可能有一个函数,但在搜索msdn时在中看不到它。啊,我看到了,但从来没有对它发表过评论。如果
std::to_wstring
有效,这里显然会使用C++11,但我要指出的是,使用std::wstring
作为缓冲区仅在C++11中是可靠的。@chris:另外,我不知道为什么我以前没有想到它,但是OP也可以使用std::wostringstream
。我想没有人真的被教导说,std::cout
和其他东西不是唯一的,或者你实际上可以使用任何你想要的字符类型。我知道我不是。谢谢所有的信息,以前从来没有真正的用宽字符串,它可能显示:有用的是,知道STD::ToWWStin只使用C++ 11编译器可靠。我会记住这一点,并使用std::wostringstream创建函数。啊,我看到了这一点,但实际上从未对此发表过评论。如果std::to_wstring
有效,这里显然会使用C++11,但我要指出的是,使用std::wstring
作为缓冲区仅在C++11中是可靠的。@chris:另外,我不知道为什么我以前没有想到它,但是OP也可以使用std::wostringstream
。我想没有人真的被教导说,std::cout
和其他东西不是唯一的,或者你实际上可以使用任何你想要的字符类型。我知道我不是。谢谢所有的信息,以前从来没有真正的用宽字符串,它可能显示:有用的是,知道STD::ToWWStin只使用C++ 11编译器可靠。我将记住这一点,并使用std::wostringstream创建函数。