WNDCLASS初始化

下面两段代码有什么区别?
1.

    WNDCLASS    wndclass = {
        CS_HREDRAW,
        WndProc,
        0,
        0,
        hInstance,
        LoadIcon(NULL, IDI_APPLICATION),
        LoadCursor(NULL, IDC_ARROW),
        (HBRUSH)GetStockObject(WHITE_BRUSH),
                NULL,
        szAppName
    };

2.


    WNDCLASS    wndclass = {};

    wndclass.style = CS_HREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

为什么执行1段代码后,进入RegisterClass(&wndclass)会返回假,执行2段代码后,进入RegisterClass(&wndclass)会返回真,

两种写法只是对结构体赋值的不同写法罢了,都是可行的,你说不行,说明第一段成员顺序或者类型没有写对

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    这两段代码都是用于注册窗口类的,但是它们有一点不同,可能导致注册结果不同。

    首先,我们来看一下第一段代码:

    WNDCLASS wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
    wndclass.lpszMenuName = nullptr;
    wndclass.lpszClassName = "MyWindowClass";
    
    if (!RegisterClass(&wndclass)) {
        // 注册失败处理
    }
    

    再来看一下第二段代码:

    WNDCLASS wndclass = {};
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
    wndclass.lpszMenuName = nullptr;
    wndclass.lpszClassName = "MyWindowClass";
    
    if (!RegisterClass(&wndclass)) {
        // 注册失败处理
    }
    

    这两段代码的主要区别在于WNDCLASS的初始化方式。第一段代码中没有对wndclass进行初始化,而第二段代码使用了={}wndclass进行了初始化。

    对于第一段代码,未进行初始化的WNDCLASS可能会有一些随机的初始值,例如wndclass.hInstance可能是一个无效的句柄值。这可能导致RegisterClass函数在尝试注册窗口类时发生错误,从而返回假值。

    而对于第二段代码,我们对WNDCLASS进行了初始化,确保了每个成员变量的初始值都是有效的。这样RegisterClass函数在尝试注册窗口类时就不会遇到无效的值,因此可以正常注册并返回真值。

    因此,造成两段代码注册结果不同的原因就是第一段代码中的WNDCLASS变量没有进行初始化,而第二段代码中进行了初始化。所以,第二段代码中调用RegisterClass返回真值,而第一段代码中调用RegisterClass返回假值。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^