下面两段代码有什么区别?
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)会返回真,
两种写法只是对结构体赋值的不同写法罢了,都是可行的,你说不行,说明第一段成员顺序或者类型没有写对
不知道你这个问题是否已经解决, 如果还没有解决的话:这两段代码都是用于注册窗口类的,但是它们有一点不同,可能导致注册结果不同。
首先,我们来看一下第一段代码:
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
返回假值。