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,同一个程序能开多个文档窗口

 

posted @   言午丶  阅读(663)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示