3 回答

TA贡献1810条经验 获得超4个赞
回调函数用于异步操作中,就是让系统等待某个事件发生,并且告诉系统,事件发生后用哪个函数去处理,这个函数就叫回调函数,事件发生后,系统自动调用这个函数。而程序可以去做其它事件,不用等待事件。
这里WndProc这个函数就是告诉系统,接收到消息后就这个函数来处理。
HWND hWnd 这个参数不能不设,因为系统调用这个函数时是认为有这个参数的,你不设,调用就会出错,这是回调函数,是系统来调用,而不是你自己去调用。
你不用管这个问题,虽然WNDCLASS定义是在CreateWindow之前,但CreateWindow之前是没有消息的,所以不会调用WndProc,也就不会出错。wndClass.lpfnWndProc = WndProc;只是让系统知道消息函数的地址在哪里,在没有调用DispatchMessage(&msg); 之前是不会调用WndProc的。
这样解释不是很好,希望你能理解。

TA贡献1820条经验 获得超3个赞
你好:
(1)WNDCLASS的设定 和 WndProc函数是可以不放在同一文件里的,你在定义wndclss之前声明一下窗口过程处理函数即可,把函数的定义放在另一个文件里
(2)定义HWND hwnd;
hwnd=CreateWindow();
这样你并没有重复定义啊
(3)在wndlass定义的参数中是不需要定义窗口句柄的,值是定义了一个你在第一步声明的过程函数地址即可,你可以好好在看看它的参数
(4)窗口过程函数的地址在窗口类注册的时候传给了操作系统,当这个窗口收到消息后,消息dispatch()给了操作系统,操作系统根据窗口过程的地址就找到了处理函数 ,这就是操作系统的回调:即你定义函数体,操作系统帮你调用

TA贡献1982条经验 获得超2个赞
windowproc函数的四个参数分别对应消息的窗口句柄,消息代码,消息代码的两个参数。一个程序可以有多个窗口,第一个参数标识了消息接收的特定窗口。在窗口过程内部使用switch/case语句来确定窗口过程接收什么消息,以及怎么处理。代码如下:
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CHAR:
break;
case WM_PAINT:
break;
case WM_CLOSE:
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
这个函数是系统调用的,系统自会把参数传递过去的,你就不用考虑了,只要按格式写就行了。
- 3 回答
- 0 关注
- 177 浏览
添加回答
举报