关于窗口过程函数WndProc。
我始终没弄明白。winmain函数是在什么情况下调用WndProc函数的。来个明白人解释一下。谢谢。...
我始终没弄明白。winmain函数是在什么情况下调用WndProc函数的。来个明白人解释一下。谢谢。
展开
2个回答
展开全部
WndProc在WinMain里面没有直接调用,但是它被间接调用。下面的消息循环往往被称为主消息循环,是Win32程序驱动的根源,所有的Win32程序都会有类似的循环(MFC也不例外,在CWinThread::Run函数里面):
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
你的WndProc看起来似乎和上面的代码压根没有关系,但是奥妙就在DispatchMessage里面,这个函数的作用和他名字一样,是分发消息的,所有的窗口句柄都对应一个窗口过程函数,每个消息的窗口句柄则是在这个MSG结构中保存的,DispatchMessage的源代码虽然没有公开,但是几乎可以肯定,他先调用Windows API函数GetWindowLongPtr加上参数GWLP_WNDPROC,就可以获得窗口句柄所对应的窗口函数指针,接下来他就调用这个窗口函数。所以窗口函数被这个主消息循环间接调用了。当GetMessage获得的MSG结构中的窗口句柄是NULL的时候,DispatchMessage不调用任何窗口过程函数。
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
你的WndProc看起来似乎和上面的代码压根没有关系,但是奥妙就在DispatchMessage里面,这个函数的作用和他名字一样,是分发消息的,所有的窗口句柄都对应一个窗口过程函数,每个消息的窗口句柄则是在这个MSG结构中保存的,DispatchMessage的源代码虽然没有公开,但是几乎可以肯定,他先调用Windows API函数GetWindowLongPtr加上参数GWLP_WNDPROC,就可以获得窗口句柄所对应的窗口函数指针,接下来他就调用这个窗口函数。所以窗口函数被这个主消息循环间接调用了。当GetMessage获得的MSG结构中的窗口句柄是NULL的时候,DispatchMessage不调用任何窗口过程函数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询