MFC如何在关闭程序前d出确认对话框

MFC如何在关闭程序前d出确认对话框,第1张

参考代码如下:

处理WM_CLOSE消息,CYourDlg::OnClose()

{

if(::MessageBox(NULL, 确定要退出吗?","程序退出", MB_YESNO) == IDYES)

{

CDialog::OnCLose(); //OnCLose事件

}

}

程序的启动和退出是要讲究顺序的,实则就是一个栈式的过程,比如你启动一个SDI程序或者MDI程序,先启动APP,再分别启动MainFrm,ChildFrm,以及View。这几者之间是有相互依赖关系的。可以想象,当你要退出一个程序时,你得反过来分别退出View,ChildFrm,MainFrm,最后才是App。

所以,你在View里使用DestroyWindow()导致这种顺序打乱了,所以才出现程序崩溃的错误。

给你补补吧,MDI程序退出顺序如下:

1、当框架CFrameWnd关闭时,会接收到WM_CLOSE消息,通过消息映射会执行OnClose方法

2、在OnClose方法中,由于框架是应用程序的主窗口,因此会调用应用程序的CloseAllDocuments方法;

3、应用程序的CloseAllDocuments调用了文档管理器的CloseAllDocuments方法;

4、文档管理器的CloseAllDocuments方法调用了文档模板的CloseAllDocuments方法;

5、在文档模板的CloseAllDocuments方法中,调用了文档的OnCloseDocument方法;

6、在文档对象的OnCloseDocument方法中,调用了框架的DestroyWindow方法,而框架的DestroyWindow方法直接调用了CWnd的DestroyWindow方法释放窗口;

7、在窗口类CWnd的DestroyWindow方法中,调用了API函数DestroyWindow释放窗口。该函数会向窗口发送WM_DESTROY消息,执行视图类的OnDestroy方法,接着释放掉视图窗口,在视图窗口被释放后,向视图窗口发送最后一个窗口消息WM_NCDESTROY,执行视图的PostNcDestroy方法;

8、PostNcDestroy方法中的“delete this;”最终会调用视图的析构函数释放掉视图对象。

通过以上可知,过早地执行DestroyWindow违反了这一顺序;利用楼上所述,使用AfxGetMainWnd()->SendMessage(WM_CLOSE); 就应该不会有问题了。

使用ShellExecute函数调用B,然后用关闭自己(对话框编程可用OnOK函数关闭)。

ShellExecute(NULL,

_T("open"),

link,

NULL,

NULL,

SW_SHOWNORMAL);

link是个表示调用程序路径和名称的字符串。

BOOL KillProcessFromName(CString strProcessName)  

{  

    //创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)  

    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  

  

    //PROCESSENTRY32进程快照的结构体  

    PROCESSENTRY32 pe;  

  

    //实例化后使用Process32First获取第一个快照的进程前必做的初始化 *** 作  

    pedwSize = sizeof(PROCESSENTRY32);  

  

  

    //下面的IF效果同:  

    //if(hProcessSnap == INVALID_HANDLE_VALUE)   无效的句柄  

    if(!Process32First(hSnapShot,&pe))  

    {  

        return FALSE;  

    }  

  

    //将字符串转换为小写  

    strProcessNameMakeLower();  

  

    //如果句柄有效  则一直获取下一个句柄循环下去  

    while (Process32Next(hSnapShot,&pe))  

    {  

  

        //peszExeFile获取当前进程的可执行文件名称  

        CString scTmp = peszExeFile;  

  

  

        //将可执行文件名称所有英文字母修改为小写  

        scTmpMakeLower();  

  

        //比较当前进程的可执行文件名称和传递进来的文件名称是否相同  

        //相同的话Compare返回0  

        if(!scTmpCompare(strProcessName))  

        {  

  

            //从快照进程中获取该进程的PID(即任务管理器中的PID)  

            DWORD dwProcessID = peth32ProcessID;  

            HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);  

            ::TerminateProcess(hProcess,0);  

            CloseHandle(hProcess);  

            return TRUE;  

        }  

        scTmpReleaseBuffer();  

    }  

    strProcessNameReleaseBuffer();  

    return FALSE;  

}

以上就是关于MFC如何在关闭程序前d出确认对话框全部的内容,包括:MFC如何在关闭程序前d出确认对话框、我用MFC构建了一个窗口程序,现在想通过按下键盘上的Q键就能关闭窗口,退出程序,应怎样实现、MFC编程的时候怎么打开一个程序的同时关闭当前程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zz/10641093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存