什么是回调函数?WndProc函数的参数是怎么处理的??

来源:百度知道 编辑:UC知道 时间:2024/06/18 04:10:33
我很想办WNDCLASS的设定 和 WndProc函数分别放在两个文件中

但问题出来了 参数怎么传递啊?有人说因为是回调函数,所以不必管它,但不管不行啊?

还有 第一个参数HWND hWnd的hWnd不设可以不? 设了好像也没什么用?
因为语句HWND hwnd = CreateWindow(...);在WNDCLASS定义之后,而WndProc的调用是在wndClass.lpfnWndProc = WndProc;语句中,此时还没有窗口句柄呢!参数中有一个,而后面又定义了一个,不是多此一举啊?

越想越不明白,到底是怎么回事??

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

你好:
(1)WNDCLASS的设定 和 WndProc函数是可以不放在同一文件里的,你在定义wndclss之前声明一下窗口过程处理函数即可,把函数的定义放在另一个文件里

(2)定义HWND hwnd;
hwnd=CreateWindow();
这样你并没有重复定义啊

(3)在wndlass定义的参数中是不需要定义窗口句柄的,值是定义了一个你在第一步声明的过程函数地址即可,你可以好好在看看它的参数

(4)窗口过程函数的地址在窗口类注册的时候传给了操作系统,当这个窗口收到消息后,消息dispatch()给了操作系统,操作系统根据窗口过程的地址就找到了处理函数 ,这就是操作系统的回调:即你定义函数体,操作系统帮你调用

还有疑问的话,我们可以在讨论

祝你好运!

WndProc后出现hWnd可能是为了方便,程序员不用在CreateWindow后保存hWnd的值。
再说窗口过程是可能改变的(使用SetWindowLong)。

这个问题书上有解释。
windowproc函数的四个参数分别对应消息的窗口句柄,消息代码,消息代码的两个参数。一个程序