Int到LPWSTR函数的问题

时间:2013-05-17 21:07:47

标签: c++ winapi int wchar-t data-conversion

我正在制作一个win32程序,它是一个关卡编辑工具,可以与我为2D图块系统创建的库一起使用。

当用户从菜单中选择地图属性时,我想创建一个显示地图属性的对话框。这意味着从int到wchar_t数组的转换。我已经创建了一个我希望会这样做的功能。但是目前它只返回一个空字符串,返回变量初始化为。此转换对于使用地图属性对话框调用的SetDlgItemText()函数是必要的。

这是我目前的功能:

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;
}

这是从这里打来的:

    case WM_INITDIALOG:
        if (mapToEdit)
        {
            SetDlgItemText(hDlg, IDC_TILE_WIDTH_LBL, IntToLPWSTR(mapToEdit->TileWidth()));
            SetDlgItemText(hDlg, IDC_TILE_HEIGHT_LBL, L"");
            SetDlgItemText(hDlg, IDC_MAP_WIDTH_LBL, L"");
            SetDlgItemText(hDlg, IDC_MAP_HEIGHT_LBL, L"");
        }
        else
        {
            EndDialog(hDlg, LOWORD(wParam));
            MessageBox(hWnd, L"You must create a map first", L"Error", 1);
        }

要编辑的地图只是指向我自己的地图类的指针,该地图类包含我想要显示的属性。最后三次调用SetDlgItemText()将L“”作为字符串传递,目的是它们在工作时也会使用该函数。

2 个答案:

答案 0 :(得分:4)

std::to_wstring更简单,但要指出代码中的问题,您从未创建缓冲区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::wstring,可以动态分配缓冲区LPWSTR ret = new LPWSTR[length];

修改

另外,请记住,您可以将代码简化为以下内容:

std::wstring IntToWstring(int value)
{
    std::wostringstream  convert;

    convert << value;
    convert.str();
}

答案 1 :(得分:0)

您无需花费太多精力将int转换为const wchar_t *。从C ++ 11开始,您可以从那里采用两步法来std::wstringconst wchar_t *

SetDlgItemText(hDlg, IDC_TILE_WIDTH_LBL, std::to_wstring(mapToEdit->TileWidth()).c_str());

当然你可以把它放到一个函数中使它迈出一步,但请记住,当你使用指针时,你不能让std::wstring被破坏。