从char转换为LPCWSTR

时间:2013-11-02 14:44:46

标签: c++ api

我用C ++学习Win API(我是新手)。我的字符/字符串数据类型有问题。

我也在谷歌阅读其他文档,但仍然不明白。

今天我遇到了这个问题:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rect;
    char MyChar = 0;

    switch (message)
    {
    case WM_CHAR:
        MyChar = LOWORD(wParam);
        MessageBox(hWnd, (LPCWSTR)MyChar, (LPCWSTR)MyChar, MB_OK);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

目的:键入1个字符,messageBox显示它。

我的问题是MyChar是一个字符(8位),我想转换为LPCWSTR。但是,......不成功。

任何人都可以帮助我。提前谢谢!

4 个答案:

答案 0 :(得分:1)

char a[] = "hello";

WCHAR wsz[64];
swprintf(wsz, L"%S", a);

LPCWSTR p = wsz;

答案 1 :(得分:1)

LPCWSTR应该是宽字符数组(wchar_t)的地址,MessageBox()期望该数组以空字符结尾。

然后你可以使用一个包含两个元素的数组,在第二个元素中使用null字符,然后像这样修改第一个

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rect;
    wchar_t myString[2];
    myString[1] = '\0'; // Ensure the second element is the null char

    switch (message)
    {
    case WM_CHAR:
        myString[0] = LOWORD(wParam); // Modify the first element only
        MessageBox(hWnd, myString, myString, MB_OK);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

答案 2 :(得分:0)

使用WM_CHARwParam是UTF-16代码单元 - 因此,您已经可以存储在wchar_t中的值:

wchar_t mystr[2];
mystr[0] = (wchar_t)wParam;
mystr[1] = 0;

MessageBox(hWnd, mystr, mystr, MB_OK);

您可能希望使用WM_UNICHAR,其中wParam是UTF-32代码点。

答案 3 :(得分:0)

您可以执行简单的转换操作,将(char *)转换为(wchar_t *)。

示例:

char text1[] = "My text vector char";
std::string text2 = "My text std::string";

wchar_t * lpcText1 = (wchar_t *) text1;
wchar_t * lpcText2 = (wchar_t *) text2.c_str();