MFC 学习报告
Windows 编程的特点及基本概念
事件驱动的程序设计
事件驱动由消息循环来实现的
Windows 消息来源:
- 输入消息:包括键盘和鼠标的输入
- 控制消息:用来与控制对象(如列表框、按钮、检查框等)进行双向通信
当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息不经过应用消息队列,而是直接发送到控制对象上去 - 系统信息:对程序化的事件或系统时钟中断作出反应
一些系统消息,像 DDX 消息(动态数据交换消息)要通过系统消息队列,而有的则不通过系统消息队列而直接进入应用程序的消息队列,如创建窗口消息 - 用户消息:自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理
图形输出
- 控制台程序独占整个屏幕,其他程序在后台等待。而 Windows 应用程序只对屏幕的一部分窗口进行处理
- Windows 程序的的所有输出都是图形。Windows 提供了丰富的图形函数用于图形输出
- Windows 输出是与设备无关的,通过 GDI (Graphics Device Interface)
基本概念
窗口
winuser.h
中定义了代表窗口的WNDCLASS
结构类型
1 | typedef struct tagWNDCLASS{ |
事件与消息
winuser.h
中,消息结构定义
1 | typedef struct tagMSG |
message
标识消息的消息值或消息名
WM_
窗口消息BM_
控件消息EM_
编辑框控件消息LB_
列表框控件消息
WM_CREATE
0X0001 创建窗口产生消息WM_DESTROY
0X0002 撤销窗口产生消息WM_PAINT
0X000F 重画窗口产生消息WM_CLOSE
0X0010 关闭窗口产生消息WM_CHAR
0X0102 按下非系统键产生消息WM_USER
0X0400 用户自定义消息WM_USER+n
wParam
和lParam
都是32位消息参数,定义在 windef.h
下
1 | typedef UINT WPARAM; |
pt
消息进入消息队列时鼠标指针的屏幕坐标
POINT
定义在 windef.h
中的结构体,表示屏幕上的一个点
1 | typedef struct tagPOINT |
资源共享
基本模式
- 向 Windows 系统请求资源
- 使用
- 释放资源给系统以供其他程序使用
数据类型
数据类型 | 说明 |
---|---|
BYTE | 8位无符号字符 |
BSTR | 32位字符指针 |
COLORREF | 32位整数,表示一个颜色 |
WORD | 16位无符号整数 |
LONG | 32位有符号整数 |
DWORD | 32位无符号整数,WORD的两倍长度 |
UINT | 32位无符号整数 |
BOOL | 布尔值 |
HANDLE | 句柄 |
LPSTR | 32位指针,指向字符 |
LPCSTR | 32位指针,指向字符串常量 |
LPTSTR | 32位指针,指向字符串,可移植到 Unicode 和 DBCS 双字符集 |
LPCTSTR | 32位指针,指向字符串常量,可移植到 Unicode 和 DBCS 双字符集 |
LPVOID | 32位指针,可指向任何类型数据 |
LPRESULT | 32位数值,作为窗口函数或 CALLBACK 函数的返回类型 |
WNDPROC | 32位指针,指向一个窗口函数 |
句柄
用于识别应用程序对象的一个无重复整数,也可以看作赋予对象的唯一名称。在给一个对象赋予句柄以后,就可以通过此句柄完成对该对象的引用了
句柄是一个四字节长的整数
句柄类型 | 说明 |
---|---|
HWND | 标识窗口的句柄 |
HINSTANCE | 标识当前实例的句柄 |
HPEN | 标识画笔的句柄 |
HBRUSH | 标识画刷的句柄 |
HDC | 标识设备环境的句柄 |
HMENU | 标识菜单的句柄 |
HFIFE | 标识文件的句柄 |
HFONT | 标识字体的句柄 |
资源
程序使用的资源被集中在一个资源文件中进行定义
动态链接库
DLL(Dynamic Linkable Library) 允许应用程序共享代码和资源的可执行模块。
Windows 程序的基本结构
Windows 程序的入口为 WinMain
函数
利用 MFC (Microsoft Foundation Class Library) 创建 Windows 程序
- AppWizard:生成初步的框架文件
- 资源编辑器:帮助直观的设计用户接口
- ClassWizard:协助添加代码到框架文件
类型 | 文件名称 | 功能描述 |
---|---|---|
框架窗口类实现文件 | MainFrm.h , MainFrm.cpp | 包含窗口类 CMainFrame 的实现代码,负责创建标题栏、菜单栏、工具栏和状态栏。实现应用程序的主窗口 |
文档类实现文件 | MySDIDoc.h , MySDIDoc.cpp | 应用程序数据的保存和装载,实现文档的序列化功能。OnNewDocument() 新建文档。Serialize() 文档数据的磁盘读写 |
视图类实现文件 | MySDIView.h , MySDIView.cpp | 客户区文档数据的显示,如何进行人机交互。GetDocument() 获取 m_pDocument ,OnDraw() 文档数据显示 |
应用程序类实现文件 | MySDI.h , MySDI.cpp | 应用程序的主函数文件,应用程序的初始化、启动运行和结束 |
资源文件 | Resource.h | 资源标识符放在此文件中 |
应用程序生成的资源文件 | MySDI.rc , MySDI.rc2 | rc 用资源编辑器进行可视化编辑,rc2 不能编辑 |
应用程序生成的资源文件 | MySDI.ico | 图形编辑器编辑图标文件 |
应用程序生成的资源文件 | MySDIDoc.ico | 文档图标一般用于多文档应用程序中,可通过相关函数获取并显示图标 |
应用程序生成的资源文件 | Toolbar.bmp | 工具栏中所有按钮的图标显示 |
标准包含文件 | StdAfx.h , StdAfx.cpp | 用来生成预编译文件 |
基本类
CObject
类
根类
1. 在程序运行时,可获得对象的大小、类名、动态创建类的实例2. 提供了把对象状态调转给调试机制的能力,类似于判断当前对象的数据成员是否有效3. 具有把对象的数据存进文件或从文件中提取数据重建对象的能力
CCmdTarget
类
是 CObject
的子类,具有消息映射属性的类的公共基类,封装了窗口函数
子类有 CWinThread
, CWnd
, CDocument
CWnd
类
提供所有窗口类的基本功能。CWnd
派生的类可以拥有自己的窗口,并对它进行控制
CFrameWnd
和 CView
是 CWnd
的子类,前者是创建和维护窗口的边框、菜单栏、工具栏、状态栏,负责显示和搜索用户命令,后者负责为文档提供一个或几个视图
视图的作用是为修改、查询文档等任务提供人机交互界面
CDocument
类
负责装载和维护文档数据,数据的变化、存取都是通过文档实现的
视图窗口通过文档对象来访问和更新数据
CView
类
和文档类联系在一起,在文档和用户之间起中介作用,即在屏幕上显示文档的内容,并把用户输入转换成对文档的操作
CDocTemplate
类
文档模板类对象由应用对象在 InitInstance()
函数中构造生成。它分为单文档模板类 (CSingleDocTemplate) 和多文档模板 (CMultiDocTemplate),分别对应 SDI 应用程序和 MDI
应用。
应用类对象通常只生成一个文档模板类对象
CWinThread
类
多线程类。所有应用程序至少有一个线程
CWinApp
类
是 CWinThread
的子类,封装了初始化、运行、终止应用程序的代码
一个 MFC 应用程序并不直接操纵上述类,而是以上述类为基类派生新的类,构建基本框架