none
Win32 API 问题请教。 RRS feed

  • 问题

  • 源程序:

    int WINAPI wWinMain( ...... )
    {
        static WCHAR    szAppName[] = L"Hello Windows!";
        WNDCLASSW    wndclass;

        ......

        if (!RegisterClassW(&wndclass))
        {

        ......

        }

        hwnd = CreateWindowW(szAppName,
            L"The Programme",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
        ......

    VisualStudioCommunity2017, 当在项目的属性管理器中设定字符集为UNICODE时一切正常。若字符集为“未设定”,则窗口标题仅显示一个“T”,这时如果把CreateWindowW第二参数前的“L”删除,则窗口标题显示正常,但编译时有警告。对于其他API,如MessageBoxW则不论字符集如何设定都不存在这个问题。这是一个bug吗?

    2018年2月28日 8:14

答案

  • Hi,

    感谢在MSDN论坛发帖。

    >>VisualStudioCommunity2017, 当在项目的属性管理器中设定字符集为UNICODE时一切正常。若字符集为“未设定”,则窗口标题仅显示一个“T”,这时如果把CreateWindowW第二参数前的“L”删除,则窗口标题显示正常,但编译时有警告。对于其他API,如MessageBoxW则不论字符集如何设定都不存在这个问题。这是一个bug吗?

    如果去掉L宏的话,单字节参数char就会和CreateWindowW函数的参数定义双字节LPCWSTR类型不符。所以会报错。

    其实你可以直接调用CreateWindow函数,他会根据你的参数和字符集设置自动切换。

    其他情况经过测试确实出现,你可以将该问题发布到下方的地址中。

    https://developercommunity.visualstudio.com

    谢谢你的理解与支持。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 远视眼 2018年3月13日 9:17
    2018年3月1日 9:09
  • 您可以修改一下,字符串都用这样形式表示TEXT("...")
    int WINAPI wWinMain( ...... )
    {
        static TCHAR szAppName[] = TEXT("Hello Windows!");
        WNDCLASS    wndclass;

        ......

        if (!RegisterClass(&wndclass))
        {

        ......

        }

        hwnd = CreateWindow(szAppName,
            TEXT("The Programme"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
        ......

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 远视眼 2018年3月13日 9:18
    2018年3月1日 12:45
    版主

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    >>VisualStudioCommunity2017, 当在项目的属性管理器中设定字符集为UNICODE时一切正常。若字符集为“未设定”,则窗口标题仅显示一个“T”,这时如果把CreateWindowW第二参数前的“L”删除,则窗口标题显示正常,但编译时有警告。对于其他API,如MessageBoxW则不论字符集如何设定都不存在这个问题。这是一个bug吗?

    如果去掉L宏的话,单字节参数char就会和CreateWindowW函数的参数定义双字节LPCWSTR类型不符。所以会报错。

    其实你可以直接调用CreateWindow函数,他会根据你的参数和字符集设置自动切换。

    其他情况经过测试确实出现,你可以将该问题发布到下方的地址中。

    https://developercommunity.visualstudio.com

    谢谢你的理解与支持。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 远视眼 2018年3月13日 9:17
    2018年3月1日 9:09
  • 您可以修改一下,字符串都用这样形式表示TEXT("...")
    int WINAPI wWinMain( ...... )
    {
        static TCHAR szAppName[] = TEXT("Hello Windows!");
        WNDCLASS    wndclass;

        ......

        if (!RegisterClass(&wndclass))
        {

        ......

        }

        hwnd = CreateWindow(szAppName,
            TEXT("The Programme"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
        ......

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 远视眼 2018年3月13日 9:18
    2018年3月1日 12:45
    版主
  • 谢谢版主!
    2018年3月13日 9:16
  • 谢谢版主!
    • 已标记为答案 远视眼 2018年3月13日 9:17
    • 取消答案标记 远视眼 2018年3月13日 9:18
    2018年3月13日 9:17