C++ : Why this window title gets truncated?

标签 c++ winapi

Visual C++ 2012 RC,Win7

简体中文

项目属性> 使用多字节字符集

当我运行这个程序时,窗口的标题显示一个字母“S”,而不是整个单词“Sample”。

#pragma comment(linker, "/SubSystem:Windows")

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) {
    WNDCLASSW wc = { 0 };

    wc.style            = CS_VREDRAW | CS_HREDRAW;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon(nullptr, IDI_APPLICATION);
    wc.hCursor          = LoadCursor(nullptr, IDC_ARROW);
    wc.hbrBackground    = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.lpszClassName    = L"MyWindowClass";

    wc.lpfnWndProc = [](HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
        if (uMsg - WM_DESTROY)
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
        else {
            PostQuitMessage(0);
            return HRESULT();
        }
    };

    RegisterClassW(&wc);

    CreateWindowExW(0, L"MyWindowClass", L"Sample",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, SW_SHOW, CW_USEDEFAULT, 0,
        nullptr, nullptr, hInstance, nullptr);

    for (MSG msg; GetMessage(&msg, nullptr, 0, 0); DispatchMessage(&msg));
}

如果我使用 Unicode(项目属性),保持源代码不变,窗口标题显示“Sample”,看起来正确。

如果我使用多字节,在源代码中我使用 WNDCLASS = { ..., "MyWindowClass"} 和 RegisterClassA,保持 CreateWindowExW 不变,窗口标题显示单词“Sample”,看起来正确。

如果我使用多字节,在源代码中我使用 CreateWindowExA("MyWindowClass", "Sample"),保持 WNDCLASSW 和 RegisterClassW 不变,窗口标题显示字母“S”。

是什么让它显示一个“S”,我做错了什么吗?

追加

如果我保持所有不变,即使用多字节,使用上面显示的代码,窗口标题显示字母“S”。

(如果您运行此程序并在窗口标题上看到“Sample”,而不是“S”,那么它更可能是 vc++ 2012(或 OS)的 chs 版本上的特定问题。

最佳答案

您的代码中的问题是您使用的是 DefWindowProc 而不是 DefWindowProcW。更改它将修复代码。

理想情况下,您应该将项目设置更改为使用 Unicode,而不是多字节字符集。这将简化一切,您可以使用像 CreateWindowExRegisterClassEx 这样的宏,而不是像您一样显式使用 Unicode/ANSI 版本。

正如其他人所说,这是字符集之间的不匹配。

理想情况下,您应该在所有相互交互的 API 调用之间匹配字符集。所以如果你使用 CreateWindowExW 你也应该使用 RegisterClassExW, DefWindowProcW, DispatchMessageW...

关于C++ : Why this window title gets truncated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11884021/

相关文章:

C++ 相互递归变体类型

c++ - 如何重新设计 C++ 类?

python - "name ' win32api ' is not defined"- 错误但包存在?

c - Windows 10 对话框标题栏行为

c++ - 如何在多个项目(以及一个版本的 cpplint.py)中使用单个 makefile?

c++ - 为什么将 ‘float**’ 转换为 ‘const float**’ 时出现错误?

c++ - std::function 与函数指针

c++ - 检查文本框控件是否为空 C++ Win32

c - 我怎样才能在 C 中获得一个进程句柄而不是它的名字?

C Win32 API : Set state of check box