2013-11-02 74 views
1

我用C++学习Win API(我是新手)。我遇到了字符/字符串数据类型的问题。从char转换为LPCWSTR

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

今天我遇到这样的问题:

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。但是,没有成功。

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

回答

0

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; 
} 
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代码点。

0
char a[] = "hello"; 

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

LPCWSTR p = wsz;