当前位置: 代码迷 >> VC/MFC >> MFC中经过子窗口关闭父窗口以实现退出程序
  详细解决方案

MFC中经过子窗口关闭父窗口以实现退出程序

热度:350   发布时间:2016-05-02 03:55:28.0
MFC中通过子窗口关闭父窗口以实现退出程序

这应该是个老问题,我来稍微总结下:(我刚刚接触Windows编程希望大家多多指点)


1.上来来个最鲁莽的.

直接通过exit(0),ExitProcess(0);//不好的用法

猜测资源得不到回收

原因如下:

http://blog.csdn.net/jiang1013nan/article/details/4831020


2.向父窗口发送WM_CLOSE消息,然后自己关闭自己的窗口。

获取将父窗口的句柄直接传给子窗口,然后子窗口可以直接关闭父窗口.

示例代码如下:


父窗口类的定义:

// CMFC_biometic_authenticationDlg 对话框class CMFC_biometic_authenticationDlg : public CDialogEx{// 构造public:	CMFC_biometic_authenticationDlg(CWnd* pParent = NULL);	// 标准构造函数// 对话框数据	enum { IDD = IDD_MFC_BIOMETIC_AUTHENTICATION_DIALOG };	protected:	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 实现protected:	HICON m_hIcon;	// 生成的消息映射函数	virtual BOOL OnInitDialog();	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);	afx_msg void OnPaint();	afx_msg HCURSOR OnQueryDragIcon();	DECLARE_MESSAGE_MAP()public:	afx_msg void OnBnClickedOk();	afx_msg void OnStnClickedPasswordTipsStatic();	afx_msg void OnStnClickedUsernameStatic();	afx_msg void OnEnChangeEdit3();	afx_msg void OnEnChangeFingerTipsEdit();private:	CString m_username;private:	CString m_password;private:	CString m_message_return;public:	afx_msg void OnBnClickedOkButton();	afx_msg void OnStnClickedPassMessageStatic();	afx_msg void OnBnClickedInstructionLog();private:	CUserDialog m_Userlog;public:	afx_msg void OnClose();};


子窗口类的定义

class CUserDialog : public CDialogEx{	DECLARE_DYNAMIC(CUserDialog)public:	CUserDialog(CWnd* pParent = NULL);   // 标准构造函数	virtual ~CUserDialog();// 对话框数据	enum { IDD = IDD_USER_DIALOG };protected:	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持	DECLARE_MESSAGE_MAP()public:	afx_msg void OnBnClickedUserExitButton();	afx_msg void OnBnClickedOk();	afx_msg void OnClose();private:	CWnd *m_pParentWnd;}; 


CWnd *m_pParentWnd; 子窗口类中用来存储父窗口的指针


重要步骤:传递指针到子窗口(通过构造函数):

CUserDialog::CUserDialog(CWnd* pParent /*=NULL*/)	: CDialogEx(CUserDialog::IDD, pParent), m_pParentWnd(pParent){	}

关闭的过程通过 ::SendMessage(...);

void CUserDialog::OnClose(){	// TODO:  在此添加消息处理程序代码和/或调用默认值	//ExitProcess(0);		//不好的用法	//::DestroyWindow(m_pParentWnd);	::SendMessage(m_pParentWnd->m_hWnd, WM_CLOSE, 0, 0);	CDialogEx::OnClose();}

3.另有网友建议做法,用一个全局变量表示是否要退出程序,在子窗口中赋值,当子窗口被调用后,父窗口在调用处判定是否要退出程序。(没试过,欢迎做过的朋友留言,贴出重要代码或私信我)非常感谢~~



版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案