3

我用 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

4 回答 4

2

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] = '\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;
}
于 2013-11-02T15:10:37.800 回答
1
char a[] = "hello";

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

LPCWSTR p = wsz;
于 2013-11-02T15:06:43.200 回答
0

使用WM_CHAR,wParam是一个 UTF-16 代码单元——所以,已经是一个可以存储在的值wchar_t

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

MessageBox(hWnd, mystr, mystr, MB_OK);

您可能想改用UTF-32 代码点WM_UNICHAR在哪里。wParam

于 2013-11-02T15:05:26.757 回答
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();
于 2019-09-25T18:23:29.783 回答