zoukankan      html  css  js  c++  java
  • 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,同一个程序能开多个文档窗口

  • 相关阅读:
    [jQuery学习系列六]6-jQuery实际操作小案例
    [Java拾遗一] XML的书写规范与解析.
    [数据库操作]Java中的JDBC的使用方法.
    [Java拾遗二]Tomact及Http 部分总结.
    [Java拾遗三]JavaWeb基础之Servlet
    [Java拾遗四]JavaWeb基础之Servlet_Request&&Response
    [Java拾遗五]使用Session防止表单重复提交
    [数据库连接池] Java数据库连接池--DBCP浅析.
    [开发工具]Java开发常用的在线工具
    [数据库连接池二]Java数据库连接池--C3P0和JDNI.
  • 原文地址:https://www.cnblogs.com/k5bg/p/11212735.html
Copyright © 2011-2022 走看看