MFC 基础 标准控件和对话框 文档和视图 用户界面的改善 动态链接库...
-
Upload
thaddeus-chang -
Category
Documents
-
view
203 -
download
7
description
Transcript of MFC 基础 标准控件和对话框 文档和视图 用户界面的改善 动态链接库...
第 1页
MFC 基础标准控件和对话框文档和视图用户界面的改善动态链接库多线程编程多媒体程序开发数据库程序开发注册表程序开发网络程序开发
第 2页
第六讲 MFC 基础
April 20, 2023
第 3页
MFC概述MFC类的组织结构主要类的介绍MFC的全局变量以及全局函数创建第一个MFC程序
第 4页
6.1 MFC6.1 MFC 概述概述
Microsoft Foundation Class
微软基础类
第 5页
MFC 是用来编写 Windows 应用程序的 C++ 类集,该类集以层次结构组织起来,其中封装了大部分 Windows API 函数和Windows 控件,它所包含的功能涉及到整个 Windows 操作系统。MFC 不仅为用户提供了 Windows 图形环境下应用程序的框架,而且还提供了创建应用程序的组件。
第 6页
MFC 还很好地保持了程序的向下兼容性
是用来编写 Windows 应用程序的 C++类集
以层次结构组织
封装了大部分 API 函数
提供了图形环境下应用程序的框架
提供了创建应用程序的组件
提供了大量的基类供程序员根据不同的应用环境进行扩充
允许在编程过程中自定义和扩展应用程序中的类
较好的移植性,可移植于众多的平台
MFC
第 7页
MFCMFC 的历史(的历史( 11 ))
MFC1.0 & MS C/C++7.0 应用程序中非图形部分的类GUI 功能的 Windows 相关类
MFC2.0 & MS VC++1.0 在 1.0 基础上增添了一些应用程序
MFC3.0 & VC++2.0 增添了对开发 32 位应用程序的支持
MFC2.0 & MS VC++1.5 添加了 ODBC 类,并且还支持 OLE 的性能
MFC4.0包含了在 Win95 和 NT 中大多数新的公共控件和 DAO 、 MAPI
增强了对数据库应用程序的支持利用 DAO 类通过编程语言来访问、操纵和管理数据库对 Internet 也提供了强有力的支持
MFC4.21
第 8页
MFCMFC 的历史(的历史( 22 ))
MFC5.0 增强了对数据库和 Internet 的支持Win32 Internet APIActivex控件
MFC6.0 提出了活动文档容器来管理不同类型的文档加入了对动态 HTML 技术的支持扩展了对公共控件的支持
第 9页
MFC是放置Windows API的 OOP的包装的 C++类库MFC是一个应用程序的结构框架
第 10页
使用使用 C++C++ 和和 MFCMFC 的优点的优点
可重用性数据的封装性MFC将窗口、控件、对话框等变成 C++的对象减少代码的编写,提高软件开发效率
第 11页
6.2MFC6.2MFC 类的组织结构类的组织结构
hierarchy chart
第 12页
MFCMFC 类的组织结构(类的组织结构( 22 ))
第 13页
MFCMFC 库中的类按层次关系划分类库中的类按层次关系划分类
根类: CObject应用程序体系结构类窗口、对话框和控件类绘图和打印类简单数据类型类数组、列表和映射类文件和数据库类Internet 和网络工作类OLE 类调试和异常类
第 14页
6.36.3 主要类的介绍- 主要类的介绍- CObjectCObject 类类
MFC 中多数类和用户自定义子类的根类,是抽象基类。它提供了许多编程所需的公共操作。
对象的建立
对象的删除
运行时信息
对象诊断输出
串行化支持 绘图和打印类
输出 ( 设备相关 )类绘图工具类
第 15页
应用程序和线程支持类命令相关类文档类文档模板类视类 ( 体系结构 )框架窗口 ( 体系结构 )
应用程序体系结构类
窗口、对话框和控件类
框架窗口类(窗口)视类(窗口)对话框类控件条类
简单数据类型类
数组、列表和映射类数组类列表类映射类
第 16页
文件和数据库类文件 I/O 类DAO 类ODBC 类
Internet 和网络工作类LSAPI 类Windows Socket 类Win32 Internet 类
OLE 类
OLE 容器类OLE服务器类OLE拖放和数据传输类OLE普通对话框类OLE 动画类OLE 动画类OLE 控件类活动文档类其他文档类
调试和异常类 调试支持类异常类
第 17页
应用程序体系结构类
1.命令相关类
2. 窗口应用程序类
3. 文档 / 视类
4. 线程基类编写程序的任务是填充框架,添加应用程序专用的功能
用于构造应用程序框架的结构,提供多数应用程
序公用的功能
第 18页
1.命令相关类: CCmdTarget 类
该类是 CObject 的子类,它是 MFC 库中所有具有消息映射属性的基类。消息映射规定了当一对象接收到消息命令时,应调用哪一个函数对该消息进行处理
2.线程基类: CWinThread 类所有线程的基类,可直接使用。 CWinApp类就是从CWinThread 类中派生出来的
第 19页
4.文档 / 视类 文档对象由文档模板对象创建,管理应用程序的数据。视对象表示一个窗口的客户区,显示文档数据并允许用户与之交互。
3.窗口应用程序类: CWinApp类 每个应用程序有且只有一个应用程序对象,在运行程序中该对象与其它对象相互协调,该对象从 CWinApp类中派生出来。 CWinApp类封装了初始化、运行、终止应用程序的代码。
第 20页
在 CWinApp 中定义的部分函数的功能有时也可以通过 MFC 提供的全局函数来实现,这些全局函数一般都以 Afx 为前缀。例如调用 AfxMessageBox 函数将弹出一个消息框,
其功能与 CWinApp 中的 DoMessageBox 相同。 AfxMessageBox原型如下:
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 )
第 21页
int int AfxMessageBoxAfxMessageBox(LPCTSTR(LPCTSTR lpszText,UINT nType = MB_OK, UINT nIDHelp = 0 )lpszText,UINT nType = MB_OK, UINT nIDHelp = 0 )
MB_ABORTRETRYIGNORE
MB_OK
MB_OKCANCEL
MB_RETRYCANCEL
MB_YESNO
MB_YESNOCANCEL
第 22页
可视对象类可视对象类
2.视类: CView 类
该类表示框架窗口的客户区和显示文档数据并接收输入的客户区,其派生类主要有如下几种:
CScrollView :具有滚动功能的视的基类CFormView :其布局在对话资源中定义的滚动视CEditView :具有文本编辑、查找、替换和滚动功能的视
1.窗口类: CWnd 类
CWnd 提供了 MFC 中所有窗口类的基本功能,是 CCmdTarget 类的子类
创建 Windows 窗口要分两步进行
引入构造函数,构造一个 CWnd 对象
调用 Create 建立 Windows 窗口,并将它连到 CWnd对象上
第 23页
3.菜单类: CMenu类该类是 CObject 类的子类,用于管理菜单。它是一个 Windows HMenu的封装,提供了与窗口有关的菜单资源建立、修改、跟踪及删除的成员函数。
4.对话框类: CDialog类由于对话框是一个特殊的窗口,所以该类是从 CWnd类中派生出来的。对话框子层次结构包括通用对话框类 CDialog以及支持文件选择、颜色选择、字体选择、打印、替换文本的公共对话框子类。
第 24页
5.控件类 控件子层次结构包括若干类,使用这些类可建立静态文本、命令按钮、位图按钮、列表框、组合框、滚动条、编辑框等。这些直观控件为 Windows 应用程序提供了各种输入和显示界面。
6.控件条类: CControlBar 类 控件条子层次结构为工具条、状态条、对话条和分割窗口建立模型。该类是 CToolBar 、 CStatusBar 、 CDialogBar 的基类,负责管理工具条、状态条、对话条的一些成员函数。控件条指的是连接在主窗口框架的顶部或底部的小窗口
第 25页
7.绘画对象类: CGdiObject 类图形绘画对象子层次结构以 CGdiObject 类为根类,可用于建立绘画对象模型,如画笔、刷子、字体、位图、调色板等。
8 .设备描述表类: CDC 类该类及其子类支持设备描述表对象,是 CObject 类的子类。CDC 类是一个较大的类,包括许多成员函数,如映射函数、绘画工具函数、区域函数等,通过 CDC 对象的成员函数可以完成所有的绘画工作
第 26页
此类提供了许多通用服务,例如文件 I/O 、诊断和异常处理等,此外还包括如数组和列表等存放数据集的类
1.文件类: CFile 类和 CArchive 类 用以编写输入输出处理函数
2.异常类: CException 类是所有异常情况的基类。不能直接建立CException 对象,只能建立派生类的对象,用派生类来捕获指定的异常情况
3.模板收集类这些类可以将多种对象存放到数组、列表和“ 映射”中。但这些收集类是模板,它们的参数确定了存放在集合中的对象类型。
通用类通用类
第 27页
6.4MFC 6.4MFC 中全局函数和全局变量中全局函数和全局变量以 Afx 为前缀的函数 ( 数据库类函数和 DDX
函数除外 ) 和变量,在目前的版本中,都表示全局函数或全局变量。
AfxAbort : 无条件终止一个应用程序AfxBeginThread : 创建一个新线程并执行它AfxEndThread : 终止当前正在执行的线程AfxFormatString : 格式化字符串AfxMessageBox : 显示一个 Windows消息框AfxGetApp : 返回当前应用程序对象的指针AfxGetAppName : 返回应用程序的名称AfxGetMainWnd: 返回指向应用程序主窗口的指针AfxGetInstanceHandle :返回标识当前应用程序对象的句柄AfxRegisterWndClass :注册用于创建 Windows 窗口的窗口类
第 28页
6.56.5 创建第一个创建第一个 MFCMFC 程序程序
第 29页
Step1Step1
第 30页
Step2Step2
第 31页
Step3Step3
第 32页
Step4Step4
第 33页
Step5Step5
第 34页
Step6Step6
第 35页
Step7Step7
第 36页
单文档应用程序创建的类单文档应用程序创建的类
CAboutDlg 对话框类CMyMFCApp 应用程序类CMyMFCDoc 文档类CMyMFCView 视图类CMainFrame 框架类
第 37页
应用程序类应用程序类 CMyMFCApp CMyMFCApp
CMyMFCApp theApp;
virtual BOOL InitInstance();
第 38页
InitInstance();InitInstance();
是一个虚函数进行应用程序的初始化操作初始化正常,返回 TRUE
初始化失败,返回 FALSE,结束程序m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
第 39页
MyMFC.hMyMFC.h// MyMFC.h : main header file for the MYMFC application//#if !defined(AFX_MYMFC_H__355BF7F0_55F5_4A92_BF4C_E97A6904C503__INCLUDED_)#define AFX_MYMFC_H__355BF7F0_55F5_4A92_BF4C_E97A6904C503__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CMyMFCApp:// See MyMFC.cpp for the implementation of this class//class CMyMFCApp : public CWinApp{public:
CMyMFCApp();// Overrides
// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMyMFCApp)public:virtual BOOL InitInstance();//}}AFX_VIRTUAL
// Implementation//{{AFX_MSG(CMyMFCApp)afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSGDECLARE_MESSAGE_MAP()
};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_MYMFC_H__355BF7F0_55F5_4A92_BF4C_E97A6904C503__INCLUDED_)
第 40页
理解程序代码理解程序代码// MyMFC.h : main header file for the MYMFC application//#if !defined(AFX_MYMFC_H__355BF7F0_55F5_4A92_BF4C_E97A6904C503__INCLUDED_)#define AFX_MYMFC_H__355BF7F0_55F5_4A92_BF4C_E97A6904C503__INCLUDED_
#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols...#endif // !defined(AFX_MYMFC_H__355BF7F0_55F5_4A92_BF4C_E97A6904C503__INCLUDED
第 41页
条件编译指令条件编译指令
避免一个 .h文件被包含多次#ifndef xxx_h
//... .h文件的内容#define xxx_h
#endif
第 42页
域运算符域运算符
::
在MFC程序当中要使用 API,在 API前加 ::
第 43页
#pragma once
如果在多个文件中包含了同一个头文件,可以防止多次定义
第 44页
类类 CMyMFCAppCMyMFCAppclass CMyMFCApp : public CWinApp{public:
CMyMFCApp();
// Overrides 重写虚函数// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMyMFCApp)public:virtual BOOL InitInstance();//}}AFX_VIRTUAL
// Implementation 消息映射和函数 OnAppAbout()的声明//{{AFX_MSG(CMyMFCApp)afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSGDECLARE_MESSAGE_MAP()
};
第 45页
构造函数构造函数
CMyMFCApp::CMyMFCApp()
{// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
什么事情也没作???
第 46页
BOOL BOOL CMyMFCApp::InitInstance()CMyMFCApp::InitInstance()这个函数来完成初始化工作它有返回值AfxEnableControlContainer();使得应用程序包含 ActivX控件SetRegistryKey();注册关键字pDocTemplate;注册单文档模板处理命令行显示更新窗口
第 47页
消息映射消息映射BEGIN_MESSAGE_MAP(CMyMFCApp, CWinApp)
//{{AFX_MSG_MAP(CMyMFCApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
第 48页
这些消息映射表获取来自菜单的命令ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
注意消息映射后面没有“;” ;
ID_APP_ABOUT是一个菜单命令的 ID,单击该菜单选项将调用 OnAppAbout函数void CMyMFCApp::OnAppAbout()
{ CAboutDlg aboutDlg;
aboutDlg.DoModal();}
第 49页
一个更简单的一个更简单的 MFCMFC 程序程序//Hello.hclass CMyApp : public CWinApp{public: virtual BOOL InitInstance ();};
class CMainWindow : public CFrameWnd{public: CMainWindow ();
protected: afx_msg void OnPaint (); DECLARE_MESSAGE_MAP ()};
第 50页
hello.cpphello.cpp#include <afxwin.h>#include "Hello.h"CMyApp myApp;/////////////////////////////////////////////////////////////////////////// CMyApp member functions
BOOL CMyApp::InitInstance (){ m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow (); return TRUE;}/////////////////////////////////////////////////////////////////////////// CMainWindow message map and member functions
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT ()END_MESSAGE_MAP ()CMainWindow::CMainWindow (){ Create (NULL, _T ("The Hello Application"));}
void CMainWindow::OnPaint (){ CPaintDC dc (this); CRect rect; GetClientRect (&rect);
dc.DrawText (_T ("Hello, MFC"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);}
第 51页
第 52页
第 53页