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

时间:2022-01-13 20:33:29

这应该是个老问题,我来稍微总结下:(我刚刚接触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.另有网友建议做法, 用一个全局变量表示是否要退出程序,在子窗口中赋值,当子窗口被调用后,父窗口在调用处判定是否要退出程序。(没试过,欢迎做过的朋友留言,贴出重要代码或私信我)非常感谢~~