VC++动态创建窗口时小小疑问

来源:百度知道 编辑:UC知道 时间:2024/06/24 23:38:05
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
如果把上面代码的GetMessage的第二个参数改成窗口的句柄hWnd
即:GetMessage(&message,hWnd,0,0)
这样调动PostQuitMessage(0)时程序的进程不能退出,只是窗口没有了
而前者(即:GetQuitMessag的第二个参数为NULL)程序能够正常退出,窗口进程都结束了
我想知道为何如此
GetMessage第二个参数有什么用,为NULL的时候又是如何运行的,能把消息循环如何处理这些情况的给讲下就好了,谢谢了
问题解决我再追加分,现在给太多分怕浪费了

这个问题我想还是给你解释一下窗口内部相关部分的工作原理比较容易理解:
首先要解释下第二个参数,那么按照MSDN上面所说第2的参数可以设置为一个缺省的值NULL或者设置为一个窗口的句柄.二者的不同之处在于:设置为NULL的情况下是接受所有窗口的信息,而当设置成指定的窗口句柄HWND的情况下,是只接收你指定的这个窗口句柄的窗口所发送的信息,那么单从接收信息的范围上来看的话,不难看出区别吧?
另外,GetMessage()函数所返回的值在接收到WM_QUIT之前是一直为真的,在调用PostQuitMessage()之后,会发送一个WM_QUIT消息到消息队列中,此时消息队列接收到WM_QUIT消息返回一个非真的值,消息循环结束.由于你在定义第2的参数的时候指定的是一个窗口的句柄hWnd,那么他只能接收到窗口相关的一些消息,所以在退出时只是结束了你该窗口相关消息的运行,若是NULL则会停止所有线程,包括一些后台程序的运行!
以上这些东西希望你看了之后能花时间慢慢的理解一下.

第二个参数指定指定窗口句柄,GetMessage 就只获取这个窗口的消息。指定句柄后,WM_DESTROY消息任然可以取到,所以可以销毁窗口,但WM_QUIT不是发送给窗口的,所以无法取到,程序不能退出。第三个参数是消息最小值,第四个最大值

建议LZ查看一下Platform SDK文档,第二个参数是指定窗口的HWND的
要注意的下,当收到WM_QUIT后窗口被结束了,所以窗口的HWND已经无效了,再调用
GetMessage(&msg, g_hWnd, 0, 0) //g_hWnd为窗口的HWND
时返回值是-1,这样while循环是不会结束的,你应该这样写
while (1)
{
if (GetMessage(&msg, g_hWnd, 0, 0)==-1)
{
break;
}

TranslateMessage(&msg);
DispatchMessage(&msg);

}