Int到LPWSTR函数的问题



我正在制作一个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);
        }

Map to edit只是一个指向我自己的Map类的指针,其中包含我想要显示的属性。对SetDlgItemText()的最后三个调用传递L"作为它们的字符串,目的是当函数工作时它们也将使用该函数。

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

将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被销毁。

最新更新