MFC窗口程序退出消息的响应

1.MFC三个结束消息的区别

WM_CLOSE:
在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对 WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等。如果用户选择“取消”,你忽略此消息,程序照常运行,如果用户确认要退出,你就调用DestroyWindow。
WM_DESTROY:
接下来,DestroyWindow完成窗口的清理工作,最后向窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),然后调用PostQuitMessage。
WM_QUIT:
PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。

2.CallWindowProc与DefWindowProc

LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam);
函数功能:CallWindowProc将指定消息信息传送给指定的窗口过程. lpPrevWndFunc是窗口消息处理函数指针(函数名), hWnd为接受窗体句柄.
DefWindowProc(HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam), 是让Windows的缺省消息处理函数处理消息.
函数功能:该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用DefWindowProc函数时使用窗口过程接收的相同参数。
二者关键的区别有, CallWindowProc 是发送某个消息给某个处理函数(包括自定义消息处理函数), 而DefWindowProc 是发送某个消息给Windows缺省(内定)的消息处理函数.
如果理解了他们这一点的区别, 就能明白,
CalWindowPro(DefWindowProc, hWnd,Msg,wParam, lParam) 和
DefWindowProc(hWnd,Msg ,wParam,lParam);二者此时执行效果一样

在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消息处理函数。
DefWindowProc函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。如果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作"。当DefWindowProc处理WM_DESTROY消息时,它不自动调用PostQuitMessage。

3. OnClose( )与OnDestroy( )

OnClose( ):消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候(而不是我们眼睛所见的对话框从屏幕上消失时),该函数被调用,用户在响应OnOk()或者OnCancel()函数之后,不会发送WM_CLOSE消息。
OnDestroy( ):消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为:
(1)用户点击退出按钮,发送了WM_CLOSE消息
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()
(3)在DestroyWindow()中发送了WM_DESTROY消息
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环
综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用),所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose(),否则就有可能会出现内存泄漏的危险了!

4、发送消息SendMessage与PostMessage的区别

PostMessage将消息放入消息队列后马上返回,而SendMessage直到窗口过程处理完消息后才返回

5、退出程序语句

exit(0);
postquitmessage(0);
onok();oncancel();
sendmessage(wm_close,0,0);
exitprocess(0);

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MFC(Microsoft Foundation Class)是微软公司开发的一套基于Windows API的C++类库,用于开发Windows平台下的GUI应用程序,具有易于使用、高效稳定等特点。下面是关于使用VS2019开发MFC应用程序的从入门到精通的详细步骤: 1. 安装VS2019:首先需要安装Visual Studio 2019开发环境,并选中MFC组件进行安装。 2. 创建MFC工程:在VS2019中,选择“创建新项目”,在“Visual C++”中选择“MFC应用程序”,然后设置项目名称和存储路径。 3. MFC应用程序框架:MFC应用程序框架由CWinApp、CWinThread、CMainFrame、CView等类组成,其中CWinApp是应用程序类,负责处理应用程序级别的操作,包括初始化、退出等;CWinThread是线程类,负责处理多线程相关的操作;CMainFrame是主窗口类,负责处理主窗口的创建和消息处理等;CView是视图类,负责处理与用户界面相关的操作。 4. MFC应用程序消息处理:MFC应用程序使用消息机制来处理用户交互事件,包括菜单命令、鼠标事件、键盘事件等。在MFC应用程序中,可以通过响应消息来实现特定的操作,例如打开文件、保存文件、复制、粘贴等。 5. MFC应用程序界面设计:MFC应用程序的界面设计可以通过资源编辑器来实现,包括对话框、菜单、工具栏、状态栏等。可以通过资源编辑器来添加和修改这些元素,然后在代码中响应这些元素的事件。 6. MFC应用程序数据存储:MFC应用程序需要处理数据存储和管理,可以使用MFC提供的文件类和数据库类来实现。文件类主要用于文件的读写操作,数据库类主要用于数据库的连接和操作。 7. MFC应用程序调试和优化:在开发MFC应用程序时,需要进行调试和优化,以确保程序的正确性和性能。可以使用VS2019提供的调试工具和性能分析器来定位和解决问题。 总之,通过以上步骤,可以从入门到精通地掌握使用VS2019开发MFC应用程序的技能,从而实现高效、稳定、易用的Windows GUI应用程序的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值