从字符转换为 LPCWSTR

convert from char to LPCWSTR

本文关键字:LPCWSTR 转换 字符      更新时间:2023-10-16

我用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 个字符和消息框显示它。

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

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

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

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

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] = ''; // 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;
}
char a[] = "hello";
WCHAR wsz[64];
swprintf(wsz, L"%S", a);
LPCWSTR p = wsz;

对于 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 码位。

您可以执行简单的转换操作,将 (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();