一.简介
二.基于对话框(CDialog)
Windows的对话框分为两类:模态对话框和非模态对话框
模态对话框:当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框相应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互
非模态对话框:当它弹出后,本程序其他窗口仍能响应用户输入,非模态对话框一般用来显示提示信息等
MFC将模式和非模式对话框的功能都封装在CDialog类中
1.应用程序类
// MFCDialog.h #pragma once #ifndef __AFXWIN_H__ #error "在包含此文件之前包含stdafx.h以生成PCH文件" #endif #include "resource.h" class CMFCDialogApp : public CWinApp
{
public:
CMFCDialogApp();
// 重写
public:
virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP()
};
extern CMFCDialogApp theApp;
// MFCDialog.cpp #include "stdafx.h" #include "MFCDialog.h" #include "MFCDialogDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif BEGIN_MESSAGE_MAP(CMFCDialogApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() CMFCDialogApp::CMFCDialogApp() { } CMFCDialogApp theApp BOOL CMFCDialogApp::InitInstance() { CWinApp::InitInstance();
CMFCDialogDlg dlg; m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE; }
2.对话框类
// MFCDialogDlg.h #pragma once class CMFCDialogDlg : public CDialogEx { public:
CMFCDialogDlg(CWnd* pParent = NULL);
enum {IDD = IDD_MFCDIALOG_DIALOG};
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// 实现
protected:
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP() };
// MFCDialogDlg.cpp #include "stdafx.h" #include "MFCDialog.h" #include "MFCDialogDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CMFCDialogDlg::CMFCDialogDlg(CWnd* pParent) : CDialogEx(CMFCDialogDlg::IDD, pParent) { } void CMFCDialogDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCDialogDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() END_MESSAGE_MAP() BOOL CMFCDialogDlg::OnInitDialog() { CDialogEx::OnInitDialog(); return TRUE; } void CMFCDialogDlg::OnPaint() { CPaintDC dc(this); CDialogEx::OnPaint(); }
3.创建模态对话框
(1) 创建对话框
资源视图->Dialog->右键->插入Dialog->重命名为 IDD_EXEC
(2) 为对话框添加类
IDD_EXEC->右键->添加类->类命名 CDlgExec 头文件命名为 DlgExec
(3) 为按钮添加事件处理程序
弹出对话框比较关键的一个函数就是对话框类的DoModal(),它可以用来显示一个模态对话框.其返回值对应于用来关闭对话框的控件ID
//DoModal()调用层次 CMyDialog::DoModal() CMyDialog::OnInitDialog() CDialog::OnInitDialog() CWnd::UpdateData(false) CMyDialog::DoDataExchange()
//Example void CTestDlg::OnBnClickedBtnAdd(){ INT_PTR nRes; //用来保存DoModal函数的返回值 CTestDlg testDlg; nRes=testDlg.DoModal(); //弹出对话框 if(IDCANCEL==nRes) return; }
4.创建非模态对话框
要显示一个非模态对话框,可以用Create()来代替DoModal()
//Example CDiglog7* pDlg=new CDiglog7; //创建非模态对话框实例 pDlg->Create(IDD_DIALOG7,this); //pDlg->Create(IDD_CHAT_DLG);//父窗口是m_pMainWnd所指定的对象 //pDlg->Create(IDD_CHAT_DLG, GetDesktopWindow());//不依赖与其他窗口,独立的窗口 pDlg->ShowWindow(SW_SHOW); //显示非模态对话框
三.基于单文档(SDI)
基于单文档窗口有四个类:文档类 视图类 主框架窗口类 应用程序类
基于单文档的程序类似于记事本,同一个程序只能开一个文档窗口
四.基于多文档(MDI)
基于多文档的程序类似于word,同一个程序能开多个文档窗口