+ All Categories
Home > Documents > 第 9 章 Windows 控件

第 9 章 Windows 控件

Date post: 12-Jan-2016
Category:
Upload: lenora
View: 108 times
Download: 10 times
Share this document with a friend
Description:
第 9 章 Windows 控件. 9.1 Windows 标准控件. 控件工具栏. 打开对话框编辑器就会出现控件工具栏. 控件接受的消息 主要有单击、双击 和字符输入等. 9.1.1 控件的创建 9.1.2 控件的管理 9.1.3 控件的通用属性. 9.1.4 常用控件窗口操作函数 Windows 应用程序对控件的操作实质上是对窗口的操作,对话框窗口中的控件被视为对话框窗口的子窗口,具有通用的窗口属性,所以控件的操作还可以通过一组窗口操作函数来完成。 常用的控件子窗口操作函数如下: 1 .CreateWindow() 或 CreateWindowEx() - PowerPoint PPT Presentation
132
1 第 9 第 Windows 第第
Transcript
Page 1: 第 9 章 Windows 控件

1

第 9 章 Windows 控件

Page 2: 第 9 章 Windows 控件

2

9.1 Windows 标准控件

控件工具栏

控件接受的消息主要有单击、双击

和字符输入等

打开对话框编辑器就会出现控件工具栏

Page 3: 第 9 章 Windows 控件

3

常用控件 MFC类 描述

按钮控件 CButton 用来产生某种行为的按钮,以及复选框、单选钮和组框组合框 CComboBox 编辑框和列表框的组合编辑框 CEdit 用于键入文本列表框 CListBox 包括一系列字符串的列表滚动条 CScrollBar 为对话框提供控件形式的滚动条滑动条 CSliderCtrl 包括一个有可选标记的滑块的窗口

静态文本 CStatic 常用于为其它控件提供标签

进展条 CprogressCtrl 用来表示一个操作的进度旋转按钮

控件 CspinButtonCtrl带有一对反向箭头的按钮,单机这对按钮可增加或减少某个值

日期时间控件 CdateTimeCtrl 用于选择指定的日期和时间

图像列表 ClmageList 一个具有相同大小的图标或位图的集合

列表控件 CListCtrl“ ” “ ” “ ” “ ”可以用 大图标 、 小图标 、 列表 或 报表 四种不同方式

显示一组信息

树控件 CtreeCtrl树结构的形式显示一组信息,并能反映这些信息的层次关系

Page 4: 第 9 章 Windows 控件

4

Page 5: 第 9 章 Windows 控件

5

9.1.1 控件的创建9.1.2 控件的管理 9.1.3 控件的通用属性

Page 6: 第 9 章 Windows 控件

6

9.1.4 常用控件窗口操作函数Windows 应用程序对控件的操作实质上是对窗口的操作,对

话框窗口中的控件被视为对话框窗口的子窗口,具有通用的窗口属性,所以控件的操作还可以通过一组窗口操作函数来完成。常用的控件子窗口操作函数如下:

1.CreateWindow() 或 CreateWindowEx()在程序运行过程中,可以通过调用创建窗口的函数 CreateWind

ow() 或 CreateWindowEx() 来动态地创建控件。 2.ShowWindow()使用函数 ShowWindow() 可以显示或隐藏控件。函数原型为:BOOL ShowWindow(int nCmdSHow)参数 nCmdShow 表示窗口的显示特性,例如,取值 SW_HID

E 表示隐藏控件,取值 SW_SHOW 表示显示控件。3.EnableWindow()通过函数 EnableWindow() 可以允许或禁止控件接受用户输入。

函数原型为: BOOL EnableWindow(BOOL nEnable=true)参数 nEnable 决定控件的激活或禁止状态,当值为 true 时,

允许控件接受用户输入,当其值为 false 时,不允许控件接受用户输入,其呈灰色显示。

Page 7: 第 9 章 Windows 控件

7

4.MoveWindow()通过函数 MoveWindow() 可以移动控件或改变控件的大小。函

数原型为:BOOL MoveWindow(int x, int y, int nWidth, int nHeight, BOO

L bRepaint=TRUE)坐标 x , y 决定控件所在的位置, nWidth 和 nHeight 分别表

示控件的宽度和高度,决定控件的大小, bRepaint 表明对话框窗口移动后,控件是否需要重画,以使其与对话框窗口的相对位置与大小保持不变。

5.DestoryWindow()通过该函数能够关闭一个控件,函数原型为:Void DestoryWindow()6.CheckDlgButton( )该函数用来设置按钮的选择状态。函数原型为:CheckDlgButton(int nIDButton, UINT nCheck )nIDButton 是按钮的 ID 。 nCheck 取值 0 表示按钮未被选择,

1 表示按钮被选择, 2 表示按钮处于不确定状态。

Page 8: 第 9 章 Windows 控件

8

7.CheckRadioButton()该函数用来选择单选按钮组中的一个单选按钮。函数原型为:CheckRadioButton(int nIDFirstButton, int nIDLastButton,int n

IDCheckButton)nIDFirstButton 指定按钮组中第一个按钮的 ID 。 nIDLastButt

on 指定按钮组中最后一个按钮的 ID 。 nIDCheckButton 指定要选择的按钮的 ID 。

8.GetCheckedRadioButton()该函数用来获得一组单选按钮中被选中按钮的 ID 。函数原型

为int GetCheckedRadioButton(int nIDFirstButton, int nIDLastBu

tton)nIDFirstButton 是单选按钮组中第一个按钮的 ID 。 nIDLastBu

tton 是单选按钮组中最后一个按钮的 ID 。函数返回值为被选中按钮的 ID 。

9.IsDlgButtonChecked()该函数返回检查框或单选按钮的选择状态。函数原型为:int IsDlgButtonChecked(int nIDButton)返回值 0 表示按钮未被选择, 1 表示按钮被选择, 2 表示按钮

处于不确定状态(仅用于检查框)。

Page 9: 第 9 章 Windows 控件

9

10.SetWindowText()

该函数用来设置按钮中显示的正文。函数原型为:SetWindowText(LPCTSTR lpszString)

此函数设置窗口标题为指定的内容,参数 lpszString 为指向新标题的指针。

例如 m_btn2 是一个按钮对象m_btn2.SetWindowText(“ 按钮已被按下!” );11.GetWindowText()

函数 GetWindowText() 用来查询按钮中显示的正文,GetWindowText(CString& rString)

参数 rString 为接收窗口标题文本的 CString 对象的引用。12.GetWindowTextLength()

函数 GetWindowTextLength() 用来查询按钮中显示的正文长度。函数原型为:

int GetWindowTextLength()

Page 10: 第 9 章 Windows 控件

10

9.2 静态控件及其应用静态控件的有:静态文本( Static Text )、组框 (Group Box)和静态图像( Picture )三种。 9.2.1 静态文本控件 用户能添加到对话框中的最简单控件是静态文本控件。静态文本控件不要求与对话框进行交互,需要显示的文本只要在该控件属性对话框的 General 标签中的 Capion 属性中直接输入。

9.2.2 组框控件 组框的外形为左上角包含文字的矩形框,组框是一种特殊的按钮形式,虽然它属于按钮类控件,但组框既不处理鼠标和键盘输入,也不向其父窗口发送消息,实际上没有太多的操作,只是用于在窗口中对特定的区域划分范围,并把相同属性的数据划分在一起并加以说明,使窗口简洁明了。

Page 11: 第 9 章 Windows 控件

11

9.2.3 静态图像控件 在静态图像控件的常规属性对话框中,用户可以选择图像“类型”、“颜色”两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图像控件中。用户还可设置其样式来改变控件的外观以及图像在控件的位置等。另外,静态图像控件还可用来在对话框中形成一个水平或垂直蚀刻线,蚀刻线可起到分隔其它控件的作用。

Page 12: 第 9 章 Windows 控件

12

【例 9-1】开发一个使用静态图像控件的程序,在对话框中创建一个水平蚀刻线和两个图像,如图 9-10 所示。实现步骤如下:(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_1 。(2) 在打开的对话框资源模板中,将“确定”和“取消”按钮向对话框左边移动一段位置,然后将鼠标移至对话框资源模板右下角的实心蓝色方块处,拖动鼠标,将对话框资源模板的大小缩小一些。

Page 13: 第 9 章 Windows 控件

13

(3) 在对话框资源模板中间位置添加一个静态图像控件,右击该控件,从弹出的快捷菜单中选择“属性”,弹出其属性对话框。在“类型”下拉列表框中选择默认的“框架( Frame )”,在“颜色”下拉列表框中选择“蚀刻( Etched )”,然后关闭属性对话框。此时,静态图像控件变成一个蚀刻的矩形框。将鼠标移动到添加的静态图像控件的右下角位置,使鼠标指针变成十字型,拖动鼠标使控件的大小变成一条水平线。(4) 在对话框资源模板中靠左位置添加一个静态图像控件,右击该控件,从弹出的快捷菜单中选择“属性”,弹出其属性对话框。将 Type 属性设置为 Icon 或者 Bitmap 的时候,可以设置 lmage 属性为相应的资源 ID ,来显示一幅图标或者位图。我们在资源中导人一幅位图,命名为 IDB_BITMAP_DOT ,设置新加的 Picture 控件的 Type 为 Bitmap , Image 设置为 BITMAP_DOT ,见图 9-10 中左上角的图像。(5) 在对话框资源模板中靠右位置添加一个静态图像控件,在其常规属性对话框中,将其“类型”选择为“图标( Icon )”,再将其“图像”选择为 IDR_MAINFRAME ,则静态图像控件显示出图标,见图 9-10 中右上角的图像。

Page 14: 第 9 章 Windows 控件

14

9.3 按钮控件9.3.1 按钮控件的种类及消息 按钮控件的类型比较丰富,其中主要有命令按钮、单选按钮、复选框按钮。这三类按钮之间无论在外观还是在使用上都有较大的差异,但 MFC 中使用了一个类 CButton 来封装这三种不同控件。

常用消息:BN_CLICKED 单击按钮BN_DOUBLECLICKED 双击按钮

Page 15: 第 9 章 Windows 控件

15

GetCheck( )SetCheck( )GetBitmap()SetBitmap()GetButtonStyle()SetButtonStyle()GetCursor()SetCursor()GetIcon()SetIcon()GetState()SetState()

9.3.2 按钮控件的成员函数

这些是 CButton 类的成员函数,它们必须通过对象或指向对象的指针来引用。对象 . 函数(参数)对象— > 函数(参数)

Page 16: 第 9 章 Windows 控件

16

CButton 类是 CWnd 类的派生类,在知道按钮 ID 的前提下,还可使用与按钮有关的 CWnd成员函数来设置或查询按钮状态 ,当然调用的语句也应该是 对象 . 函数(参数)

CheckDlgButtonCheckRadioButtonGetCheckedRadioButtonIsDlgButtonCheckedGetWindowTexGetWindowTextLengthSetWindowText

Page 17: 第 9 章 Windows 控件

17

9.3.3命令按钮 【例 9-2】开发一个基于对话框的应用程序,界面如图 9-12 所示。当单击第一个按钮时,按钮上的文字“这里是一个命令按钮,按我吧!”就变成“命令按钮已被按下!”,第二个按钮标记为“这里是一个默认按钮,按下试试看!”,按下此按钮后,按钮的标记信息就变成“默认按钮已被按下!”。

Page 18: 第 9 章 Windows 控件

18

主要步骤如下:(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_2 。(2) 设计界面 : 将对话框上默认的控件删除干净,添加 2 个命令按钮,然后设置控件在对话框中的位置和大小,设置控件的标题属性,它们的 ID号使用系统设置的默认值 IDC_BUTTON1 和 IDC_BUTTON2 。(3) 要设置 IDC_BUTTON2 为默认按钮,就是要设置 IDC_BUTTON2 的 tab order 为所有控件中的第一个。在资源编辑器中选择 Layout菜单下的 Tab Order菜单项,按顺序点击控件,会更改控件的 tab顺序。要设置第二个按钮为默认的,则首先点击第二个按钮,通过 tab order 可以修改一组按钮控件的先后顺序(不是位置顺序,而是响应顺序)。(4) 为控件连接变量,即在对话框类中添加数据成员。为两个按钮分别连接 CButton 型变量m_Button1 和 m_Button2 。在 Add Member Variable 对话框的 Category列表框中选择要连接的变量种类。如果要在消息响应函数代码中调用某个控件类的成员函数,要连接 control 类型的变量。如果要在消息响应函数代码中使用用户的选择或用户输入的值,要连接 value 类型的变量。

Page 19: 第 9 章 Windows 控件

19

添加成员变量要使用类向导 ,View->ClassWizard 选项

Page 20: 第 9 章 Windows 控件

20

(5)对命令按钮进行消息映射。可以通过类向导为按钮添加消息处理函数,也可以在对话框编辑器中双击按钮控件来添加消息处理。在对话框类中添加 2 个消息响应函数 OnButtonl() 和 OnButton2() ,分别响应这 2 个命令按钮的单击消息。消息处理代码如下void CEx9_2Dlg::OnButtonl(){

//TODO : Add your control notification handler code here

m_Button1.SetWindowText("命令按钮已被按下! ");// 对象 . 设置窗口文本(“…”)

}void CEx9_2D1g::OnButton2(){

//TODO : Add your control notification handler code herem_Button2.SetWindowText("默认按钮已被按下! ");

}

Page 21: 第 9 章 Windows 控件

21

9.3.4 单选按钮 对于成组的单选按钮,只在每组的第一个按钮的属性中选中 Group 选项。每个设置 Group风格的按钮和接下来没有设置 Group风格的按钮为一组。下一个设置了 Group风格的按钮为新一组的开始。一组内的多个 radio之间是互斥的,也就是说任何时候只有一个单选按钮可以被选中。

在设计的过程中,同一组单选按钮必须一个接一个地放进对话框中,中间不能插入其它的控件,因为 Visual C++ 按照放入对话框中的先后顺序,给每个控件赋一个 ID 值,所以连续放入的控件的 ID 值是连续的。如果 ID 值不连续,只能删掉,然后重新加入单选按钮到对话框中。

可以从 resource.h 的资源头文件中得到 ID 值,

Page 22: 第 9 章 Windows 控件

22

Auto风格的单选按钮会自动响应单击消息,在所选项的前面加点,同时去掉同组中其它单选按钮前面的点,所以, Auto风格的单选按钮可以不连接变量,如果需要调用 CButton 类的成员函数,就要给每个单选按钮连接 CButton 型变量。单选按钮也可以连接 int 型的变量,连接整型变量时,每一组单选按钮中只有第一个按钮可以赋予变量名,其它的单选按钮不能获得变量名,而且变量的值为所选选项的下标。一般要在某个控件的消息响应函数代码中根据单选按钮当前的选项做出不同反应。

Page 23: 第 9 章 Windows 控件

23

【例 9-3】有三个 Auto风格的单选按钮组成的一个单选按钮组,分别是“汉族”“回族”“少数民族”,单击 OK 按钮时,则弹出一个消息框显示选中的民族,如图 9-16 所示。

控件在可视化编程中的应用主要步骤:1 、创建基于对话框项目 2 、设计界面3 、添加成员变量4 、添加消息响应代码前两步也叫做应用程序的可视化编程部分后两步也叫做应用程序的代码编程部分

Page 24: 第 9 章 Windows 控件

24

首先创建基于对话框的项目 ex9_3 ,然后设计界面。接下来要给按钮连接变量,根据单选按钮是否连接了变量,有两种处理方法。

方法一:( 1 )每个单选按钮都不连接变量。( 2 ) OnInitDialog() 函数中添加代码如下:CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADI

O2); // 设置第 2项被选中

Page 25: 第 9 章 Windows 控件

25

( 3 )对 OK 按钮添加消息响应函数 OnOK() ,并在消息响应函数中添加代码:

void CEx9_3Dlg::OnOK (){ //TODO : Add your control notification handler code here

CString cs;int iRADIO; //存放民族单选按钮组的选中项的 ID 值iRADIO=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);

if(iRADIO==IDC_RADIO1) { cs=" 汉族 " ; }else if(iRADIO==IDC_RADIO2) { cs=" 回族 "; }

else {cs="少数民族 " ;}AfxMessageBox(cs ); }或者CString cs;if (IsDlgButtonChecked(IDC_RADIO1)) { cs="汉族 "; }else if (IsDlgButtonChecked(IDC_RADIO2)) { cs=" 回族 "

; } else {cs=" 少数民族 "; }

Page 26: 第 9 章 Windows 控件

26

方法二:( 1 )给第一个单选按钮连接 int 型的变量m_radio 。( 2 ) OnInitDialog() 函数中添加代码如下:m_radio=1; // 设置第 2项被选中 ( 下标为 1)UpdateData(FALSE);( 3 )对 OK 按钮添加消息响应函数 OnOK() ,并添加代码:void CEx9_3Dlg::OnOK (){ //TODO : Add your control notification handler code here

UpdateData(TRUE);CString cs;if (m_radio==0) { cs=" 汉族 "; }else if(m_radio==1) { cs=" 回族 "; }else {cs=" 少数民族 "; }AfxMessageBox(cs );}控件连接的变量为 int 类型、 CString 和 BOOL 类型时,一般先

用 UpdateData(TRUE); 从窗口中读入和各控件连接的变量,然后对变量进行修改,最后用 UpdateData(FALSE); 刷新屏幕。

Page 27: 第 9 章 Windows 控件

27

9.3.5复选按钮复选按钮与单选按钮一样,是 Windows提供的另一种形式的

按钮。使用复选按钮,可以从一组选项中选择一个选项或多个选项,各个选项之间的选中状态互不相关。如果设置了 auto风格,复选按钮会自动响应点击消息,设置按钮的状态。否则开发者需要响应按钮的点击消息,并自行设置按钮的状态。

在程序中需要根据复选框是否选中做出不同的处理。复选框可以不连接变量,也可以连接 BOOL 型变量,还可以连接 CButton 型变量。

Page 28: 第 9 章 Windows 控件

28

【例 9-4】有一个党员复选框,如果该复选框处于选中状态,单击 OK 按钮时,则弹出一个消息框,显示“党员”,否则消息框中显示“不是党员”。如图 9-17 所示。

首先创建基于对话框的项目 ex9_4 ,然后设计界面。接下来要给按钮连接变量,根据复选框连接的变量类型不同,有三种处理方法。

Page 29: 第 9 章 Windows 控件

29

方法一:(1) 为复选框连接一个 value 类型的变量m_bcheck 用于传递数

据,该变量的值是 BOOL 型,值为 true 时表示选中复选框,值为 false 时表示未选中复选框。

(2) 设置复选框初始状态为选中,在 OnInitDialog() 函数中添加代码如下:

m_bcheck=TRUE;

UpdateData(FALSE);

Page 30: 第 9 章 Windows 控件

30

(3) 对 OK 按钮添加消息响应函数 OnOK() ,并在消息响应函数中添加代码:

void Ctestl9_4Dlg::OnOK ()

{

//TODO : Add your control notification handler code here

UpdateData(TRUE);

CString cs;

if (m_bcheck==TRUE) { cs="党员 "; }

else { cs=" 不是党员 "; }

AfxMessageBox(cs );//MessageBox

}

Page 31: 第 9 章 Windows 控件

31

方法二:( 1 )复选框不连接变量。( 2 )在 OnInitDialog() 函数中设置复选框初始状态为选中,

添加代码如下:CheckDlgButton(IDC_CHECK,1); ( 3 )对 OK 按钮添加消息响应函数 OnOK() ,并在消息响应

函数中添加代码:void CEx9_4Dlg::OnOK (){ //TODO : Add your control notification handler code hereCString cs;if (IsDlgButtonChecked(IDC_CHECK)) { cs="党员 "; }else { cs=" 不是党员 "; }AfxMessageBox(cs );}

Page 32: 第 9 章 Windows 控件

32

方法三:( 1 )给复选框连接 CButton 型变量m_check 。( 2 ) OnInitDialog() 函数中添加代码如下:m_check.SetCheck(1);( 3 )对 OK 按钮添加消息响应函数 OnOK() 并在消息响应函

数中添加代码:void CEx9_4Dlg::OnOK (){

//TODO : Add your control notification handler code hereCString cs;if(m_check.GetCheck()) { cs="党员 "; }else { cs=" 不是党员 " ; }AfxMessageBox(cs );}

Page 33: 第 9 章 Windows 控件

33

9.4 编辑框控件 9.4.1 编辑框属性9.4.2 编辑框类的成员函数

Page 34: 第 9 章 Windows 控件

34

成员函数 功能CanUndo() 决定一个编辑操作是否可以撤销Clear() 从编辑框控件中删除当前的选择(如果有的话)

Copy() 将编辑框控件当前的选择(如果有的话)以 CF_TEXT格式复制到剪切板中

Cut() 剪下编辑框控件中的当前选择(如果有的话)并以 CF_TEXT格式复制到剪切板中

EmptyUndoBuffer() “ ”消除一个编辑框控件的 撤销 标志GetFirstVisibleLine() 确定编辑框控件中的最上边的可视行GetModify() 确定一个编辑框控件的内容是否可修改

GetPasswordChar() 当用户输入文本时,获得编辑框控件中显示的密码字符

GetRect() 获得一个编辑框控件的格式化矩形

GetSel() 获得编辑框控件中当前选择的开始和结束字符的位置

Page 35: 第 9 章 Windows 控件

35

成员函数 功能LimitText() 限定用户可能输入一编辑框控件的文本长度LineFromChar() 获得包含指定字符下标的行的行号LineLength() 获得编辑框控件中的一行的长度LineScroll() 滚动多行编辑框控件的文本

Paste() 将剪辑版的数据插入到编辑框控件中的当前光标位置,只有当前剪辑版中数据格式为 CF_TEXT时方可插入

ReplaceSel() 用指定文本替代编辑框控件中当前选择部分SetModify() 设置或清除编辑框控件的修改标志

SetPasswordChar() 当用户输入文本时设置或删除一个显示于编辑框控件的密码字符

SetReadOnly() 将编辑框控件设置为只读标志SetSel() 在编辑框控件中选择字符的范围Undo() 取消最后一个编辑框控件的操作

Page 36: 第 9 章 Windows 控件

36

9.4.3 编辑框的主要消息

控件通知消息 发生事件EN_SETFOCUS 编辑框获取输入焦点

EN_KILLFOCUS 编辑框失去输入焦点

EN_CHANGE 编辑框中内容发生改变EN_UPDATE 编辑框中内容被更新EN_MAXTEXT 编辑框中的用户输入已达到允许的最大字节数EN_HSCROLL 编辑框中内容水平移动EN_VSCROLL 编辑框中的内容垂直滚动

Page 37: 第 9 章 Windows 控件

37

9.4.4 编辑框控件的使用编辑框控件可以连接的变量有 3 种:(1) 需要调用 CEDIT 类的方法时要给编辑框连接 CEdit 类型的

变量;(2) 在编辑框中要放整数时连接 int 类型的变量;(3) 在编辑框中要输入或输出字符串时连接 CString 类型的变量;比如需要输入学生的姓名,输入之后把姓名放到数据库或数组中,不需要调用 CEdit 类的成员函数,此时就连接 CString 类型变量。

编辑框主要用于下面 3 种情况:

Page 38: 第 9 章 Windows 控件

38

(1) 用于字符串输入例如,单击 OK 按钮时,将编辑框中输入的内容显示到消息框

中,那么 OK 按钮的消息响应函数中添加代码有两种写法。如果编辑框连接了 CEDIT 类变量m_edit ,代码编写如下:char str[10];

m_edit.GetwindowText(str,10);//10 为字节数,将编辑框的内容放到字符串变量 str 中

AfxMessageBox(str);

如果连接了 CString 类变量 cs ,代码编写如下:UpdateData(TRUE);

AfxMessageBox(cs );

Page 39: 第 9 章 Windows 控件

39

(2) 用于字符串输出例如,单击 OK 按钮时,将字符串“ ABC” 显示到编辑框中,那么 OK 按钮的消息响应函数中添加代码有两种写法。

如果编辑框连接了 CEDIT 类变量m_edit ,代码编写如下:m_edit.SetSel(0,-1);m_edit.ReplaceSel("ABC");

如果编辑框连接了 CString 类变量 cs ,那么要给 cs赋值,然后使用 UpdateData(FALSE);语句去更新,代码编写如下:

char s[10]; strcpy ( s , "ABC" ); cs=_T(s);

// 以上三条语句相当于 cs=_T("abc"); UpdateData(FALSE);或者CString cs; cs.Format("ABC"); UpdateData(FALSE);

_T (“Hello”) 是一个宏 ,作用是让程序支持 Unicode 编码,因为 Windows使用两种字符集 ANSI 和UNICODE ,前者是通常使用的单字节方式,而后者是双字节方式,方便处理双字节字符,如

中文。

Page 40: 第 9 章 Windows 控件

40

(3) 用于数值的输入、输出例如,单击 OK 按钮时,将编辑框中数值加一,假设编辑框连

接的是 int 类型的变量m_i ,那么 OK 按钮的消息响应函数中添加代码如下:

UpdateData(TRUE); m_i++; UpdateData(FALSE);

连接的变量为 int 类型和 CString 类型时,一般先用 UpdateData(TRUE); 从窗口中读入和各控件连接的变量,然后对变量进行修改,最后用 UpdateData(FALSE); 刷新屏幕。

在编辑框中仅需要显示一个字符串,不对其修改,连接 CString 类型或 CEDIT 类的变量都行。一个控件可以根据需要连接多种类型的变量。

Page 41: 第 9 章 Windows 控件

41

9.4.5 编辑框编程实例【例 9-5】编写基于对话框的应用程序,其窗口布局如图 9-19

所示。在程序主窗口中有两个编辑框,分别为姓名 Edit1 、学号 Edit2 、备注 Edit3 和总信息 Edit4 , Edit3 为多行编辑框,其余 3 个为单行编辑框,单击 OK 按钮时,将输入的姓名、学号和备注内容在总信息编辑框中显示出来。主窗口中还有 Cut 、 Copy 、 Paste 、 Clear All 、 Undo 和 Exit6个按钮,分别完成从一个编辑框到另一个编辑框相应操作。若单击 Cut 按钮,则剪切当前编辑框的内容;若单 Copy 击按钮,则复制当前编辑框的内容;若单击 Paste 按钮,则将剪贴板的内容复制到当前编辑框;单击 Clear All 按钮,则两个编辑框中的内容都被清除;单击 Undo 按钮,则取消编辑框中的上一次操作,再单击一次 Undo 按钮,又显示刚才的内容;若单击 Exit 按钮,则退出程序的运行。

Page 42: 第 9 章 Windows 控件

42

Page 43: 第 9 章 Windows 控件

43

(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_5 。(2) 按照图 9-19 设置窗口界面。添加控件,然后设置控件在对

话框中的位置和大小,设置控件的标题属性,并将备注编辑框设置为多行编辑框。总信息编辑框设置为只读。

(3) 为各个控件连接变量如表 9-7 所示。ID号 类型 变量名

IDC_EDIT1 CEdit m_Edit1

IDC_EDIT2 CEdit m_Edit2

IDC_EDIT3 CEdit m_Edit3

IDC_EDIT4 CEdit m_Edit4

(4) 在 ex9_5Dlg.h 中添加公有成员变量,代码如下:int editFlag; //EDIT1获得输入焦点时, editFlag 的值为 1 ,依此类推, clear all 之后 editFlag 的值为 4 , OK之后 editFlag 的值为 5

int oldEditFlag; // 原来的 editFlag 的值

Page 44: 第 9 章 Windows 控件

44

(5) 在对话框的初始化函数 OnInitDialog() 中添加代码如下:BOOL CEx9_5Dlg::OnInitDialog()

{// TODO: Add extra initialization here

UpdateData(TRUE);

editFlag=0;

oldEditFlag=0;

return TRUE; // return TRUE unless you set the focus to a control

}

Page 45: 第 9 章 Windows 控件

45

(6) 为 Button1 的 BN_CLICKED 消息添加消息响应函数 OnButton1() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnButton1()

{ // TODO: Add your control notification handler code here

switch(editFlag)

{ case 0: AfxMessageBox("No Focus Here"); break;

case 1: m_Edit1.SetSel(0,-1); m_Edit1.Cut(); break;

case 2: m_Edit2.SetSel(0,-1); m_Edit2.Cut(); break;

case 3: m_Edit3.SetSel(0,-1); m_Edit3.Cut(); break;

default:

AfxMessageBox("Flag Error");

} }

Page 46: 第 9 章 Windows 控件

46

(7) 为 Button2 的 BN_CLICKED 消息添加消息响应函数 OnButton2() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnButton2()

{ // TODO: Add your control notification handler code here

switch(editFlag)

{ case 0: AfxMessageBox("No Focus Here"); break;

case 1: m_Edit1.SetSel(0,-1); m_Edit1.Copy(); break;

case 2: m_Edit2.SetSel(0,-1); m_Edit2.Copy(); break;

case 3: m_Edit3.SetSel(0,-1); m_Edit3.Copy(); break;

default:

AfxMessageBox("Flag Error");

}

}

Page 47: 第 9 章 Windows 控件

47

(8) 为 Button3 的 BN_CLICKED 消息添加消息响应函数 OnButton3() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnButton3() { // TODO: Add your control notification handler code here

switch(editFlag){ case 0: AfxMessageBox("No Focus Here"); break;

case 1: m_Edit1.SetSel(0,-1); m_Edit1.ReplaceSel(""); m_Edit1.Paste(); break;

case 2: m_Edit2.SetSel(0,-1);m_Edit2.ReplaceSel(""); m_Edit2.Paste(); break;

case 3: m_Edit3.SetSel(0,-1);m_Edit3.ReplaceSel("");m_Edit3.Paste(); break;

default: AfxMessageBox("Flag Error");}

}

Page 48: 第 9 章 Windows 控件

48

(9) 为 Button4 的 BN_CLICKED 消息添加消息响应函数 OnButton4() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnButton4() {

// TODO: Add your control notification handler code herem_Edit1.SetSel(0,-1);m_Edit2.SetSel(0,-1);m_Edit3.SetSel(0,-1);m_Edit1.Clear();m_Edit2.Clear();m_Edit3.Clear();CString csBlank;m_Edit4.SetWindowText(csBlank);editFlag=4;}

Page 49: 第 9 章 Windows 控件

49

(10) 为 Button5 的 BN_CLICKED 消息添加消息响应函数 OnButton5() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnButton5() { // TODO: Add your control notification handler code here

CString csBlank;CString oldCS1;static CString oldCS2;switch(editFlag){ case 0: AfxMessageBox("No Focus Here"); break;

case 1: m_Edit1.Undo(); break;case 2: m_Edit2.Undo(); break;case 3: m_Edit3.Undo(); break;case 4: m_Edit1.Undo(); // clear all 之后 editFlag 值为 4

m_Edit2.Undo();m_Edit3.Undo(); break;

Page 50: 第 9 章 Windows 控件

50

case 5: //ok之后 undo, 需要清除总信息,如果再次 undo 还要恢复总信息m_Edit4.GetWindowText(oldCS1);

if(oldCS1!=""){m_Edit4.SetWindowText(csBlank);oldCS2=oldCS1;}else m_Edit4.SetWindowText(oldCS2);break;

default:AfxMessageBox("Flag Error");

}}(11) 为 Button6 的 BN_CLICKED 消息添加消息响应函数 OnB

utton6() ,并在该函数下添加代码如下:void CEx9_5Dlg::OnButton6() { // TODO: Add your control notification handler code hereOnOK(); }

Page 51: 第 9 章 Windows 控件

51

(12) 为 Button7 的 BN_CLICKED 消息添加消息响应函数 OnButton7() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnButton7() {

// TODO: Add your control notification handler code hereCString cs[3];CString allCs;m_Edit1.GetWindowText(cs[0]);m_Edit2.GetWindowText(cs[1]);m_Edit3.GetWindowText(cs[2]);allCs=cs[0]+' '+cs[1]+' '+cs[2]; m_Edit4.SetWindowText(allCs);editFlag=5;}

Page 52: 第 9 章 Windows 控件

52

(13) 为 IDC_EDIT1 的 EN_SETFOCUS 消息添加消息响应函数OnSetfocusEdit1() ,并在该函数下添加代码如下:

void CEx9_5Dlg::OnSetfocusEdit1() { // TODO: Add your control notification handler code hereoldEditFlag=editFlag; editFlag=1;

}(14) 为 IDC_EDIT2 的 EN_SETFOCUS 消息添加消息响应函数

OnSetfocusEdit2() ,并在该函数下添加代码如下:void CEx9_5Dlg::OnSetfocusEdit2() {// TODO: Add your control notification handler code hereoldEditFlag=editFlag; editFlag=2;

}(15) 为 IDC_EDIT3 的 EN_SETFOCUS 消息添加消息响应函数

OnSetfocusEdit3() ,并在该函数下添加代码如下:void CEx9_5Dlg::OnSetfocusEdit3() {//TODO: Add your control notification handler code hereoldEditFlag=editFlag; editFlag=3;}

Page 53: 第 9 章 Windows 控件

53

【例 9-6】计算器应用程序,其窗口布局如图 9-20 所示。用户在数据 1 编辑框中和数据 2 编辑框中输入数据后,击“求和”、“求差”、“求乘积”、“求商”四个按钮之一时,在结果编辑框中显示出计算结果。

Page 54: 第 9 章 Windows 控件

54

(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_6 。(2) 按照图 9-20 设置窗口界面添加控件,然后设置控件在对话框中的位置和大小,设置控件的标题

属性。(3) 为各个控件连接变量如表 9-8 所示。(4) 在 CEx9_6Dlg 类中添加一个新变量 result ,在 ex9_6Dlg.h 中的

类的定义中 public 下面添加如下代码:int result;

(5) 添加代码。在对话框的初始化函数 OnInitDialog() 中添加如下代码:result=0;

UpdateData(TRUE);ID号 类型 变量名

IDC_EDIT1 int m_Edit1

IDC_EDIT2 int m_Edit2

IDC_EDIT3 CString m_Edi3

Page 55: 第 9 章 Windows 控件

55

(6) 为 Button1 的 BN_CLICKED 消息添加消息响应函数 OnButton1() ,并在该函数下添加代码如下:

void CEx9_6Dlg::OnButton1(){ // TODO: Add your control notification handler code here

UpdateData(TRUE);result=m_Edit1+m_Edit2;m_Edit3.Format("%d",result);UpdateData(FALSE);}

(7) 为 Button2 的 BN_CLICKED 消息添加消息响应函数 OnButton2() ,并在该函数下添加代码如下:

void CEx9_6Dlg::OnButton2(){ // TODO: Add your control notification handler code here

UpdateData(TRUE);result=m_Edit1-m_Edit2;m_Edit3.Format("%d",result);UpdateData(FALSE);}

Page 56: 第 9 章 Windows 控件

56

(8) 为 Button3 的 BN_CLICKED 消息添加消息响应函数 OnButton3() ,并在该函数下添加代码如下:

void CEx9_6Dlg::OnButton3(){ // TODO: Add your control notification handler code hereUpdateData(TRUE);result=m_Edit1*m_Edit2;m_Edit3.Format("%d",result);UpdateData(FALSE);}

Page 57: 第 9 章 Windows 控件

57

(9) 为 Button4 的 BN_CLICKED 消息添加消息响应函数 OnButton4() ,并在该函数下添加代码如下:

void CEx9_6Dlg::OnButton4(){ // TODO: Add your control notification handler code hereUpdateData(TRUE);if(m_Edit2==0){ AfxMessageBox("除数不能为零 ");}else{ result=(int)(m_Edit1/m_Edit2);

m_Edit3.Format("%d",result);UpdateData(FALSE);

}}(10) 为 Button5 的 BN_CLICKED 消息添加消息响应函数 OnB

utton5() ,并在该函数下添加代码如下:void CEx9_6Dlg::OnButton5(){ // TODO: Add your control notification handler code hereOnOK();}

Page 58: 第 9 章 Windows 控件

58

9.5列表框控件9.5.1列表框的属性

Page 59: 第 9 章 Windows 控件

59

9.5.2列表框类的成员函数CLisBox 类为处理和操纵列表框和列表框数据提供了许多成员

函数,这些成员函数可分为通用成员函数、单选列表框成员函数、多选列表框成员函数、特定字符串函数和虚拟函数等几种。

列表框的默认模式是单项选择模式,所有的通用成员函数均适用于单选项列表框。只有两个成员函数专门用来处理单选项列表框: GetCurSel() 和 SetCurSel() 。

GetCurSel() 函数获得当前选择列表框项的下标(基于 0 )SetCurSel() 函数是选择列表框字符串。

例如int i = m_list.GetCurSel(); // 取得与变量 m_list

连接的列表框的当前选项的下标

Page 60: 第 9 章 Windows 控件

60

成员函数 功能AddString() 在列表框中添加一个字符串DeleteString() 从列表框中删除一个字符串Dir() 从当前目录加文件名放入列表框FindString() 在列表框中搜索一字符串InsertString() 在列表框指定下标处插入一字符串ResetContent() 清除列表框中所有项FindStringExact() 在列表框中搜索第一个与指定搜索字符串匹配的字符串SelectString() 在单选列表框中搜索并选择一字符串

可以使用这些特定于指定列表框中字符串的函数向列表框内添加或删除列表项,例如:m_list. AddString(“ 唱歌” ); // 在与变量 m_list 连接的列表框内添加一个列表项 m_list.InsertString(2,“ 跳舞” ); m_list.DeleteString(i); // 删除与变量 m_list 连接的列表框内下标为 i 的字符串

Page 61: 第 9 章 Windows 控件

61

9.5.3列表框的消息

控件通知消息 发生事件

LBN_SELCHANGE 表明列表框中的用户选择已发生改变

LBN_DBLCLK 双击

LBN_SELCANCEL 列表框中的选择被取消

LBN_SETFOCUS 列表框收到输入焦点

LBN_KILLFOCUS 列表框失去输入焦点

Page 62: 第 9 章 Windows 控件

62

9.5.4列表框的使用列表框一般连接 ClistBox 类型的变量。例如,要将用户所选项的字符串显示在消息框中,假设列表框连接的 ClistBox 类型的变量是 m_list ,响应函数的代码如下:

CString msg;

int i= m_list.GetCurSel(); //将列表框中选中项的下标给变量 i

m_list.GetText(i, msg); //将列表框中下标为给定值的这一项的字符串给msg

AfxMessageBox(msg);

在函数 OnInitDialog() 中,一般给出列表框中的可选项,例如:m_list.AddString(“篮球” ); // 多行m_list.AddString(“足球” );

m_list.AddString(“排球” );

Page 63: 第 9 章 Windows 控件

63

9.5.5列表框应用举例【例 9-7】编写基于对话框的应用程序,在程序主窗口中有一

个单选列表框班级和一个多选列表框爱好并在该列表框中列出许多爱好,如唱歌,跳舞等,击显示按钮时,将用户选择的内容显示在编辑框数据中,窗口布局如图 9-22 所示。如果在班级或爱好列表框中双击某项则在相应列表框中删除该项。

Page 64: 第 9 章 Windows 控件

64

(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_7 。(2) 按照图 9-22 设置窗口界面添加控件,然后设置控件在对话框中的位置和大小,设置控件的标题属性。(3) 为各个控件连接变量如表 9-13 所示。(4) 为对话框初始化函数 OnInitDialog() 添加代码如下:BOOL CEx9_7Dlg::OnInitDialog(){ // TODO: Add extra initialization here

m_List1.AddString(" 一班 ");m_List1.AddString("二班 ");m_List1.AddString(" 三班 ");m_List1.AddString("四班 ");

m_List2.AddString("篮球 ");m_List2.AddString("足球 ");m_List2.AddString("排球 ");m_List2.AddString("唱歌 ");

return TRUE; // return TRUE unless you set the focus to a control}

ID号 类型 变量名

IDC_LIST1 CListBox m_List1

IDC_LIST2 CListBox m_List2

IDC_EDIT1 CString m_Edi1

Page 65: 第 9 章 Windows 控件

65

(5) 为显示按钮 IDC_BUTTON1 的 BN_CLICKED 消息添加消息响应函数OnButton1() ,并在该函数下添加代码如下:

void CEx9_7Dlg::OnButton1(){ // TODO: Add your control notification handler code here

CString cs;int buffer[5];int i=0;i=m_List1.GetCurSel();if(i>-1)

{m_List1.GetText(i,cs); m_Edit1=m_Edit1+" "+cs;}i=m_List2.GetSelItems(5,buffer); //将所有当前被选列表框项下标放入一整

型数组缓冲区 buffer 中, 5 表示最多取 5 个 , 如果用户选择了第 2 、 3 、 4共 3项,那么 i 的值为 3 , buffer[0]- buffer[2] 的值为那三项的下标 1-3

for(int j=0;j<i;j++){ m_List2.GetText(buffer[j],cs);

m_Edit1=m_Edit1+" "+cs;}UpdateData(FALSE);m_Edit1="";

}

Page 66: 第 9 章 Windows 控件

66

(6) 为班级列表框 IDC_LIST1 添加 LBN_DBLICK 消息响应函数 OnDblclkList1() ,并在该函数下添加代码如下:

void CEx9_7Dlg::OnDblclkList1(){

// TODO: Add your control notification handler code herem_List1.DeleteString(m_List1.GetCurSel());

(7) 为爱好列表框 IDC_LIST2 添加 LBN_DBLICK 消息响应函数 OnDblclkList2() ,并在该函数下添加代码如下:

void CEx9_7Dlg::OnDblclkList2(){

// TODO: Add your control notification handler code herem_List2.DeleteString(m_List2.GetCurSel());

Page 67: 第 9 章 Windows 控件

67

9.6 组合框控件组合框类 CComboBox 是两种预定义窗口的组合形式。在 Win

dows 编程中使用单一控件往往不能完全满足与用户交互的需要,最常见的组合框例子是列表框及与其相联系的静态文本和编辑框。 Windows 应用程序中大量使用该类型的组合框。单击组合框中某选项时 , 会自动把选项内容在编辑框中显示出来。

9.6.1 组合框属性

Page 68: 第 9 章 Windows 控件

68

根据组合框的主要风格特征,可把组合框分为 3 类,普通组合框、下拉式组合框和下拉列表框。组合框的类型取决于在组合框的属性对话框中对类型选项的设置。

简单( Simple ):创建普通组合框,包括一个编辑控件和一个列表框,其中编辑框控件用来接收用户的输入。

下移( Dropdown ):创建下拉式组合框,该类型与简单组合框类似。但仅当用户单击了编辑框控件右边的下拉箭头时组合框的列表框部分才被显示,此值为默认值。

下拉列表( Drop List ):下拉列表框,直到用户打开时才显示列表框,用户只能从列表框中选择选项,不允许用户输入。

把组合框控件拖到对话框面板后,单击三角按钮,出现一个虚框,虚框的大小决定程序运行时下拉列表框的大小,用鼠标拖动中间的小方框,可以调整虚框的大小。

Page 69: 第 9 章 Windows 控件

69

9.6.2 组合框类的成员函数成员函数 功能GetCount() 用以获得组合框的项数GetCurSel() 用以得到用户选中下拉列表框中数据的索引值SetCurSel 选取列表框中的一个选项,索引从 0开始SetEditSel 设置编辑区中蓝色选中字段的长度Clear() 针对组合框中选定的文字进行删除Cut() 针对组合框中选定的文字进行剪切Paste() 针对组合框中选定的文字进行粘贴Copy() 针对组合框中选定的文字进行复制LimitText() 限制在编辑框中键入的文本长度GetLBText() 其作用就是把索引号为 nIndex的数据放到 rString变量中GetLBTextLen() 得到索引号为 nIndex中数据的长度AddString() 在组合框的末尾添加字符串InsertString() 在指定位置插入字符串DeleteString() 删除指定的索引项ResetContent() 清除组合框中所有的内容SetDroppedWidth() 设定下拉列表框的最小宽度GetDroppedWidth() 返回下拉列表框的宽度

Page 70: 第 9 章 Windows 控件

70

9.6.3 组合框的消息控件通知消息 发生事件

CBN_CLOSEUP 组合框中的列表框即将隐藏CBN_DBLCLK 双击组合框中的列表项CBN_DROPDOWN 组合框中的列表框即将下拉CBN_EDITCHANGE 组合框中的编辑框的文本发生改变CBN_EDITUPDATE 组合框中的编辑框将显示修改过的文本

CBN_SELENDCANCEL 用户的选择被取消。用户单击某一项,然后单击另一窗口或控件隐藏组合框的列表框

CBN_SELENDOK 对于下拉列表框,用户选择一项并按回车键CBN_KILLFOCUS 组合框失去输入焦点CBN_SETFOCUS 组合框获得输入焦点

CBN_SELECHANGE

对于普通组合框,当用户单击列表框或使用箭头键导致组合框的列表框选择即将被更改。要处理

这个消息,可以通过 GetLBText 或其它类似的成员函数获取组合框的编辑控件中的文本

Page 71: 第 9 章 Windows 控件

71

9.6.4 组合框的使用组合框一般连接 ComboBox 类型的变量。可以在 OnInitDialog() 函数中使用 m_xx.AddString(“85”); 的语句来给组合框装载选项,还可以打开组合框的属性表(右击控件,选 Properties )选 Data 标签,在中间的空白窗口内输入即可,每输完一项后,按 Ctrl+Enter 组合键换行输入下一项。全部选项输入完后才按 Enter 键结束。如果同时使用这两种方法装载选项,选中 Sort 属性,插入的内容将按照字母顺序排序,否则,从 Data 标签添加的选项排在前面。

Page 72: 第 9 章 Windows 控件

72

如果希望设置组合框选项的默认值,可以在 OnInitDialog() 函数中添加代码如下:

m_ cb.SelectString(-1,“95”); // 选中值为“ 95”那个选项或 m_ cb.SetCurSel(0) ; // 选中下标为 0 的那个选项

如果希望在消息框中显示组合框中当前选项,代码如下:char st[15];m_cb.GetWindowText(st,15); // 获得组合框 m_cb 的正文 ( 长度是 15), 并放到变量 st 中AfxMessageBox(st);

如果希望根据组合框中当前选项做出不同处理,要给组合框添加 CBN_SELENDOK 消息响应函数,并添加代码如下:

int i;i= m_cb.GetCurSel(); // 得到组合框的下标给变量 iif (i ==0) {AfxMessageBox(“籍贯是上海” );}else if (i ==1) {AfxMessageBox(“籍贯是北京” );}else {AfxMessageBox(“籍贯是河北” );}

Page 73: 第 9 章 Windows 控件

73

9.6.5 组合框控件应用举例【例 9-8】本例创建组合框控件,当单击向下按钮时,显示可

选的住址,也可以自己输入地址,击确定按钮时,弹出消息框显示所选或输入的内容如图 9-25 所示。

Page 74: 第 9 章 Windows 控件

74

(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_8 。(2) 按照图 9-25 设置窗口界面添加控件,然后设置控件在对话框中的位置和大小,设置控件

的标题属性。(3) 为控件 IDC_COMBO1连接 CcomboBox 类型的变量m_Co

mbox1 。(4) 为对话框初始化函数 OnInitDialog() 添加代码如下:BOOL CEx9_8Dlg::OnInitDialog(){ // TODO: Add extra initialization here

m_Combox1.AddString("河北省石家庄市 ");m_Combox1.AddString("河北省保定市 ");m_Combox1.AddString("河北省张家口市 ");m_Combox1.AddString("河北省邢台市 ");m_Combox1.AddString("河北省邯郸市 ");m_Combox1.AddString("河北省承德市 ");m_Combox1.AddString("河北省衡水市 ");

return TRUE; // return TRUE unless you set the focus to a control

}

Page 75: 第 9 章 Windows 控件

75

(5) 为“确定”按钮添加 BN_CLICKED 消息响应函数 OnOK() ,添加代码如下:

BOOL CEx9_8Dlg:: OnOK(){

// TODO: Add extra validation hereCString msg;m_Combox1.GetWindowText(msg);AfxMessageBox(msg);CDialog::OnOK();

Page 76: 第 9 章 Windows 控件

76

9.7 滚动条控件 滚动条是一个交互式的、高度可视化的控件它包括一个滑块、滚动条的两端的按钮等。

滚动条控件与属于窗口的滚动条是不一样的

处于窗口的滚动条是由该窗口创建、管理和释放的

滚动条控件是由用户创建、管理和释放的

Page 77: 第 9 章 Windows 控件

77

9.7.1 滚动条类的成员函数成员函数 功能

GetScrollRange() 获取当前滚动条的最大最小值SetScrollRange() 设置当前滚动条的最大最小值

GetScrollPos() 获取给定滚动条滑块的当前位置SetScrollPos() 设置给定滚动条滑块的当前位置

ShowScrollBar() 显示或隐藏滚动条EnableScrollBar() 设置滚动条箭头有效或无效GetScrollInfo() 获取给定滚动条信息

SetScrollInfo() 设置给定滚动条信息GetScrollLimit() 获取给定滚动条的最大滚动值

Page 78: 第 9 章 Windows 控件

78

9.7.2 滚动条控件的使用滚动条控件一定要连接 CScrollBar 类型的变量。1. 设置滚动条控件的范围 滚动条控件的默认滚动范围是 0-0 ,因此在使用滚动条控件时,还要设置滚动条的范围,设置滚动条范围是通过调用 SetScrollRange() 函数进行的,该函数原型如下:void SetScrollRange(int nMin,int nMax,BOOL bRedraw =TURE);其中, nMin 和 nMax 表示滚动条的最小最大位置, bRedraw 表示重画标志,其值为 TRUE 时,滚动条被重画。设置滚动范围是在对话框类的 OnInitDialog() 中添加语句完成的。比如,设置滚动条的滚动范围为 -100 到 100 ,假设滚动条连接的变量为 m_scroll ,在 OnInitDialog() 中添加代码如下:m_scroll.SetScrollRange(-100,100);

Page 79: 第 9 章 Windows 控件

79

2. 设置滚动条控件的当前位置在设置滚动条的滚动范围后,还必须设置滚动块的当前位置,设置滚动块的当前位置通过函数 SetScrollPos() 函数来完成,该函数原型如下:void SetScrollPos(int nPos);参数 nPos 表示新的滑动条位置。如果设置滚动块的位置在 -100 到 100 的中间,即为 0 的位置,在相应函数中添加代码如下:m_scroll.SetScrollPos(0);

Page 80: 第 9 章 Windows 控件

80

3. 滚动条控件的消息响应在一个对话框中,不论有几个垂直滚动条,只添加一个成员函

数 OnVScroll(),不论有几个水平滚动条,只添加一个成员函数 OnHScroll()。

OnVScroll(UNIT nSBCode,UNIT nPos,CScrollBar* pScrollBar);

滚动条动作标识

滚动块的位置

指向滚动条变量的指针

函数有三个参数。第一个参数 nSBCode 表示滚动条发生的是哪一动作,如单击向上箭头,或者单击向下箭头等,表 9-17 列出了常用的滚动条动作标识。第二个参数 nPos 表示当前滚动块在滚动条中的位置。第三个参数 pScrollBar 表示与事件相关联的是哪一个滚动条。

Page 81: 第 9 章 Windows 控件

81

动作标识 发生事件SB_TOP 滚动到滚动条最顶端SB_BOTTOM 滚动到滚动条最底端SB_RIGHT 滚动到左边SB_LEFT 滚动到左边SB_PAGEUP 向上滚动一页SB_PAGEDOWN 向下滚动一页SB_PAGELEFT 向左滚动一页SB_PAGERIGHT 向右滚动一页SB_LINEDOWN 向下滚动一行SB_LINEUP 向上滚动一行SB_LINELEFT 向左滚动一行SB_LINERIGHT 向右滚动一行SB_THUMBPOSITION 滚动框移动到新位置SB_THUMBTRACK 滚动框被拖动SB_ENDSCROLL 滚动到最终位置

Page 82: 第 9 章 Windows 控件

82

9.7.3 滚动条类编程实例【例 9-9】编写一个基于对话框的应用程序,个人爱好问卷调

查。其主窗口如图 9-26 所示。三个垂直滚动条分别表示上网、运动和家务的爱好程度,取值从 0 到 100 。在下面的编辑框中显示出相应滚动条当前值。

Page 83: 第 9 章 Windows 控件

83

(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_9 。(2) 按照图 9-26 设置窗口界面添加控件,然后设置控件在对话框中的位置和大小,设置控

件的标题属性。(3) 为各个控件连接变量如表 9-18 所示。

ID号 类型 变量名IDC_EDIT1 CString m_Edit1IDC_EDIT2 CString m_Edit2IDC_EDIT3 CString m_Edit3

IDC_SCROLLBAR1 CScrollBar m_Scrollbar1IDC_SCROLLBAR2 CScrollBar m_Scrollbar2IDC_SCROLLBAR3 CScrollBar m_Scrollbar3

Page 84: 第 9 章 Windows 控件

84

(4) 为对话框类 CEx9_9Dlg 添加公有型成员变量 position 。(5) 为对话框初始化函数 OnInitDialog() 添加代码如下:BOOL CEx9_9Dlg::OnInitDialog(){ // TODO: Add extra initialization here

position=0;m_Scrollbar1.SetScrollRange(0,100);m_Scrollbar2.SetScrollRange(0,100);m_Scrollbar3.SetScrollRange(0,100);m_Scrollbar1.SetScrollPos(0);m_Scrollbar2.SetScrollPos(0);m_Scrollbar3.SetScrollPos(0);m_Edit1.Format("%d",m_Scrollbar1.GetScrollPos());m_Edit2.Format("%d",m_Scrollbar2.GetScrollPos());m_Edit3.Format("%d",m_Scrollbar3.GetScrollPos());

UpdateData(FALSE); // 可以去掉?必须有此语句 return TRUE; // return TRUE unless you set the focus to a control

}

Page 85: 第 9 章 Windows 控件

85

(6) 在该 OnVScroll 函数中添加代码如下:void CEx9_9Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScr

ollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default

switch(nSBCode){

case SB_THUMBTRACK:position=nPos; break;

case SB_LINEDOWN:position=pScrollBar->GetScrollPos();position+=5;if(position>=100) position=100;break;

Page 86: 第 9 章 Windows 控件

86

case SB_LINEUP:position=pScrollBar->GetScrollPos();position-=5;if(position<=0) position=0;break;

case SB_PAGEDOWN:position=pScrollBar->GetScrollPos();position+=20;if(position>=100) position=100;break;

case SB_PAGEUP:position=pScrollBar->GetScrollPos();position-=20;if(position<=0) position=0;break;

}

Page 87: 第 9 章 Windows 控件

87

pScrollBar->SetScrollPos(position);m_Edit1.Format("%d",m_Scrollbar1.GetScrollPos());m_Edit2.Format("%d",m_Scrollbar2.GetScrollPos());m_Edit3.Format("%d",m_Scrollbar3.GetScrollPos());UpdateData(FALSE);

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}(7) 为确定按钮的 BN_CLICKED 消息添加消息响应函数 OnBut

ton1() ,并在该函数下添加代码如下:void CEx9_9Dlg::OnButton1(){

// TODO: Add your control notification handler code hereOnOK();

}

Page 88: 第 9 章 Windows 控件

88

9.8 滑动条控件滑动条控件( Slider )可以使用户通过拖动滑块来快速

获得指定的数据。滑动条控件是由滑动块和可选的刻度线组成的。滑动条控件在选择一系列离散值或者一段连续范围内的时候十分有用。滑动条是按照应用程序中指定的增量来移动。例如,如果用户指定此滑动条的范围为 5 ,则滑动块只能有 6 个位置,即在滑动条控件最左边的一个位置和另外 5 个在此范围内每隔一个增量的位置。通常,这些位置都是由相应的刻度线来标识。9.8.1 滑动条的属性

Page 89: 第 9 章 Windows 控件

89

9.8.2 滑动条类的成员函数成员函数 功能

CprogressCtrl() 构造 CprogressCtrl对象Create() 创建进度条SetRange() 设置表示范围SetPos() 设置当前位置SetStep() 设置渐进步长StepIt() 前进一步SetTic() 设置滑动条控件中的一个刻度线的位置SetTicFreq() 用来设置显示在滑动条中的刻度线的疏密程

度ClearTics() 从滑动条控件中删除当前的刻度线SetSelection() 用来设置一个滑动条控件的开始和结束位置

Page 90: 第 9 章 Windows 控件

90

9.8.3 滑动条的使用1. 与滚动条一样,可以指定滑块的范围和当前位置。成员函数 SetPos 和 SetRange 分别用来设置滑动条的位置和范围,

其原型如下:void SetPos(int nPos);

void SetRange(int nMin,int nMax,BOOL bRedraw =FALSE);

其中,参数 nPos 表示新的滑动条位置。 bMin 和 nMax 表示滑动条的最小最大位置, bRedraw 表示重画标志,其值为 TRUE时,滑动条被重画。与这两个函数相对应的成员函数 GetPos和 GetRange 是分别用来获取滑动条的位置和范围的。

2. 设置滑动条控件中的一个刻度线的位置成员函数 SetTic 用来设置滑动条控件中的一个刻度线的位置。函

数成功调用后返回非零值;否则返回 0 。函数原型如下:BOOL SetTic(int nTle);

其中,参数 nTie 表示刻度线的位置。

Page 91: 第 9 章 Windows 控件

91

3. 滑动条消息响应与滚动条控件一样,滑动条也不处理消息,也是对父窗口(对

话框)发送 Scroll 消息,由父窗口来处理。在一个对话框中,不论有几个垂直滚动条与垂直滑动条,只在对话框类中添加一个成员函数 OnVScroll() ,不论有几个水平滚动条与水平滑动条,只添加一个成员函数 OnHScroll() 。

Page 92: 第 9 章 Windows 控件

92

9.8.4滑动条类编程实例【例 9-10】把例 9-9 用滑动条实现。如图 9-28 所示。(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_10。(2) 按照图 9-28 设置窗口界面添加控件,然后设置控件在对话框中的位置和大小,设置控件的标题属性。

Page 93: 第 9 章 Windows 控件

93

(3) 为各个控件连接变量如表 9-20 所示。

ID号 类型 变量名

IDC_EDIT1 CString m_Edit1

IDC_EDIT2 CString m_Edit2

IDC_EDIT3 CString m_Edit3

IDC_SLIDER1 CSliderCtrl m_Slider1

IDC_SLIDER2 CSliderCtrl m_Slider2

IDC_SLIDER3 CSliderCtrl m_Slider3

Page 94: 第 9 章 Windows 控件

94

(4) 为对话框初始化函数 OnInitDialog() 添加代码如下:BOOL CEx9_10Dlg::OnInitDialog(){ // TODO: Add extra initialization here

m_Slider1.SetRange(0,100);m_Slider2.SetRange(0,100);m_Slider3.SetRange(0,100);m_Edit1.Format("%d",m_Slider1.GetPos());m_Edit2.Format("%d",m_Slider2.GetPos());m_Edit3.Format("%d",m_Slider3.GetPos());UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control

}

Page 95: 第 9 章 Windows 控件

95

(5) 为对话框类添加 WM_VSCROLL 消息映射函数,在 OnVScroll 函数中添加代码如下:

void CEx9_10Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{ // TODO: Add your message handler code here and/or call default

CSliderCtrl *pSlider=(CSliderCtrl*)pScrollBar; // 强制类型转换

if(pSlider==&m_Slider1)

m_Edit1.Format("%d",pSlider->GetPos());

else

if(pSlider==&m_Slider2)

m_Edit2.Format("%d",pSlider->GetPos());

else m_Edit3.Format("%d",pSlider->GetPos());

UpdateData(FALSE);

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);

}

Page 96: 第 9 章 Windows 控件

96

9.9 翻动按钮控件翻动按钮( Spin )控件提供了一对箭头,用户通过点击箭头可

以微调该控件所表示的数值。当用户点击上箭头,则位置向最大值偏移,当用户点击下箭头,则位置向最小值偏移。

翻动按钮控件通常与相伴的控件一起使用,这个控件称为伙伴窗口。若相伴的控件的 Tab 键次序刚好在翻动按钮控件的前面,则这时的翻动按钮控件可以自动定位在它的伙伴窗口的旁边,看起来就像一个单一的控件。通常,将一个翻动按钮控件与一个编辑框一起使用,以提示用户进行数字输入。

与滚动条、滑动条一样,翻动按钮也不处理消息,也是对父窗口(对话框)发送 Scroll 消息,由父窗口来处理。响应对话框类成员函数 OnVScroll() 和 OnHScroll() 。

Page 97: 第 9 章 Windows 控件

97

9.9.1 翻动按钮的属性

Page 98: 第 9 章 Windows 控件

98

9.9.2 翻动按钮类的成员函数

成员函数 功能CspinButtonCtrl() 构造 CSpinButtonCtrl对象

Create() 创建一个微调按钮对象

SetBase()设置显示的基,也就是以十进制还是十六进制还是其它进制显示数据

SetBuddy() 设置该控件的伙伴窗口SetPos() 设置当前位置SetRange() 设置选取范围GetBuddy() 获得该控件的伙伴窗口

Page 99: 第 9 章 Windows 控件

99

9.9.3 翻动按钮编程实例【例 9-11】把例 9-9 用翻动按钮实现。如图 9-30 所示。(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_11 。(2) 按照图 9-30 设置窗口界面 : 添加控件,然后设置控件在对话

框中的位置和大小,设置控件的标题属性。

Page 100: 第 9 章 Windows 控件

100

由于 Spin 控件通常和 tab order 标识值位于它之前的控件成对使用,所以每放置一个翻动按钮前要先放置一个编辑框,做为翻动按钮的伙伴。还要在翻动按钮控件属性对话框中选中“自动结伴”和“设置结伴整数”属性,使伙伴窗口的数值自动改变。

(3) 为各个控件连接变量如表 9-22 所示。

ID 类型 变量名IDC_EDIT1 CString m_Edit1

IDC_EDIT2 CString m_Edit2IDC_EDIT3 CString m_Edit3

IDC_SPIN1 CSpinButtonCtrl m_Spin1IDC_SPIN 2 CSpinButtonCtrl m_Spin2

IDC_SPIN 3 CSpinButtonCtrl m_Spin3

Page 101: 第 9 章 Windows 控件

101

(4) 为对话框初始化函数 OnInitDialog() 添加代码如下:BOOL CEx9_11Dlg::OnInitDialog(){ // TODO: Add extra initialization here

CSpinButtonCtrl *pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);

// 对所有控件都可以使用 GetDlgItem() 函数来根据 ID号得到指向该控件的指针 ,之后再将其转成相应类的指针

pSpin->SetRange(0,100);pSpin->SetPos(50);m_Edit1.Format("%d",pSpin->GetPos());

pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN2);pSpin->SetRange(0,100);pSpin->SetPos(50);m_Edit2.Format("%d",pSpin->GetPos());

Page 102: 第 9 章 Windows 控件

102

pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN3);

pSpin->SetRange(0,100);

pSpin->SetPos(50);

m_Edit3.Format("%d",pSpin->GetPos());

UpdateData(FALSE);

return TRUE; // return TRUE unless you set the focus to a control

}

(5) 为对话框类添加 WM_VSCROLL 消息映射函数,对 OnVScroll() 函数不做修改,调用默认的函数即可。

Page 103: 第 9 章 Windows 控件

103

9.10Progress 控件进度条控件是一个用来指示长时间操作的进展程度的控件。它

包括从左到右使用系统高亮颜色显示渐进过程的矩形。MFC 中表示进度条控件的是 CProgressCtrl 类,该类提供了 W

indows 通用进度条的功能。该类的主要成员函数及功能如表9-23 所示。进度条有一个范围和当前位置。范围表示整个操作的持续时间,当前位置表示当前进行到的位置,进度条根据当前位置来判断进行的百分比,来显示进度。

成员函数 功能CprogressCtrl() 构造 CProgressCtrl对象Create() 创建进度条SetRange() 设置表示范围SetPos() 设置当前位置SetStep() 设置渐进步长StepIt() 前进一步

Page 104: 第 9 章 Windows 控件

104

【例 9-12】设置如图 9-31 所示的 Progress 控件,单击开始按钮后,每过 0.1 秒,进度条前进一步。计时器前进到最大值时,弹出消息框,显示“进行完毕”。

Page 105: 第 9 章 Windows 控件

105

(1) 用应用程序向导生成一个基于对话框的应用程序 ex9_12 。(2) 按照图 9-31 设置窗口界面添加控件,然后设置控件在对话框中的位置和大小,设置控件的标题属性。要设置 Progress 控件的 Smooth 属性,表示平滑地填充进度条,否则就会用块来填充。(3) 为对话框初始化函数 OnInitDialog() 添加代码如下:BOOL CEx9_12Dlg::OnInitDialog(){

// TODO: Add extra initialization hereCProgressCtrl *pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetRange(0,100);pProg->SetPos(50);return TRUE; // return TRUE unless you set the focus to a control

}

Page 106: 第 9 章 Windows 控件

106

(4) 为开始按钮的 BN_CLICKED 消息添加消息响应函数 OnButton1() ,并在该函数下添加代码如下:void CEx9_12Dlg::OnButton1(){ // TODO: Add your control notification handler code here

CProgressCtrl *pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetPos(0);SetTimer(1000,100,NULL);// 设置计时器, 1000 是计时器编号,可以自己设定, 10

0 表示 100 毫秒,即 0.1 秒,每过 0.1 秒就会自动运行一次 CEx9_12Dlg 类的 OnTimer(UINT nIDEvent) 函数, OnTimer() 函数的参数为当前到点的计时器编号}

Page 107: 第 9 章 Windows 控件

107

(5) 在 CEx9_12CtrlDlg 中添加对 WM_TIMER 消息的响应函数 OnTimer() ,添加代码如下:void CEx9_12Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default

if(nIDEvent==1000){

CProgressCtrl *pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);

pProg->SetPos(pProg->GetPos()+1);if(pProg->GetPos()>=100){ KillTimer(nIDEvent); // 销毁计时器

AfxMessageBox(" 进行完毕 ");}

}CDialog::OnTimer(nIDEvent);

}

Page 108: 第 9 章 Windows 控件

108

(6) 为结束按钮的 BN_CLICKED 消息添加消息响应函数 OnButton2() ,并在该函数下添加代码如下:void CEx9_12Dlg::OnButton2(){

// TODO: Add your control notification handler code here

OnOK();}

Page 109: 第 9 章 Windows 控件

109

请大家自己出题做几种控件的综合应用

Page 110: 第 9 章 Windows 控件

110

OnInitDialog()函数编写方法 :

1、复选框1 )不连变量: CheckDlgButton(IDC_check,1); 2)连接 BOOL型变量 :m_bool=TRUE; UpdateData(FALSE);

3)连接 Cbutton型变量 : m_check.SetCheck(1);

2、单选按纽1)不连变量: CheckRadioButton(IDC_radio1, IDC_radio9, IDC_radio2); 2)连接 int型变量 :m_radio=3; UpdateData(FALSE);3)连接 Cbutton型变量 : m_radio.SetCheck(1);

Page 111: 第 9 章 Windows 控件

111

OnInitDialog()函数编写方法 :3、组合框

m_xx.AddString("85");m_xx.AddString("90");m_xx.AddString(“95”);//多行m_xx.SelectString(-1,"95"); 或者 m_xx.SetCurSel(0);

UpdateData(FALSE);

4、滚动条m_scroll.SetScrollRange(-100,100);m_scroll.SetScrollPos(10);

5、列表框 m_list.AddString(“xxxx”);//多行

Page 112: 第 9 章 Windows 控件

112

9.11 通用对话框Windows 提供了一组标准用户界面对话框,它们都有相应的 MF

C 类来支持。用户或许早已熟悉了这些对话框,因为在 Windows 的应用程序中早已使用过它们,比如 WORD 。所有这些通用对话框类是从一个公共的基类 CCommonDialog派生而来。

对话框类 说明CColorDialog “ ”颜色 对话框,用户可以选择或创建颜色

CFileDialog “ ”文件 对话框,用户可以打开或保存一个文件CFindReplaceDialog “ ”查找替换 对话框,用户可以查找或替换指定字符

串CPageSetupDialog “ ”页面设置 对话框,用户可以设置页面参数CFontDialog “ ”字体 对话框,用户可以从列出的可用字体中选择

一种字体CPrintDialog “ ”打印 对话框,用户可以设置打印机的参数及打印

文档

Page 113: 第 9 章 Windows 控件

113

这些对话框都有一个共同特点,就是它们都从用户获取信息,但并不对信息进行处理。例如,“文件”对话框可以帮助用户选择一个用于打开的文件,但它实际上只是给程序提供了一个文件路径名,用户的程序必须调用相应的成员函数才能打开文件。

1. 通用文件对话框通用文件对话框类 CFileDialog 的构造函数的原型如下:CFileDialog ( BOOL bOpenFileDialog,

LPCTSR lpszDefExt=NULL,

LPCTSTR lpszFileName=NULL,

DWORD dwFlags=OFN_HIDEREADONLY|OFN_OVER-WRITEPROMPT,

LPCTSTR lpszFilter =(NULL,CWad*pParentWnd=NULL)

参数含义如下:

Page 114: 第 9 章 Windows 控件

114

(1)bOpenFileDialog 为 TRUE 是表示文件打开对话框,为 FALSE 是表示文件保存对话框。

(2)lpszDefExt 用来指定文件扩展名。若用户在文件名编辑中没有键入扩展名,则系统在文件名后自动添加 lpszDefExt 指定的扩展名。

(3)lpszFileName 用来指定在文件名编辑框中出现的文件名,若为 NULL 时,则不出现。

(4)dwFlags 用来指定对话框的界面标志,当为 OFN_HIDEREADONLY 时表示隐藏对话框中的“只读”复选框,当为 OFN_OVER-WRITEPROMPT 时表示文件保存时,若指定的文件有重名,则出现提示对话框。

(5)lpszFilter 参数用来确定出现在文件列表框中的文件类型。它由一对或多对字符串组成,每对字符串中第一个字符串表示过滤器名称,第二个字符串表示文件扩展名,若指定多个扩展名则用“:”分隔,字符串最后用两个“ |”结尾。注意,字符串最好写在一行,若一行写不下则用“ \”连接。

(6)pParentWnd 用来指定对话框的父窗口指针。

Page 115: 第 9 章 Windows 控件

115

通用文件对话框类 CFileDialog 的成员函数主要有:(1)GetPathName() 用来获取文件的全路径名。(2)GetFileName() 函数返回在对话框确定的文件名。(3)GetFileExt() 函数返回在对话框确定的文件扩展名。注意,只有当调用对话框类的成员函数 DoModal 并返回 IDO

K 后,该对话框类的这些属性成员函数才会有效。例如,下列代码运行后将弹出如图 9-32 所示的对话框。选定

一个文件后,单击“打开”按钮,就会弹出一个消息对话框,显示该文件的全路径名称。

CString filter;filter=" 文本文件 (*.txt)|*.txt|C++ 文件 (*.h*.cpp)|*.h;*.cpp||";CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,

filter);if(dlg.DoModal()==IDOK){

CString str=dlg.GetPathName();AfxMessageBox(str);

}

Page 116: 第 9 章 Windows 控件

116

2. 通用颜色对话框通用颜色对话框类名 CColorDialog ,通用颜色对话框如图所示。例如,下列代码运行后将弹出颜色对话框,当用户选择颜色后,

击确定按钮时,所选择的颜色赋值给变量m_color 。COLORREF m_color;CColorDialog dlg;if (dlg.DoModal()==IDOK)

m_color= dlg.GetColor();

GetColor() 为通用颜色对话框类CColorDialog 的成员函数。

Page 117: 第 9 章 Windows 控件

117

9.12 消息对话框消息对话框是最简单的一类对话框,它只是用来显示信息的。在

MFC 类库中提供了两个函数用来创建和显示消息对话框, AfxMessageBox 是全局函数,可以用在任何地方,在前面的例子中已经多次用到,而MessageBox 只能在控件、对话框、窗口等一些窗口类中使用。它们的函数原型如下:

int AfxMessageBox(LPCTSTR lpszText,UINT nType=MB_OK,UINT nlDHelp=0);

int MessageBox(LPCCTSTR lpstText,LPCTSTR lpszCaption=NULL,UINT nType=MB_OK);

参数含义如下:(1)lpszText 表示在消息对话框中显示的字符串文本。(2)nType 表示消息对话框的图标类型以及所包含的按钮类型,这些类型是用 MFC预先定义的一些标识符来指定的,如 MB_ICONSTOP 、 MB_YESNOCANCEL 等,具体如表 9-25 和表 9-26 所示。图标类型和按钮类型的标识可使用按位或运算符“ |” 来组合。

(3)nIDHelp 表示消息的上下文帮助 ID 标识符。(4)lpszCaption 表示消息对话框的标题,其值为 NULL 时使用默认标题。

Page 118: 第 9 章 Windows 控件

118

图标类型 含义MB_ICONHAND、MB_ICONSTOP、MB_ICONERR

OR用来表示错误或停止

MB_ICONQUESTION、MB_ICONWARNING 用来表示疑问MB_ICONEXCLANMATION、MB_ICONWARNING 用来表示警告

MB_ICONASTERISK、MB_ICONINFORMATION 用来表示信息

按钮类型 含义MB_ABOUTRETRYIGNORE “ ” “ ” “ ”表示含有 关于 、 重试 、 忽略 按钮

MB_OK “ ”表示 确定 按钮MB_OKCANCEL “ ” “ ”表示 确定 、 取消 按钮MB_RETRYCACEL “ ” “ ”表示 重试 、 取消 按钮MB_YESNO “ ” “ ”表示 是 、 否 按钮MB_YESNOCANCEL “ ” “ ” “ ”表示 是 、 否 、 取消 按钮

Page 119: 第 9 章 Windows 控件

119

例如, MessageBox(" 你喜欢 MFC 吗? ","提问 ",MB_OKCANCEL|MB_ICONQUESTION);语句执行时弹出一个消息框,标题为“提问”,消息

框显示的内容是“你喜欢 MFC 吗?”,消息框中有“确定”和“取消”按钮,还有“问号”图标。

Page 120: 第 9 章 Windows 控件

120

本章小结• 控件在可视化编程中的应用主要步骤

1. 创建基于对话框项目 2. 设计界面3. 添加成员变量4. 添加消息响应代码– 前两步也叫做应用程序的可视化编程部分– 后两步也叫做应用程序的代码编程部分

• 控件由来和设计– Windows 控件 CStatic,CButton,CEdit,CListBox,,,– MFC 控件 CBitmapButton,CListCtrl,,, – MFC 类– 控件设计

Page 121: 第 9 章 Windows 控件

121

实验• 将 9-1 至 9-12 实例综合为一个基于对话框的应用程序,

以学友为例设计类,必要的属性,并将输入数据保存在数组或向量中。

• 完成“多媒体同学地图系统”的同学基本信息管理功能模块。将对话框以菜单操作调出——参看第 10 章– 同学基本信息:至少使用每种控件一个– 通用对话框:地图着色– 组合框:选择省份– Tree 控件:中国城市(中国、省、市三级)

Page 122: 第 9 章 Windows 控件

122

补充 3 : ActiveX 控件开发

• Hello 控件• 时钟控件(孙鑫视频 18 讲)

– 属性( Property )–方法( Method )– 事件( Event )

Page 123: 第 9 章 Windows 控件

123

Hello 控件• MFC ActiveX ControlWizard • OnDraw

– pdc->TextOut(1,rcBounds.Height()/2,"Hello Control!");

• 测试控件– 控件容器– 网页– PPT

13:50:14Hello Control!

Page 124: 第 9 章 Windows 控件

124

COM 组件历史• 87 , DDE : Dynamic Data Exchange ,主要解决进程间通信问题,局限在

于通信数据量以及网络数据通信,之后出现过 NetDDE 、 FastDDE 和 AdvancedDDE 等扩展版。

• 90 , OLE : Object Linking and Embedding ,对象连接与嵌入,提供了建立复合文档的方法。 1.0 版本中使用了 Virtual Function Table(VTBL) 技术,93 ,在 2.0 中已经由 COM 取代。

• 94 , OLE Custom Controls :当时作为一种 VB Extension 控件的替代方案,以扩展名为 .ocx 的动态链接库的形式封装。

• 96 , ActiveX :从 OLE Custom Controls 发展而来,主要是为了使控件面向Internet 应用,在 ActiveX 架构中,除了 IUnknown 接口之外,其余接口均是可选的,这样使得控件文件更小,下载速度更快。

• 96 , DCOM : Distributed Component Object Model ,分布式组件对象模型,扩展 COM 功能,使其支持不同电脑上的对象之间进行通信。

• 96 , MTS : Microsoft Transaction Server, 99,DCOM+• 2000 , COM+ :将 MTS 集成到COM 技术中。

Page 125: 第 9 章 Windows 控件

125

COM 与 .NET• COM ( Component Object Model 组件对象模型)是微软公司于 1

993年提出的一种组件技术,是软件对象组件之间相互通信的一种方式和规范,它是一种平台无关、语言中立、位置透明、支持网络的中间件技术。

• 2002 年推出了 .NET 框架,其中的核心技术就是用来代替 COM 组件功能的 CLR ( Common Language Runtime公共语言运行库),可采用各种编程语言,利用托管代码来访问(例如 C# 、 VB 、 MC++ ),使用的是 .NET 的框架类库 FCL ( Framework Class Library )

• 为了解决 COM 所存在的这些问题,微软公司的 COM 和 MTS小组,计划开发一个新的组件平台。开始时叫 COM3 或 COM+ 2.0 ,后来又叫 COR ( Component Object Runtime 组件对象运行时)和 URT ( Universal Runtime 通用运行时),最后才被命名为 CLR ( Common Language Runtime公共语言运行时 [ 库 /层 ] )。它是现在(由微软提交的)成为国际标准的 CLI ( Common Language Infrastructure公共语言基础结构)在 Windows平台上的一种具体实现。 CLI 是针对可执行代码格式、以及能执行该代码的运行时环境的一种规范。

• 鉴于与 COM 相比, CLR 组件所具有的无比优越性。 COM 技术必然会走向灭亡,而 .NET 的 CLR 终将取而代之。

Page 126: 第 9 章 Windows 控件

126

ActiveX 控件的四种属性 • Stock :为每个控件提供的标准属性,如字体

或颜色。• Ambient :围绕控件的环境属性——已被置入

容器的属性。这些属性不能被更改,但控件可以使用它们调整自己的属性。

• Extended :这些是由容器处理的属性,一般包括大小和在屏幕上的位置。

• Custom :由控件开发者添加的属性。

Page 127: 第 9 章 Windows 控件

127

控件添加属性 • classwizard->automation 。在 classname

中选择 CCtrl 类,然后点击 add property按钮添加属性

• 属性页中添加系统属性• 添加自定义属性• 属性页中添加自定义属性设置

Page 128: 第 9 章 Windows 控件

128

控件添加方法 • classwizard->Automation->Add Method->

External Name (外部被调用时候所使用的名称),向导会自动在 CCtrl 添加相应的方法

• 调试方法是采用自带的 ActiveX 控件测试容器, control->invoke methods( 调用方法 )->method name 下拉式列表中选择对应方法名称,点击 Invoke即可

Page 129: 第 9 章 Windows 控件

129

控件添加事件

• 事件分为系统标准事件(如 click 等)和自定义事件。• 在 ClassView 中右键点击 _DClockEvents ,选择添加事

件,在 Add Event 对话框上选择 External Name 下拉列表,选择标准事件,如 click 。

• 在 ClassView 中右键点击 _DClockEvents ,选择添加事件,在 Add Event 对话框上选择 External Name ,填写自己想创建的外部使用的事件名称。创建完成后发现CCtrl 的类视图中添加了一个事件映射: FireEventName ( eventname 为自定义事件的外部名称)。然后在想触发该事件的地方调用 FireEventName ,以此通知容器中的控件相应的事件可以被触发了,然后用户可在容器中编写相应的代码。

Page 130: 第 9 章 Windows 控件

130

自定义属性设置的长期有效性• 在控件类中的 DoPropExchange 方法中提供了属性值保存

的长期有效性,在其中可以调用以 PX打头的方法让用户自定义的属性值长期有效。调用哪种 PX打头的方法取决于自定义属性所对应的内部成员变量的类型。以 PX_SHORT举例,第一个参数是 DoPropExchange 方法中参数指针,第二个参数是属性的外部名称,第三个是属性所对应的内部成员变量名称。第四个是属性的默认填充值。

• 在属性通知方法 OnIntervalChanged 内调用 BoundPropertyChanged 方法即可,参数是属性 ID ,可以在类视图中双击属性名称即可看到( id(XXX) , XXX即为属性 ID )。

Page 131: 第 9 章 Windows 控件

131

检测容器的环境属性• 检测控件是在容器的运行模式还是在设计模式下可调用方法:

AmbientUserMode 。 • VC 调用 ActiveX 控件

– 方法一:直接在对话框上右键选择 Insert ActiveX Control– 方法二:菜单 project->add to project->component and contr

ols ,选择已经注册的 ActiveX 控件。向导会自动添加一个关于控件的类,在该类中有 ActiveX 控件定义好的属性和方法,它 Create 方法可以动态创建一个 ActiveX 控件,其操作过程很动态创建 button很类似。至于给控件添加事件,可以在控件上右键选择 Event即可。

Page 132: 第 9 章 Windows 控件

132

演示


Recommended