Presentation is loading. Please wait.

Presentation is loading. Please wait.

教学安排 授课24学时,第1~13周,星期四7、8节 上机时间:第4,7,9,11,13,14周,星期三7、8节 第 15 周考试.

Similar presentations


Presentation on theme: "教学安排 授课24学时,第1~13周,星期四7、8节 上机时间:第4,7,9,11,13,14周,星期三7、8节 第 15 周考试."— Presentation transcript:

1 教学安排 授课24学时,第1~13周,星期四7、8节 上机时间:第4,7,9,11,13,14周,星期三7、8节 第 15 周考试

2 第一章 Windows 程序设计初步

3 一. Windows 系统的特征 标准的用户界面 多任务 设备独立性 动态链接 强大的内存管理

4 二. 基本术语 窗口 (window) 由句柄唯一标识 对话框 (Dialog) 人机交互 图标 (Icon) 代表某项操作或程序的图符
二. 基本术语 窗口 (window) 由句柄唯一标识 对话框 (Dialog) 人机交互 图标 (Icon) 代表某项操作或程序的图符 位图 (Bitmap) 用位模式形成的图像 菜单(Menu) 命令 工具栏 (ToolBar) 常用的菜单项 状态栏 (StateBar) 操作状态或操作提示

5 二. 基本术语(续) 句柄 : 用来标识资源的32位无符号整数 HANDLE 一般句柄 HINSTANCE 实例句柄 HWND 窗口句柄
二. 基本术语(续) 句柄 : 用来标识资源的32位无符号整数 HANDLE 一般句柄 HINSTANCE 实例句柄 HWND 窗口句柄 HMENU 菜单句柄 HICON 图标句柄 HCURSOR 光标句柄 HBITMAP 位图句柄

6 三. Windows 编程的特点 1. 消息驱动体系 DOS 编程方式属过程驱动。 Windows 编程方式属消息驱动
(程序的工作是产生消息,传递消息和处理消息)。

7 开始 过程1 过程2 ... 过程n 结束 开始 事件1 事件2 事件3 …... 事件n 结束 事件驱动编程模型 过程驱动编程模型 消息
处理 事件1 事件2 事件3 …... 事件n 开始 结束 事件驱动编程模型

8 事件 事件是对计算机操作的动作 。每个事件对应一个消息,即每个事件发生的效果是产生消息。

9 消息 消息的功能: (1)帮助Windows实现多任务 (2)通知应用程序某一事件已经发生,各应用程序给予响应

10 消息的表示 消息本身内容 UINT message 32位无符号整数 附加信息 WPARAM wParam LPARAM lParam

11 消息的定义 typedef struct tagMSG { HWND hwnd; //接收窗口 UINT message; //消息标识
WPARAM wParam; //附加 LPARAM lParam; //附加 DWORD time; //入队时间 POINT pt; //光标位置 } MSG; //…\vc\include\wtypes.h

12 消息的种类 …vc\include\winuser.h
标准Windows消息 除WM_COMMAND外,所有以WM_ 为前缀的消息,由窗口和视图处理。 控制消息 由控件和子窗口发给父窗口的消息。 命令消息 来自用户接口对象。如:菜单、工具条和加速键等。

13 消息的产生 用户产生消息 Windows 本身产生消息 应用程序本身产生消息 其他应用程序产生消息

14 消息的传递 Windows系统有一个存放消息的队列,每个应用程序也有一个消息队列。Windows系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中。应用程序则从自身的队列中获取消息并进行处理。

15 事件 事件 事件 系统消息队列 应用程序队列 应用程序队列 应用程序队列 应用程序 应用程序 应用程序

16 消息的处理 每个窗口对应一个窗口函数,负责处理该窗口的所有消息. 窗口函数具有4个参数: HWND 型 窗口句柄 UINT 型 消息内容
WPARAM 型 附加信息 LPARAM 型 附加信息

17 2. 窗口 通常每个Windows 应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件。

18 3. Windows 应用程序接口 API 是由Windows操作系统提供的函数定义、参数定义和消息格式的集合。可供应用程序使用。
(Application Programming Interface) API 是由Windows操作系统提供的函数定义、参数定义和消息格式的集合。可供应用程序使用。

19 API分类 窗口管理接口函数 图形设备接口函数 系统服务接口函数

20 三种编程方法 基于C语言和SDK工具: 直接使用API,易于理解工作原理。 基于C++和MFC类库 :以基本类库作为应用程序的接口。
基于Appwizard 的程序设计环境,即自动生成应用程序框架。

21 4. 命名规则 函数命名规则 函数名 = 动词 + 名词 动词和名词的第一个字母必须大写 例 GetMessage 变量命名规则
4. 命名规则 函数命名规则 函数名 = 动词 + 名词 动词和名词的第一个字母必须大写 例 GetMessage 变量命名规则 小写字母前缀表示变量的类型,其余 的部分描述变量的功能 例 nCount

22 数据类型 定义 Win 变量名 BOOL int 位符号数 bOk INT int 位符号数 nCount UINT unsigned int 位无符号数 uMsg LONG long 位符号数 lTotalSize

23 四. Windows 应用程序结构 至少包含两个函数: WinMain ( ) : 必有且仅有一个。
窗口函数 : 每个窗口对应一个窗口函数,以响应该窗口的消息。

24 WinMain ( )函数需完成的功能 定义窗口类 注册窗口类 建立窗口类的窗口 显示窗口 运行消息循环

25 WinMain( )函数的原型 int WINAPI WinMain (HINSTANCE hThisInst, //当前实例
HINSTANCE hPrevInst, //前一个实例 PSTR pszCmdLine, //指向命令行指针 int nCmdShow ) //显示方式

26 窗口类  WNDCLASS UINT style; //窗口类风格 WNDPROC lpfnWndProc; //窗口函数
int cbWndExtra; //窗口额外信息 int cbClsExtra; //类结构额外信息 HINSTANCE hInstance; //实例句柄

27 窗口类  WNDCLASS HICON hIcon; //图标句柄 HCURSOR hCursor; //光标句柄
HBRUSH hbrBackground; //窗口背景画刷句柄 LPCSTR lpszMenuName; //主菜单资源句柄 LPCSTR lpszClassName //窗口类名字

28 hCursor 加载函数 HCURSOR LoadCursor ( HINSTANCE hInst, LPCSTR lpszName)

29 注册窗口类 ATOM RegisterClass (CONST WNDCLASS *lpWClass) 功能: 登记窗口类
功能: 登记窗口类 返回: 窗口类的唯一值 参数: 窗口类地址

30 创建窗口 HWND CreateWindow ( LPCSTR lpClassName, //窗口类名
LPCSTR lpWinName, //标题 DWORD dwstyle, //风格 int x,int y, //位置

31 创建窗口 int nWidth,int nHeight, //窗口长宽 HWND hParent, //父窗口句柄
HMENU hMenu, //菜单 HINSTANCE hThisInst, //实例 LPVOID lpszAdditional) //附加信息

32 窗口显示函数 BOOL ShowWindow ( HWND hwnd, int nCmdShow) 功能:显示或隐藏窗口
返回值:可见状态 : 返回非零 ; 隐藏状态 : 返回零 nCmdShow可取的值: SW_HIDE 删除窗口 SW_MINIMIZ 极小化成一个图标 SW_MAXIMIZE 极大化成一个图标 SW_RESTORE 恢复成正常窗口

33 更新用户区域 BOOL UpdateWindow ( HWND hwnd ) 返回:更新成功返回真 参数:窗口句柄

34 获取消息 BOOL GetMessage ( LPMSG lpMsg, //存放消息 HWND hwnd,
//获取该窗口的消息,若为NULL, 则获取该应用程序的所有消息 UINT uMsgMin, //消息范围 UINT uMsgMax); 遇WM_QUIT消息为零

35 BOOL TranslateMessage
(LPMSG lpMsg) 功能:将虚拟键消息转换成字符消息 BOOL DispatchMessage (LPMSG lpMsg) 功能:驱动Windows,把消息传递给相应的窗口函数。

36 窗口函数 窗口函数负责处理从系统接收 的输入消息和窗口管理消息。 它由 Windows 直接调用。

37 PostQuitMessage(nExitCode)
功能:发送WM_QUIT消息给系统, 以通知系统应用程序要结束 DefWindowProc(hwnd,message, wParam,lParam) 消息缺省处理函数

38 *.c, *.ccp *.obj *.exe *.res *.rc 应用程序 开发过程
文本编辑器 连接器 编译器 资源编译器 资源开发工具 *.c, *.ccp *.obj *.exe *.res *.rc 资源连接器 应用程序 开发过程

39 第二章 MFC应用程序基本结构

40 “应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。
一。应用程序框架 “应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。

41 应用程序的体系结构 基于框架窗口的应用程序 基于对话框的应用程序 基于文档/视图的应用程序

42 与基于框架窗口的程序框架有关的 MFC类结构
CCmdTarget CWinThread CWinApp CWnd CFrameWnd CObject

43 CCmdTarget类 CCmdTarget 是 MFC 消息映射 结构的基类。消息映射将命令或 消息发送给应用程序编写的处理
命令或消息的响应函数。具有消 息处理能力的类均应为该类的派 生类。

44 CWinThread 类 Microsoft 的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。CWinThread 封装了操作系统的调度功能。

45 CWinApp类 CWinApp 封装了 Windows 应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从CWinApp派生的类对象。

46 CWnd类 CWnd是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。

47 CFrameWnd类 提供了一个 Windows 单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。

48 基于框架窗口的应用程序结构的类关系 CWinApp 应用程序对象 m_pMainWnd CFrameWnd 应用程序框架窗口

49 程序执行过程 WinMain(入口) 初始化应用程序 CHelloApp::InitApplication 初始化实例
CHelloApp::InitInstance CHelloWnd::CHelloWnd CWnd::ShowWindow CWnd::UpdateWindow CWinApp::Run CWindApp::ExitInstance CWnd::Create CHelloApp::InitApplication 初始化应用程序 初始化实例 创建窗口 显示窗口 进入消息循环 结束应用程序

50 WinMain函数 WinMain函数是应用程序的入口。
用户不需要编写该函数代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,Windows自动调用该函数。

51 CWinApp 对象 CWinApp 的派生类对象要作为全程量定义。WinMain 函数将会调用 InitApplication和 InitInstance 成员函数。注意:InitInstance是必须覆盖的成员函数。

52 InitInstance成员函数 通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。 New ShowWindow
UpdateWindow

53 Run 及 ExitInstance成员函数
初始化后,WinMain自动调用 Run,它主要负责执行消息循环。 退出应用程序时,WinMain要调用ExitInstace成员函数。

54 二。MFC 的消息处理机制 框架利用消息映像机制将发给对象的消息映射到类方法上,使相应的窗口或控件自动地处理消息。

55 消息映射的实现 说明:在处理消息的窗口类中说明消息响应函数: 消息响应函数原型 实现:在实现程序中说明消息映射 … 各种消息映射宏
DECLARE_MESSAGE_MAP( ) 实现:在实现程序中说明消息映射 BEGIN_MESSAGE_MAP(派生类,基类) … 各种消息映射宏 END_MESSAGE_MAP( )

56 消息映射项和处理方法 消息响应函数原型: 消息映射宏: 消息响应函数的搜索路径: 自下而上,直到 CCmdTarget
afx_msg void ClassMethod( ) 消息映射宏: ON_MessageName(ID,ClassMethod) 消息响应函数的搜索路径: 自下而上,直到 CCmdTarget

57 三。窗口输入消息处理 输入消息分类 鼠标消息: 用户区与非用户区 键盘消息: 系统键消息与非系统键消息

58 鼠标输入消息 afx_msg void OnMouse_ (UINT nFlags,Cpoint point)
afx_msg void On_Button_ (UINT nFlags,CPoint point) nFlags:标识同时按下的虚拟键 point:光标所在的位置

59 键盘输入消息 afx_msg void On_(UINT nChar, UINT nRepCnt,UINT nFlags)
nChar:输入字符的ASCII nRepCnt:重复击键的次数 nFlags:虚拟键码...

60 第三章 利用AppWizard创建应用程序

61 主要负责初始化、运行和结束应用程序的执行。
CCmdTarget CWinThread CWinApp CWnd CFrameWnd CObject 结论: CFrameWnd派生类 的负担过重。 负责管理操作数据及显示,并接收用户的输入。

62 文档、视窗框架结构 主要思想:将原CFrameWnd派生类的任务分配给文档类(CDocument)和视窗类(CView)。文档类主要负责管理数据;视窗类主要负责显示文档内容,接收用户的输入。

63 文档、视窗框架涉及的主要类 文档类(CDocument) 管理程序操作的数据 视窗(CView) 显示数据并接收用户的输入和编辑信息
边框窗口(CFrameWnd) 管理视窗

64 文档、视窗框架涉及的主要类 文档模板(CSingleDocTemplate、CMultiDocTemplate)
负责协调文档、视窗和边框窗口的工作。通常,一种特定的文档模板创建并管理已打开的同种类型的所有文档 应用程序类(CWinApp) 控制应用程序的开始运行、初始化和结束

65 AppWizard、ClassWizard和资源编辑器
AppWizard:创建MFC应用程序 ClassWizard: 创建Windows消息和命令的处理函数 创建类成员变量 创建和管理类 资源编辑器:创建并编辑菜单 、对话框、定制控制框、加速键、位图、图标、光标、字符串和版本等资源

66 利用AppWizard编写程序的基本步骤
2、若需要增加类成员,利用ClassWizard添加 3、若需要重载成员函数,利用ClassWizard添加相应的消息映射关系,并填写函数体 4、若需要定义类,利用ClassWizard进行定义

67 一个简单的应用程序中的对象 Toolbar View Document Status Bar CFrameWnd
Application Object Document Template Document Toolbar Status Bar View CFrameWnd

68 使用文档/视窗结构的意义 将数据操作与数据显示分开,可以简化工作量; 一组数据可以同时以不同的形式显示在多个视窗中;
类库提供了选择文件、打开文件和关闭文件的管理; 支持打印预览功能

69 视窗类 CObject CWnd CView CCmdTarget CScrollView CFormView CRecordView
CEditView CRecordView 视窗类

70 视窗类中的OnDraw成员函数 每次当视窗需要被重新绘制时,应用程序框架就要调用OnDraw函数。 驱使程序调用OnDraw的两个途径:
用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据; 程序中调用Invalidate(或者InvalidateRect),通知Windows调用OnDraw函数

71 第四章 图形设备接口

72 一. MFC设备描述表类 应用程序 MFC设备描述表 图形设备接口(GDI) 设备驱动程序 物理硬件 设备描述表类

73 CDC类的主要功 能是定义设备描述表对象;提供在显示器上绘图和在打印机上图形输出的方法。
MFC提供的设备描述表类 CDC类的主要功 能是定义设备描述表对象;提供在显示器上绘图和在打印机上图形输出的方法。 CObject CMetaFileDC CDC CPaintDC CClientDC CWindowDC

74 CDC 类 CDC 类封装了DC和GDI。 DC的句柄在CDC类中是一个public成员(m_hDC)。
不同的设备和屏幕区域,派生出不同的子类。通常使用这些子类。 所有 GDI 函数都以 CDC 类成员函数的形式出现。

75 CClientDC类 该类中的设备描述表表示窗口的客户区。客户区左上角的坐标为(0,0)
CClientDC 的构造函数调用 GetDC( ),析构函数调用 ReleaseDC( )

76 CClientDC的使用步骤 1、创建CClientDC对象 2、在CClientDC对象上绘画 3、撤消CClientDC对象

77 CWindowDC类 该类的设备描述表表示整个窗口(包括用户区和非用户区)
CWindowDC 的构造函数调用 GetDC( ),析构函数调用 ReleaseDC( ) 使用方式同CClientDC

78 CPaintDC类 如果需要重新编写视窗类中的OnPaint函数,就需要使用CPaintDC类
通常在处理WM_PAINT 消息时,系统自动调用OnPaint(只显示在屏幕上),OnPaint函数再调用OnDraw函数(可以同时显示在屏幕和打印机上) CPaintDC类的构造函数将调用BeginPaint( ),析构函数调用EndPaint( )。

79 CPaintDC的使用格式 Void CMainWnd::OnPaint( ) {
CPaintDC dc(this); //参数为CWnd * CRect rc; GetClientRect(&rc); 利用CDC中的有关绘画的成员函数进行绘画 OnDraw(&dc); }

80 CMetaFileDC类与元文件 元文件包含在设备描述表上创建图像或正文的GDI命令序列。 使用方法:
2、调用CMetaFileDC::Create( )方法初始化该对象 3、发送CDC GDI命令到该对象 4、调用CMetaFileDC::Close( )关闭元文件 5、调用CDC::PlayMetaFile( )方法回放元文件

81 二. 图形对象 图形对象类是 MFC 封装的 Windows 绘图工具 笔类 刷子类 字体类 位图类 调色板类 区域类 CObject
CGdiObject CPen CBrush CFont CBitmap CPalette CRgn 笔类 刷子类 字体类 位图类 调色板类 区域类

82 使用各种图形对象的基本步骤 1、定义图形对象,用Create* ( )方法初始化对象。
2、使用 CDC::SelectObject( ) 方法,选择新对象进入当前设备描述表。 3、结束时,恢复原始的图形对象。

83 CPen 类  笔的样式 PS_SOLID 实线笔 PS_DASH 宽度为1时的虚线笔 PS_DOT 宽度为1时的点线笔
PS_DASHDOT 宽度为1时的虚线及点交替笔 PS_DASHDOTDOT 宽度为1的虚线及双点交替笔 PS_NULL 空笔 PS_INSIDEFRAME 在 Win GDI边界内绘制形状的笔 BOOL CreatePen(int nPenStyle,int nWidth, COLORREF crColor)

84 常用的使用格式 CClientDC dc(this); CPen NewPen,*OldPen;
NewPen.CreatePen(PS_DASH,1,RGB(255,0,0)); OldPen=dc.SelectObject(&NewPen); 使用该笔进行绘画; dc.SelectObject(OldPen);

85 CBrush 类 可直接利用构造函数CBrush::CBrush( )创建Windows刷子。 CBrush( );
CBrush(COLORREF crColor); CBrush(int nIndex,COLORREF crColor); CBrush(CBitmap* pBitmap); crColor 刷子颜色 nIndex 刷子图案

86 刷子阴影线样式 HS_BDIAGONAL 45o下降阴影线 HS_CROSS 水平和垂直交叉阴影线
HS_DIAGCROSS o十字交叉阴影线 HS_FDIAGONAL o上升阴影线 HS_HORIZONTAL 水平阴影线 HS_VERTICAL 垂直阴影线

87 刷子应用举例 CPaintDC dc(this); CBrush br(HS_BFDIAGONAL,RGB(0,0,255));
CBush *pbrOld=dc.SelectObject(&br); 使用该刷子进行绘画; dc.SelectObject(pbrOld);

88 在窗口中显示文本 常用的两个CDC类的成员函数: 1、在一个矩形内显示文本串 int DrawText( 返回文本行的高度
LPCTSTR lpszString, 显示的字符串 int nCount, 显示的字符个数 LPRECT lpRect, 矩形位置 UINT nFormat) 文本显示格式

89 2。在指定位置显示文本串 BOOL TextOut(int x, int y, CString& str)
LPCSTR lpString, int nCount) 显示成功返回true,否则,返回false

90 文本输出的设置 对齐方式: 利用CDC类的SetTextAlign函数 文本前景色: 利用DCD类的SetTextColor函数
文本的背景模式: 利用DCD类的SetBkMode函数

91 Windows系统字体的使用 Windows有六种库存字体。 ANSI_FIXED_FONT 固定宽度 ANSI_VAR_FONT 变宽
DEVICE_DEFAULT_FONT 设备默认字体 OEM_FIXED_FONT 固定宽度 SYSTEM_FIXED_FONT 固定高度 SYSTEM_FONT 均匀间距

92 使用系统字体举例 CFont *pOldFont= (CFont*)dc.SelectStockObject
(ANSI_FIXED_FONT); char msg[ ]=“Hello,World”; dc.TextOut(20,50,msg,strlen(msg)); …… dc.SelectObject(pOldFont);

93 显示位图的基本步骤 1、定义CBitmap对象 2、创建并初始化位图 LoadBit( ) 和 CreateBitmap( )
3、获取兼容的内存设备文本 4、将位图选入内存设备文本 5、利用BitBlt或StretchBlt函数显示位图 6、结束处理

94 几个处理函数 PatBlt(目标矩形,光栅操作 ) 进行目标区域与当前刷子的光栅操作 BitBlt( 目标矩形,源设备,源位置,光栅操作)
进行目标区域与源设备的光栅操作 StretchBlt(目标矩形,源设备,源矩形,光栅操作) 同BitBlt,但具有缩放功能

95 CRgn类 CRgn类封装了Windows图形设备接口区域。这一区域是某一个窗口中的一个椭圆或多边形区域。程序员可以利用提供的成员函数创建、修改和检索区域对象的信息。

96 三、坐标映射方式 GDI支持两种坐标系统: 设备坐标:以像素为单位 逻辑坐标:多种
GetSystemMetrics(SM_CXSCREEN) GetSystemMetrics(SM_CYSCREEN) 逻辑坐标:多种

97 图形显示结果 逻辑坐标 (窗口坐标) 显示结果取 决映射方式 MM_TEXT 为缺省方式 物理坐标 (视口坐标)

98 “固定比例”的映射方式 这种映射方式可改变视口原点,但不能改变比例因子。 MM_LOENGLISH 0.01英寸
MM_HIENGLISH 英寸 MM_LOMETRIC 毫米 MM_HIMETRIC 毫米 MM_TWIPS /1440英寸

99 “可变比例”的映射方式 以下两种映射方式可改变比例因子及原坐标 逻辑坐标转化为物理坐标的公式: MM_ISOTROPIC 纵横比为1:1
MM_ANISOTROPIC x 和 y的比例可独立变化 逻辑坐标转化为物理坐标的公式: x(y)比例因子= x(y)视口范围/ x(y)窗口范围 设备x(y) =逻辑x(y)* x(y)比例因子+ x(y)坐标原点

100 处理映射方式的几个DCD成员函数 SetViewportExt( ) 获取视图尺寸 SetViewportOrg( ) 获取视图原点
SetWindowExt( ) 获取窗口尺寸 SetWindowOrg( ) 获取窗口原点

101 菜单、加速键、工具栏、状态栏和字符串资源
第五章 菜单、加速键、工具栏、状态栏和字符串资源

102 一。菜单 菜单的分类: 菜单栏与上下文弹出式菜单 静态与动态 菜单的创建手段: 菜单资源模板 利用成员函数动态生成

103 菜单项的组成 两个必要部分: 字符串名:显示的菜单项内容
整数标识符:该菜单项的唯一标识。以宏的形式在 MFC 环境提供的resource.h或用户自定义的头文件中定义。缺省形式为: ID_菜单的字符串名

104 通过菜单资源模板建立静态菜单 1、利用菜单编辑器修改IDR_MAINFRAME菜单的格式 2、在相应的类中添加消息处理函数
3、填写消息处理函数的内容

105 消息响应函数的寻找路径 SDI应用程序 视图 文档 SDI主框架窗口 应用程序 MDI应用程序 视图 文档 MDI子框架窗口

106 更新命令用户界面消息控制函数 当我们希望根据程序的运行修改菜单项的显示状态时,就需要重载更新命令用户界面消息控制函数。
在应用程序的执行过程中,每当弹出式菜单的第一次显示时,都会调用更新命令用户界面(UI)控制函数。该函数的参数是一个指向CCmdUI对象的指针,而CCmdUI对象包含了一个指向相应菜单项的指针。

107 修改菜单项显示状态的方法 基本步骤: 为每个需要修改显示状态的菜单项加入UPDATE_COMMAND_UI消息映射;
编写更新命令用户界面控制函数的内容。 几个函数: Enable(bOn) true:激活;false:禁用 SetCheck(nCheck) 0:未拾取;1:拾取;2:不确定 SetRadio(bOn) 同Enable SetText(CString) 设置菜单项显示文字

108 动态创建和使用菜单 在CWinApp的派生类中定义CMenu的指针的数据成员并在构造函数中创建
在CWinApp的派生类的InitInstance函数中添加: pMenu->LoadMenu(IDR_MENU1); m_pMainWnd->SetMenu(pMenu); 在相应类中增加菜单项的消息处理函数映射及内容 在CWinApp派生类的析构函数中删除CMenu对象

109 动态修改菜单 利用CWnd类的GetMenu成员函数获取菜单指针 利用CMenu类的几个函数修改菜单项 最后删除菜单
ModifyMenu:修改制定未知处已有的菜单项 InsertMenu:在制定位置处插入一个菜单项 DeleteMenu:从菜单中删除指定菜单项 最后删除菜单

110 上下文弹出式菜单的创建 利用资源编辑器设计菜单资源 在视窗类中映射WM_CONTEXTMENU消息 定义每个菜单项的处理函数
加载菜单资源LoadMenu 获取弹出式菜单 显示弹出式菜单

111 二。加速键(快捷键) 加速键的创建: ALT+形式的快捷键可以在建立菜单时建立 其他形式的快捷键需利用资源编辑器创建 (命令ID、键和类型)
加速键的加载 若加速键资源的ID不是IDR_MAINFRAME,需利用CFrameWnd 的成员函数LoadAccelTable( )将其加载,每次只能加载一个加速键资源

112 控制栏和应用程序框架 CControlBar 支持的控制栏位于主框架窗口内,它能够随着主框架窗口的尺寸改变或移动自动地调整自己的尺寸和位置。其构造、析构函数以及创建均由应用程序框架管理。 CWnd CControlBar CToolBar CStatusBar

113 三。工具栏 工具栏对象包含了一些水平(或垂直)排列的图形按钮,它们可以以成组的方式存在
工具栏中所有按钮的图形都被存储在一个位图中,而该位图被定义在应用程序的资源文件中 同菜单和加速键一样,工具栏的按钮被按下时会发出相应的命令消息 可以利用更新命令UI消息控制函数更新工具栏中的按钮状态

114 建立工具栏的基本步骤 利用资源编辑器创建按钮位图 设置工具条按钮与命令ID之间的映射

115 工具栏更新命令UI消息控制函数 若更改菜单项的显示状态,需要重载更新命令UI消息控制函数,并在此函数中利用Enable和SetCheck函数进行设置,这个设置也同样对工具栏生效。

116 四。状态栏 状态栏窗口既不接收用户输入也不产生命令消息。它的作用就是在程序的控制下在窗口中显示一些文本。
状态栏可支持两种类型的文本窗口:信息行窗格和状态指示器窗格。 若要显示一些应用程序的特殊数据,首先必须禁止标准状态栏显示菜单提示和键盘状态。

117 状态栏的定义 AppWizard在MainFrm.cpp文件中所产生的静态indicator数组就是用来定义状态栏的。其中ID_SEPARATOR是用来标识信息行窗格(左侧)的,而其他常量字符串资源是用来标识指示器窗格(右侧)的。 CStatusBar::SetIndicators成员函数被用来根据indicators数组的内容对状态栏进行设置,它在应用程序的派生框架类中被调用。

118 信息行 信息行窗格中所显示的是程序动态提供的字符串。为了对信息行的内容进行设置,我们必须首先访问状态栏对象,然后再用一个从0开始的索引参数调用成员函数CStatusBar:: SetPaneText。

119 CMainFrame* pFrame= (CMainFrame*)AfxGetApp( )->m_pMainWnd; CStatusBar* pStatus=(CStatusBar*)pFrame->GetDescendantWindow(ID); pStatus->SetPaneText(0,字符串);

120

121 五。字符串表 使用字符串资源的好处: 简化应用程序代码 易转换成其它语言 每个字符串资源有唯一的标识符标识 创建方式: 字符串资源编辑器

122 字符串表的使用方法 定义CString类对象 利用CString的LoadString( )成员函数装载字符串资源到CString对象中

123 第六章 对话框

124 一。对话框的使用 对话框是一种重要的用户界面组件。它是一种特殊的窗口。通常处理两种消息: WM_INITDIALOG 创建后显示前
WM_COMMAND 对控件操作

125 对话框的种类 模式对话框 使父窗口无效获得对应用程序的控制 无模式对话框 无需取消对话框就可继续执行其他任务

126 CDialog类 MFC 提供的 CDialog 类封装了对话模板与使用对话框时必须使用的方法。

127 使用对话框的基本步骤 1、利用对话框编辑器创建对话框模板的资源文件 2、生成对话框类的派生类 3、定义派生类对象Dlg;
Dlg.DoModal( );

128 二。标准的公用对话框 MFC提供类六种标准公用对话框: CColorDialog 颜色设置 CFileDialog 文件操作
CFontDialog 字体设置 CFindReplaceDialog 替换 CPrintDialog 打印 CPageSetup 页面设置

129 使用CColorDialog的步骤 定义CColorDialog对象,并用构造函数进行初始化。
使用DoModal( )函数显示对话框实现用户交互。 使用GetColor函数获取用户选择的颜色。

130 举例 CColorDialog c(0,CC_FULLOPEN|CC_RGBINIT,this); if (c.DoModal( )){
cr=c.GetColor( ); } (cr是COLORREF类型)

131 使用CFontDialog的基本步骤 定义CFontDialog类的一个对象 调用DoModal成员函数
显示文字 恢复源字体

132 构造CFontDialog对象 CFontDialog( LPLOGFONT lplfInitial=NULL,
DWORD dwFlags=CF_EFFECTS|CF_SCREENFONTS, CDC* pdcPrinter=NULL, CWnd* pParentWnd=NULL )

133 三。与对话框进行数据交换 利用MFC的对话数据交换(DDX)可自动初始化控件并收集用户的输入 DoDataExchange
(CDataExchange*pDx) { DDX_Text(pDx,ControlID,var); … }

134 数据的初始化及更新 当用户单击OK时,OnOK( )默认作用是调用UpdateData( ),并触发DoDateExchange( )来透明地更新变量。

135 数据有效性操作 MFC提供的DDV可自动地对控件中数据的有效性进行检验。 DDV_Control(pDx,ControlID,范围)

136 第七章 控件类

137 控件类 CObject CWnd 静态文本 CStatic 按钮 列表框 CButton 组合框 滚动条 CListBox 编辑框
CCmdTarget CWnd CStatic CButton CListBox CComboBox CScrollBar CEdit 静态文本 按钮 列表框 组合框 滚动条 编辑框

138 在对话框中创建控件的方法 利用资源编辑器添加各种控件 建立变量与各控件的关联 对各控件进行初始化 返回时获取用户输入的信息

139 一。CStatic类 CStatic 封装了 Windows 静态文本控制的功能。通过指定显示区域,显示静态文本并可控制显示属性。该控制不提供输入输出。

140 创建静态文本的步骤 (1)构造CStatic对象 (2)利用Create成员函数创建 该静态文本控制并将其连接到 CStatic对象上。

141 静态文本控制 BOOL Create( LPCTSTR lpszText, //control text
DWORD dwStyle, //control style const RECT &rect, //control area CWnd *pParentWnd, // parent window UINT nID=0xffff ) //control ID

142 风格 SS_BLACKFRAME 加与窗口边框相同的框 SS_BLACKRECT 用窗口边框颜色填充 SS_GRAYFRAME 加背景框
SS_GRAYRECT 用背景填充 SS_CENTER 文本中对齐 SS_LEFT 文本左对齐 SS_RIGHT 文本右对齐 SS_SIMPLE 在矩形中左对齐显示文本

143 静态文本控制 void GetWindowTextLength(CString& rString ) // 返回控制文本的长度
// 返回控制文本的长度 int GetWindowText(LPTSTR lpString, int nMaxCount) //返回长度为nMaxCountde的控制 文本并由lpString指向

144 静态文本控制 void SetWindowText (LPCTSTR lpString) //用给定的字符串替换当前静态文本字符串

145 在利用对话框编辑器对对话框资源进行布局时,我们是通过 ID 标识每一个控件的。当我们需要在程序中对某个控件的内容进行操作时,可以利用函数CWnd::GetDlgItem 将 ID 转化成一个CWnd 指针。

146 二。CEdit类 CEdit 提供 Windows编辑控制的功能。它是一个用户可在其中输入文字的矩形子窗口。根据编辑控制的风格选择可形成单行、多行编辑控件。

147 编辑控制的风格 ES_AUTOHSCROLL 自动向右滚动10个字符 ES_AUTOVSCROLL 自动向上滚动一行
ES_CENTER 居中 ES_LEFT 居左 ES_RIGHT 居右 ES_LOWERCASE 小写 ES_UPPERCASE 大写 ES_MULTILINE 多行

148 编辑控制 BOOL Create( DWORD dwStyle, //control style
const RECT &rect, //control area CWnd *pParentWnd, //parent window UNT nID) //contro lD

149 将变量连接到对话框控件 利用ClassWizard可以将成员变量连接到对话框的控件上,并可以利用此变量对控件设置初值;或获取用户在控件中键入的内容。

150 模式对话框的执行过程 CDialog::DoModal Input_Dialog::OnInitDialog
CDialog::OnInitDialog CWnd::UpdateData(FALSE) Input_Dialog::DoDataExchange 点击OK按钮 Input_Dialog::OnOk CDialog::OnOk CWnd::UpdateData(TURE) Input_Dialog::DoDtatExchange CDialog::EndDialog(IDOK)

151 可产生的消息 ON_EN_CHANGE(ID,Fxn) 已改变 ON_EN_UPDATE(ID,Fxn) 被改变
ON_EN_SETFOCUS(ID,Fxn) 获焦点 ON_EN_KILLFOCUS(ID,Fxn) 丢焦点 ON_EN_MAXTEXT(ID,Fxn) 超字符 ON_EN_HSCROLL(ID,Fxn) 水平滚动 ON_EN_VSCROLL(ID,Fxn) 垂直滚动

152 编辑控制 与剪贴板有关的编辑控制成员函数 Cut 删除编辑控件内当前选择的内容并将所删文本以CF_TEXT格式拷贝到裁剪板中
Copy 将编辑控件中的当前选项以CF_TEXT格式拷贝到裁剪板中 Paste 将数据从裁剪板拷贝到编辑控件中的当前光边位置处 Clear 清除编辑控件的当前选择 Undo 反转上一次编辑控件操作

153 编辑控制的查询 GetWindowTextLength GetWindowText GetLineCount //返回文本的行数
int GetFromChar(int nIndex=-1) //返回指定位置的字符所处的行号

154 编辑控制的查询 int LineIndex(int nLine=-1) //返回第一行至指定行字符个数
int LineLength(int nLine=-1) //返回指定行的字符数

155 编辑控制的查询 int GetLine(int nIndex,LPSTR lpBuffer) //获取一行文本
DWORD GetSel( ) //返回选择位置 32位 开始位置 结束位置

156 改变编辑控制 void SetWindowText(LPCTSTR lpString) //用新串重写编辑控制文本
void SetSel(DWORD dwSelection) //定义一字符块作为新的选择文本 void ReplaceSel(LPCTSTR lpNewText) //替换被选择的文本

157 三。CButton 类 CButton 类是 CWnd 的派生类。封装了 Windows 应用程序中常用的按钮控件的功能。

158 按钮控制的种类 下压式按钮 复选框 单选按钮 组框

159 创建函数 BOOL Create ( LPCTSTR lpCaption, //button label
DWORD dwStyle, //style const RECT &rect, //area CWnd *pParentWnd, //parent window UINT nID ) //control ID

160 可产生的消息 ON_BN_CLICKED(ID,Fxn) 单击 ON_BN_DOUBLECLICKED(ID,Fxn) 双击

161 1。下压按钮风格 BS_PUSHBUTTON 当用户按下此按钮时向父窗口发送 WM_COMMAND 消息 BS_DEFPUSHBUTTON
默认按钮

162 下压按钮的操作成员函数 UINT GetButtonStyle( ) void SetButtonStyle(UINT nStyle,
BOOL bRedraw=TRUE) 查询或设置下压按钮风格 bRedraw 指明是否重新画此按钮

163 下压按钮的操作成员函数 CWnd:: IsWindfowEnable( ) 测试按钮是否活动
CWnd::ShowWindow(SW_HIDE) 隐藏按钮 CWnd::ShowWindow(SW_SHOW) 显示按钮 CWnd::EnableWindow(BOOL) 指明按钮活动或禁止

164 2。复选框控制 复选框控制是一种特殊的按钮, 可用它触发复选标志。复选框 之间互不影响。可独立或成组 出现。

165 复选框的状态 复选 未被复选 被加灰

166 复选框的风格 BS_CHECKBOX 标题位于右边 BS_AUTOCHECKBOX 自动触发 BS_3STATE 三种状态
BS_AUTO3STATE 自动触发 BS_LEFTTEXT 标题位于左边

167 检查框状态的获取及设置 int GetCheck() const 返回检查的状态。 0(检查), 1(未被检查), 2(被灰)
void setCheck(int nCheck) 设置状态

168 3。单选按钮控制 与复选框不同的是成组的单选按钮之间相互排斥。其它操作相同。 BS_RADIOBUTTON 标题位于右边
BS_AUTORADIOBUTTON 自动转换 BS_LEFTTEXT 标题位于左边

169 4。成组控制 是一种容器控制,可包含单选按钮或复选框。 目的: 逻辑上把多个单选按钮组合 起来,以进行互斥选择 在视觉上形成一个整体

170 成组控制的风格 BS_GROUPBOX 注意:成组控制没有状态,不发送任何消息

171 四。CScrollBar类 CScrollBar 类是 CWnd 的派生类。滚动条可独立使用, 也可与窗口列表框等结合使用。 一些光标控制键 PageDown , PageUp, Home, End 也可控制滚动条。

172 创建函数 BOOL Create ( DWORD dwStyle, //control style const RECT& rect,
//location and dimensions CWnd *pParentWnd, //pointer to parent window UINT nID ) //control ID

173 滚动条操作的成员函数 void SetScrollRange(int nMinPos,
int nMaxPos,BOOL bRedraw=TRUE) void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) 查询或设置滚动条的取值范围 int GetScrollPos() void SetScrollPos(int nPos, BOOL bRedraw=TRUE) 查询或设置滚动条位置

174 消息响应函数 ON_WM_VSCROLL 消息 CWnd::OnVScroll ( UINT nSBCode,
UINT nPos,CScrollBar*pScrollBar ) ON_WM_HSCROLL 消息 CWnd::OnHScroll ( UINT nSBCode,

175 第八章 SDI应用程序

176

177

178

179

180

181 CObject类支持的操作 CObject可为其派生类提供下列功能: 运行类信息 串行化支持 对象诊断输出

182 运行类信息功能的使用 运行类信息功能可以使你能够实时确定一个对象的类型。使用步骤如下: 1。从CObject派生类
2。在类说明中,包含DECLARE_DYNAMIC宏 3。在类实现中,为每个类包含 IMPLEMENT_ DYNAMIC宏 IMPLEMENT_DYNAMIC(类名,基类名)

183 举例: #include <afx.h> class shape:public COject {
DECLARE_DYNAMIC(shape) …… } ================================== IMPLEMENT_DYNAMIC(shape,COject)

184 应用举例 class circle:public shape { …… } shape *p_s; ……
{ …… } shape *p_s; …… if (p_s->isKindOf(RUNTIME(circle))) { //是自变量所指的类型返回TRUE circle *p_c=(circle*)p_s; ……. }

185 串行化支持 串行化即为从档案读出对象数据或将对象数据写入档案的功能。Windows借助于CArchive类(归档类)的对象作为永久的存储区域。CArchive对象对应一个磁盘文件。

186 应用串行化功能的步骤 1。在类说明中包含DELCARE_SERIAL宏 2。提供一个类的默认构造函数
3。在类实现中包含IMPLEMENT_SERIAL宏 4。为那个类定义Serialize成员函数 ================================== *_SERIAL包含*_DYNAMIC宏

187 对象诊断输出 对象诊断服务使用在_DEBUG编译状态下。COject类提供了三种形式的诊断服务。

188 诊断服务1-- 转储对象内容 此服务可输出对象的内容,帮助程序员分析问题的原因。
使用方法:将一个CDumpContext对象作为自变量,调用Dump函数(派生类需重定义)。CDumpContext类用作I/O流。类库为此类预定义了afxDump。

189 举例 Customer p_cust=new Customer(“Naba”,”Barkakati”); …… #ifdef _DEBUG
p_cust->Dump(afxDump); #endif

190 诊断服务2-- TRACE宏 该宏可打印字符串自变量到afxDump诊断输出。当没有定义_DEBUG宏时,TRACE不执行任何操作。

191 诊断服务3-- ASSERT宏 ASSERT宏可帮助程序员验证有效性。 使用格式:ASSERT(自变量)
若自变量为0,就返回一条消息并结束程序。

192 第九章 MDI应用程序

193


Download ppt "教学安排 授课24学时,第1~13周,星期四7、8节 上机时间:第4,7,9,11,13,14周,星期三7、8节 第 15 周考试."

Similar presentations


Ads by Google