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