目录
1、想:解决中泰板卡在电脑关闭时候会程序崩溃的问题(20200802)
2、MFC中OnClose和OnDestroy的调用(20200802)
3、::PostQuitMessage(0) MFC中这个函数什么用途(20200802)
一、目的
1、想:解决中泰板卡在电脑关闭时候会程序崩溃的问题(20200802)
二、参考
1、MFC Windowproc函数(20200802)
https://blog.csdn.net/whh_1218/article/details/8467855
原文:
MSDN:
The WindowProc function is an application-defined function that processes messages sent to a window. TheWNDPROC type defines a pointer to this callback function.WindowProc is a placeholder for the application-defined function name.
WindowProc函数是一个应用程序定义的函数处理消息的发送到一个窗口。指向的类型定义了一个指向这个回调函数。WindowProc是一个占位符为应用程序定义的函数名。
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
参数:
hwnd:指向窗口的句柄。
uMsg:指定消息类型。
wParam:指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。
IParam:指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。
返回值:返回值就是消息处理结果,它与发送的消息有关。
通过重写这个函数,我们可以自定义窗口消息响应,做出相应的处理。
LRESULT CToolTipDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_COMMAND: { AfxMessageBox("1"); if(wParam == SC_CLOSE) { afxMessageBox("Close"); AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); return 0; } } break; } return CDialog::WindowProc(message, wParam, lParam); }
实例中做出了对 WM_COMMAND消息的响应处理
2、MFC中OnClose和OnDestroy的调用(20200802)
https://blog.csdn.net/u014350471/article/details/38437287
原文:
OnClose和OnDestroy:
OnClose():消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候(而不是我们眼睛所见的对话框从屏幕上消失时),该函数被调用。
OnDestroy():消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送。
在单视图程序中,程序退出时执行的操作顺序为:
(1)用户点击退出按钮,发送了WM_CLOSE消息;
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow();
(3)在DestroyWindow()中发送了WM_DESTROY消息;
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环。
综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用),所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose(),否则就有可能会出现内存泄漏的危险了!
3、::PostQuitMessage(0) MFC中这个函数什么用途(20200802)
https://wenwen.sogou.com/z/q88776951.htm
原文:
函数功能:该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。 函数原型:VOID PostQuitMessage(int nExitCode); 参数: pExitCode:指定应用程序退出代码。此值被用作消息WM_QUIT的wParam参数。 返回值:无。 备注:PostQuitMessage寄送一个WM_oUT消息给线程的消息队列并立即返回;此函数向系统表明有个线程请求在随后的某一时间终止。 当线程从消息队列里取得WM_QUIT消息时,应当退出消息循环并将控制返回给系统。返回给系统的退出值必须是消息WM_QUIT的wParam参数。 速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32,lib:Uhicode:在Wihdows NT环境下以Unicode和ANSI方式实现。
三、操作一
1、CFLYDlg.h头文件:声明函数:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
- 总结:发现找不到添加这个函数的方法 ,所以自己手动添加。
2、CFLYDlg.cpp源程序:定义函数
LRESULT CFLYDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch (message)
{
case WM_QUERYENDSESSION:
case WM_ENDSESSION:
{
//ShutdownBlockReasonCreate(m_hWnd, L"");
//卸载ZT840板卡
ZT8408_CloseDevice(g_cardNO);
//ShutdownBlockReasonDestroy(m_hWnd);
PostQuitMessage(0);
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
}
return CDialogEx::WindowProc(message, wParam, lParam);
}
- 总结:因为中泰板卡和阿尔泰板卡不一样,程序运行时候,直接关机会报错,所以需要让程序获得计算机估计指令,然后关闭板卡。