MFC:基础篇 第二章 MFC三大窗体框架
一.简介
二.基于对话框(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,同一个程序能开多个文档窗口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)