第3章 常用控件.docx

上传人:b****5 文档编号:7162282 上传时间:2023-01-21 格式:DOCX 页数:93 大小:569.10KB
下载 相关 举报
第3章 常用控件.docx_第1页
第1页 / 共93页
第3章 常用控件.docx_第2页
第2页 / 共93页
第3章 常用控件.docx_第3页
第3页 / 共93页
第3章 常用控件.docx_第4页
第4页 / 共93页
第3章 常用控件.docx_第5页
第5页 / 共93页
点击查看更多>>
下载资源
资源描述

第3章 常用控件.docx

《第3章 常用控件.docx》由会员分享,可在线阅读,更多相关《第3章 常用控件.docx(93页珍藏版)》请在冰豆网上搜索。

第3章 常用控件.docx

第3章常用控件

第3章常用控件

控件是在系统内部定义的用于和用户交互的基本单元。

在所有的控件中,根据它们的使用及VisualC++6.0对其支持的情况,可以把控件分为Windows普通控件(如编辑框、列表框、组合框等)、MFC扩展控件和ActiveX控件。

ActiveX控件可以理解成是一个OLE(ObjectLinkingandEmbedding,对象连接与嵌入)组件,它既可用于Windows应用程序中,也可用于Web页面中。

本单重点介绍在MFC应用程序中经常使用的控件,主要有静态控件、按纽、编辑框、列表框、组合框、滚动条、进展条、旋转按纽控件、滑动条、日期时间控件、列表控件和树控件。

3.1创建和使用控件

在MFC应用程序中使用控件不仅简化编程,还能完成各种常用功能。

为了更好地发挥控件的作用,还必须理解和掌握控件的属性、消息以及创建和使用的方法。

3.1.1控件的创建方法

控件的创建方式有以下两种:

一种是在对话框模板中用编辑器指定控件,也就是说,将对话框看作控件的父窗口。

这样做的好处是显而易见的,因为当应用程序启动该对话框时,Windows系统就会为对话框创建控件,而当对话框消失时,控件也随之清除。

另一种是编程方式,即调用MFC相应控件类的成员函数Create来创建,并在Create函数指定控件的父窗口指针。

例如,下面的示例过程是使用编程方式来创建一个按纽。

【例3.1】创建一个名为CreateButton的基于对话框的应用程序,用编程方式创建一个对话框,并在对话框上安装一个按纽控件。

制作步骤如下:

1创建基于对话框的应用程序CreateButton。

2.将项目工作区切换到ClassView选项卡,展开所有结点,右击CCreateButtonDlg类名,弹出快捷菜单。

从快捷菜单中选择AddMemberVariable(添加成员变量)命令。

对出现的对话框,作以下操作:

(1)在VariableType(变量类型)编辑框中输入CButton(MFC按纽类)。

(2)在VariableName(变量名)编辑框中输入m_btnWnd。

(3)在Access(访问权限)选择框中,选取public。

需要说明的是,在MFC中,每一种类型的控件都用相应的类来封装。

如编辑框控件的类是CEdit,按纽控件的类是CButton,通过这些类创建的对象来访问其成员,从而实现控件的相关操作。

3.在项目工作区窗口的ClassView页面中,将CCreateButtonDlg结点展开,双击OnInitDialog函数名,在该函数中添加下列代码(在returnTRUE语句前添加):

BOOLCCreateButtonDlg:

:

OnInitDialog()

{…

//TODO:

Addextrainitializationhere

m_btnWnd.Create("你好",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON

|WS_TABSTOP,CRect(20,20,120,40),this,201);//创建

CFont*font=this->GetFont();//获取对话框的字体

m_btnWnd.SetFont(font);//设置控件字体

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

分析和说明:

●前面曾说过,由于OnInitDialog函数在对话框初始化时被调用,因此将对话框中的一些初始化代码都添加在此函数中。

●由于Windows操作系统使用的是图形界面,因此在MFC中,对于每种界面元素的几何大小和位置常使用CPoint类(点)、CSize类(大小)和CRect类(矩形)来描述(以后还会讨论)。

●代码中,CButton类成员函数Create用来创建按纽控件,该函数第一个参数用来指定按纽的标题,第二个参数用来指定按纽控件的样式,其中BS_PUSHBUTTON(BS_开头的)是按纽类封装的预定义样式,表示创建的是按键按纽。

WS_CHILD(子窗口)、WS_ViSIBlE(可见)、WS_TABSTOP(可用Tab键选择)等都是CWnd类封装的预定义窗口样式,它们都可以直接引用,当多个样式指定时,需要使用运算符“|”来连接。

第三个参数用来指定它的父窗口中的位置和大小,第四个参数用来指定父窗口指针,最后一个参数是指定该控件的标识值。

●由于按纽是作为对话框的一个子窗口来创建的,因此WS_CHILD样式是必不可少的,且还要使用WS_VISIBlE使控件在创建后显示出来。

4.编译并运行,其结果如下图所示。

以上可以看出,控件编程创建方法是使用各自封装的类的Create成员函数来创建,它的优点是能动态创建,但涉及到的编程内容比较复杂,且不能发挥对话框编辑器的可视化优点,故在一般情况下都采用第一种方法,即在对话框模板中用编辑器指定控件。

3.1.2控件的消息及消息映射

应用程序创建一般控件或公共控件之后,当控件的状态发生改变(例如用户利用控件进行输入)时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。

对于每个消息,系统都会用一个MSG结构来纪录,MSG具有下列原型:

typeDefstructtagMSG{

HWND

hwnd;

//接收到消息的窗口句柄

UINT

message;

//消息

WPARAM

wParam;

//消息的附加信息

LPARAM

lParam;

//消息的附加信息

DWORD

time;

//消息传送时的时间

POINT

pt;

//消息传送时,光标所在的屏幕坐标

}

MSG;

对于一般控件来说,其通知消息通常是一条WM_COMMAND消息,这条消息的wParam参数的低位字中含有控件标识符,wParam参数的高位字则为通知代码,lParam参数则是指向控件的句柄。

而对于有些控件,其通知消息通常是一条WM_NOTIFY消息,这条消息的wParam参数是发送通知消息的控件的标识符,而lParam参数则是指向一个结构指针。

1.映射控件消息

不管是什么控件消息,一般都可以用ClassWizard对它们加以映射(仍以例3.1来说明)。

(1)打开工程CreateButton,将项目工作区窗口切换到ResourceView,双击Dialog资源下的标识IDD_CREATEBUTTON_DIALOG,打开CreateButton项目的对话框资源模板。

(2)选中“TODO:

在这里设置对话框控制”控件,按Delete键将它删除。

从控件工具箱中拖放添加一个按纽控件,如下图所示,保留其默认属性。

(3)按Ctrl+W键,打开ClassWizard对话框,在Classname列表中选择CCreateButtonDlg;在ObjectIDs列表中选IDC_BUTTON1,这是添加按纽后,系统自动为此按纽设置的默认标识符;在Messages列表框中选择BN_CLICKED消息。

(4)单击AddFunction按纽或双击BN_CLICKED消息,出现AddMemberFunction对话框,在这里可以输入成员函数的名称,系统默认的函数名OnButton1,单击OK按纽,BN_CLICKED消息映射函数添加到Memberfunction列表中。

说明:

●不同资源对象(控件、菜单命令等)所产生的消息是不相同的,例如,按纽控件IDC_BUTTON1的消息有两个:

BN_CLICKED和BN_DOUBLECLICKED,分别表示当用户单击或双击该按纽时产生的消息。

●一般不需要对OK(确定)与Cancel(取消)按纽进行消息映射,因为系统已自动设置了这两个按纽的动作,当用户单击这两个按纽时都将自动关闭对话框,且OK(确定)按纽动作还使得对话框数据有效。

(5)双击OnButton1或单击EditCode按纽,定位到CCreateButtonDlg:

:

OnButton1函数实现的源代码,添加以下代码:

voidCCreateButton:

:

OnButton1()

{

MessageBox(_T(“你按下了Button1按纽”));

}

(6)编译并运行,其效果如下图所示。

这就是按纽BN_CLICKED消息的映射过程,其他控件的消息也可以类型操作。

2.映射控件通用消息

上述的过程是映射一个控件的某一个消息,事实上也可以通过WM_COMMAND消息的映射来处理一个或多个控件的通用消息,如下面的过程:

(1)按Ctrl+W键,打开ClassWizard对话框,在Classname下拉列表栏选CCreateButtonDlg,在ObjectIDs列表框中选CCreateButtonDlg,在Messages列表框中找到并双击OnCommand,这样OnCommand消息函数就添加好了,如下图所示。

需要说明的是,由于OnCommand函数是一个用来处理WM_COMMAND消息是虚函数,因此这里添加的OnCommand函数事实上是一个在类中实际调用的函数,可称为“实例函数”。

这样的映射操作,可以称为“对虚函数OnCommand的重载”。

(2)双击消息函数OnCommand或单击EditCode按纽,定位到CCreateButtonDlg:

:

OnCommand函数的实现的源代码处,添加下列代码:

BOOLCCreateButtonDlg:

:

OnCommand(WPARAMwParam,LPARAMlParam)

{

//TODO:

Addyourspecializedcodehereand/orcallthebaseclass

WORDnCode=HIWORD(wParam);//控件的通知消息

WORDnID=LOWORD(wParam);//控件的ID号

if((nID=201)&&(nCode==BN_CLICKED))

MessageBox(_T("你按下了你好按纽"));

if((nID==IDC_BUTTON1)&&(nCode==BN_CLICKED))

MessageBox(_T("这是OnCommand处理的结果"));

returnCDialog:

:

OnCommand(wParam,lParam);

}

(3)编译并运行,其效果如下图所示。

说明:

●在MFC中,资源都是用其ID来标识的,而各资源的ID号本身就是数值,因此上述代码中,201和IDC_BUTTON1都是程序中用来标识按纽的ID,201是前面创建控件时指定的ID值。

●在上述编写的代码中,Button1按纽的BN_CLICKED消息用不同的方式处理了两次,即同时存在两种函数OnButton1和OnCommand,因此若单击Button1按纽,系统会先执行哪一个函数呢?

测试的结果表明,系统首先执行OnCommand,然后执行OnButton1。

之所以还能执行OnButton1的函数代码,是因为OnCommand函数的最后一句代码“returnCDialog:

:

OnCommand(wParam,lParam)”它将控件的消息交由对话框其他函数处理。

●由于用Create创建的控件无法用ClassWizard直接映射其消息,因此上述方法弥补了弥补了ClassWizard的不足,使用时要特别注意。

3.1.3控件类和控件对象

一旦创建控件后,有时就需要进行深入编程。

使用控件之前需获得该控件类对象指针或映射一个对象,然后通过该指针或对象来引用其成员函数进行操作。

表3.1列出了MFC封装的常用控件类。

表3.1常用控件类

控件名称

MFC类

功能描述

静态控件

CStatic

用来显示一些几乎固定不变的文字或图形

按纽

CButton

用来产生某些命令或改变某些选项,包括单选按纽、复选框和组框

编辑框

CEdit

用来完成文本和数字的输入与编辑

列表框

CListBox

显示一个列表,让用户从中选取一个或多个项

组合框

CComboBox

是一个列表框和编辑框组合的控件

滚动条

CScrollBar

通过滚动块在滚动条的移动和滚动按纽来改变某些量

进度条

CProgressCtrl

用来表示一个操作的进度

滑动条

CSliderCtrl

通过滑动块的移动来改变某些量,并带有刻度指示

旋转按纽控件

CSpinButtonCtrl

带有一对反向箭头的按纽,单击它们可增减数值

日期时间控件

CDateTimeCtrl

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

图像列表

CImageList

一个具有相同大小的图标或位图的集合

标签控件

CTabCtrl

类似于一个笔记本的分隔器或一个文件柜上的标签,使用它可以将一个窗口或对话框的相同区域定义为多个页面

在MFC中,获取一个控件的类对象指针是通过CWnd类的成员函数GetDlgItem来实现的,它具有下列原型:

CWnd*GetDlgItem(intnID)const;

voidGetDlgItem(intnID,HWND*phWnd)const;

在C++中允许同一个类出现同名的成员函数,只是这些同名函数的形参类型或形参个数各不相同(即函数的重载)。

其中,nID用来指定控件或子窗口的ID值。

第一个函数是直接通过函数来返回CWnd类的指针,而第二个函数是通过形参phWnd来返回其句柄指针。

需要说明的是,由于CWnd类是通用的窗口基类,因此想要调用实际的控件类及其基类成员,还必须将其进行类型的强制转换,例如

CButton*pBtn=(CButton*)GetDlgItem(IDC_BUTTON1);

由于GetDlgItem获取的是类对象指针,因而它可以用到程序的任何地方,且可多次使用,并可对同一个控件定义不同的对象指针,均可对指向的控件操作有效。

事实上,在父窗口类,还可为控件或子窗口定义一个成员变量,通过它也能引用其成员函数进行操作。

控件的成员变量又称控件变量,在MFC中,控件变量分为两种类型,一是用于操作的控件对象;另一是用于存取的数据变量。

它们都是与控件或子窗口进行绑定,但MFC只允许每种类型仅绑定一次。

下面就来看一个示例。

【例3.2】创建一个名为MemberDemo的基于对话框的应用程序,将编辑框中所输入的内容,输出到按纽上(即改变按纽的标题)。

(1)创建一个默认的对话框应用程序MemberDemo。

(2)在打开的对话框资源模板中,删除“TODO;在这里设置对话框控制”。

添加一个编辑框和按纽,保留其默认属性。

如下图所示。

(3)按Ctrl+W,打开ClassWizard,切换到MemberVariables选项卡。

在Classname列表中选择CMemberDemoDlg,在ControlIDs列表中选定按纽控件标识符IDC_BUTTON1,单击AddVariable按纽,弹出AddMemberVariable对话框。

在Membervariablename框中填入与控件相关联的成员变量m_btnWnd,在Categoty(类别)下拉列表框中选Control,在VariableType下拉列表框中选CButton,单击OK按纽。

这样,对按纽控件IDC_BUTTON1的编程时,就可用与之绑定的CButton对象m_btnWnd来替代。

(4)将ClassWizard对话框切换到MessageMaps选项卡,为CMemberDemoDlg添加IDC_BUTTON1的BN_CLICKED消息映射函数OnButton1,并添加以下代码:

voidCMemberDemoDlg:

:

OnButton1()

{

CStringstrEdit;//定义一个字符串

CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);//定义一个指向IDC_EDIT1的对象

pEdit->GetWindowText(strEdit);//获取编辑框中的内容并存入strEdit

strEdit.TrimLeft();//去除左边的空格、换行和Tab字符

strEdit.TrimRight();//去除右边的空格、换行和Tab字符

if(strEdit.IsEmpty())//如果strEdit为空

m_btnWnd.SetWindowText(_T(“Button1”));//按纽标题用Button1

else//如果strEdit非空

m_btnWnd.SetWindowText(strEdit);//按纽标题改为strEdit所存放的内容

}

由于strEdit是CString类对象,因而可以调用CString类的公有成员函数。

其中,TrimLeft和TrimRight函数不带参数时分别用来去除字符串左边和右边一些空格符、换行符、Tab字符等字符,IsEmpty用来判断字符串是否为空。

这样,当编辑框内容有除空白字符之外的实际字符串时,用SetWindowText将其内容设定为按纽控件的标题。

否则,按纽控件的标题仍为Button1。

(5)编译并运行,当在编辑框中输入Hello后,单击Button1按纽,按纽的名称变成了编辑框中的内容Hello。

3.1.4DDX和DDV

对于控件的数据变量,MFC还提供了独特的DDX和DDV技术。

DDX将数据成员变量同对话框类模板内的控件相联接,这样就使得数据在控件之间更容易传输。

而DDV用于数据的校验,例如它能自动校验数据成员变量数据的范围,并发出相应的警告。

一旦某控件与一个数据变量绑定之后,就可以使用CWnd:

:

UpdateData函数实现控件数据的输入和读取。

UpdateData函数只有一个参数,它为TRUE或FALSE。

当在程序中调用UpdateData(FALSE)时,数据由控件绑定的成员变量向控件传输,当调用UpdateData(TURE)时或不带参数的UpdateData()时,数据从控件向绑定的成员变量复制。

需要说明的是,数据变量的类型由被绑定的控件类型而定,例如对于编辑框来说,数值类型可以有CString、int、UINT、long、DWORD、float、double、BYTE、short、BOOL等。

不过,任何时候传递的数据类型只能是一种。

也就是说,一旦指定了数据类型,则控件与变量传递交换的数据就不能是其他类型,否则无效。

下面来看一个实例,它是在MemberDemo项目基础上进行的。

(1)按Ctrl+W,打开ClassWizard,并切换到MemberVariables选项卡。

在Classname的下拉列表中选CMemberDemoDlg,在ControlIDs列表框中选IDC_EDIT1,单击AddVariable按纽,弹出AddMemberVariable对话框,在Membervariablename框中填好与控件相关联的成员变量m_strEdit,将Category选为Value,将VariableType选为CString,单击OK按纽。

(2)在MemberVariable选项卡中,ControlIDs列表中出现刚才添加的编辑框控件变量m_strEdit。

选择后,将在ClassWizard对话框下方出现MaximumCharacters编辑框,从中可设定该变量允许的最大字符个数,这就是控件变量的DDV设置。

填入10后,如下图所示,单击OK按纽,退出ClassWizard对话框。

(3)将项目工作区切换到ClassView选项卡,展开CMemberDemoDlg类结点,双击OnButton1成员函数,定位到CMemberDemoDlg:

:

OnButton1函数实现代码处,对代码做以下修改:

voidCMemberDemoDlg:

:

OnButton1()

{

UpdateData();//将控件的内容存放到变量中

//没有参数,表示使用的是默认参数值TRUE

m_strEdit.TrimLeft();

m-strEdit.TrimRight();

if(m_strEdit.IsEmpty())

m_btnWnd.SetWindowText(_T(“Button1”));

else

m_btnWnd.SetWindowText(m_strEdit);

}

(4)编译并运行。

当在编辑框中输入“我向你问好”,单击Button1按纽后,OnButton1函数中的UpdateData将编辑框中的内容保存到m_strEdit变量中,从而执行下一条语句后按纽名称就变成了编辑框控件中的内容“我向你问好”。

若输入“我向你问声好”,当输入第5个汉字之后,再也输不进去了,再也输入不进去了,这就是DDV的作用。

3.2静态控件和按纽

静态控件和按纽是Windows最基本的控件之一。

3.2.1静态控件

一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。

它可以被用来作为标签、框或用来分隔其他的控件。

一个静态控件一般不接收用户输入,也不产生通知消息。

在对话框编辑器的控件工具栏中,属于静态控件的有静态文本、组框和静态图片三种。

3.2.2按纽

在Windows中所用的按纽是用来实现一种开与关的输入,常见的按纽有三种类型,按键按纽、单选按纽和复选按纽,如下图所示。

1.不同按纽的作用

按建按纽通常可以立即产生某个动作,执行某个命令,因此也常被称为命令按纽。

按键按纽有两种风格:

标准按键按纽和默认按键按纽(或称缺省按纽)。

从外观上来说,默认按键按钮是在标准按键按纽的周围加上一个黑色边框(见上图),这个黑色边框表示该按纽已接受到键盘的输入焦点,这样一来,用户只需按Enter键就能按下该按纽。

一般来说,只把最常用的按键按纽设定为默认按键按纽,具体的设定方法是在按键按纽属性对话框中Style页面中选中“默认按纽”(DefaultButton)项。

单选按纽的外形是在文本前有一个圆圈,当它被选中时,单选按纽中就标上一个黑点,它可分为一般和自动两种类型。

在自动类型中,用户若选中同组按纽中的某个单选按纽,则其余的单选按纽的选中状态就会清除,保证了多个选项始终只有一个被选中。

复选框的外形是在文本前有一个空心方框,当它被选中时,复选框中就加上一个“√”标记,通常复选框只有选中和未选中两种状态,若复选框前面有一个灰色的“√”,则这样的复选框是三态复选框,如上图中的Check2,它表示复选框的选择状态是“不确定”。

2.按纽的消息

按纽消息常见的只有两个:

BN_CLICKED(单击按纽)和BN_DOUBLECLICKED(双击按纽)。

3.按纽的操作

最常用的按纽操作是设置或获取一个按纽或多个按纽的选中状态。

封闭按纽的CButton类中的成员函数SetCheck和GetCheck就是分别用来设置或获取指定按钮的选中状态,其原型如下:

voidSetCheck(intnCheck);

intGetCheck()const;

其中,nCheck和GetCheck函数返回值可以是0(不选中)、1(选中)和2(不确定,仅用于三态按纽)。

若对于同组多个单选按纽的选中状态的设置或获取,则需要使用通用窗口类CWnd的成员函数CheckRadioButton和GetCheckedRadioButton,它们的原型如下:

voidCheckRadioB

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1