




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章常用控件控件是Windows应用程序图形界面的重要组成部分,用户可以通过控件完成与应用程序的交互。在VisualC++6.0中,MFC封装了Windows的许多标准控件。利用MFC可以快速方便地使用Windows的标准控件完成应用程序开发。本章介绍Windows应用程序中常用的一些标准控件。学习本章,读者可以掌握Windows标准控件的使用方法。8.1概述控件是Windows的标准窗口的一种,它具有和普通窗口一样的属性。Windows系统提供了很多标准控件,例如按钮、滚动条、编辑框、列表视图等。控件实际上是子窗口,在应用程序与用户进行交互的过程中,控件是主要角色。MFC提供了大量的控件类,它们封装了控件的功能。通过这些控件类,程序可以方便地创建控件,对控件进行查询和控制。所有的控件类都是CWnd类的直接或间接派生类。在MFC中的控件类提供了对控件进行操作的基本函数,包括控件的显示,控件的属性等。在应用程序中,控件发送WM_COMMAND消息进行相关的通信。同控件发送消息的通知码有所不同,常用控件的消息及其含义如表8.1所示。表8.1常用控件的常用消息上面给出了常用的几种控件的常见消息。一种控件经常通过对某种特定的消息进行一定的响应,然后在消息响应函数中进行一些处理,从而运行整个程序。这也是Windows应用程序事件驱动模型的体现。控
件消
息含
义按钮控件BN_CLICKED用户单击按钮控件BN_DOUBLECLICKED用户双击按钮控件编辑框控件EN_SETFOCUS编辑框获得输入焦点EN_CHANGE用户更改输入框中的数据编辑框控件EN_MAXTEXT输入内容超过编辑框最大容量EN_KILLFOCUS编辑框失去输入焦点EN_VSCROLL垂直滚动条被按下并激活列表框控件LBN_DBLCLK字符串列表框的字符串被双击LBN_SELCHANGE字符串列表框中的选择发生改变LBN_SETFOCUS列表框获得输入焦点LBN_KILLFOCUS列表框失去输入焦点LBN_SELCANCEL在列表框中取消某个选择组合框控件CBN_DBLCLK选择组合框的字符串双击CBN_EDITCHANGE组合框的内容被修改CBN_EDITUPDATE组合框的内容被更新CBN_KILLFOCUS组合框失去输入焦点CBN_SETFOCUS组合框得到输入焦点8.2按钮控件按钮控件是Windows应用程序中最常用的标准控件之一。它通常是可以响应鼠标单击消息的矩形小窗口。按钮的标题通常是显示单击按钮所要引发的操作。一般来说,按钮控件除了常见的矩形小窗口外,还有很多种类。主要有以下几种。1.单选按钮其外型为一个小圆圈和一个按钮文本。当圆形按钮被选中时,该圆圈将加点显示。圆形按钮所包含的各个选项之间一般具有互斥关系,即一组单选按钮里只能选择其中的一个。2.复选按钮复选按钮又称为复选框,其外型为一个小方框和一个按钮文本。当复选按钮被选中时,在相应的方框内出现一个“√”。复选框所包含的一组选项中一般不包含互斥内容,用户可以选择一个或多个复选框。
说明:自动单选按钮和自动复选框与一般单选按钮和复选框的区别是,如果设置为自动风格,那么按钮会自动响应,程序员不用编写消息响应函数。普通按钮、单选按钮和复选按钮的基本样式如图8.1所示。图8.1按钮样式8.2.1创建按钮控件MFC中利用CButton类封装了按钮控件。它是由类CWnd派生的类。CButton类的常用成员函数如表8.2所示。表8.2
CButton的成员函数上面列出了CButton类的成员函数,利用Create()函数可以创建一个按钮控件。在实际的程序设计中,经常在资源编辑器中添加按钮控件。MFC已经做好了基本的工作,如果要对按钮进行进一步操作,可以创建CButton的对象,进行进一步操作。函
数说
明BOOLCreate(……);创建按钮控件UINTGetState()const;获得按钮控件的选中、选择和聚焦状态voidSetState(BOOLbHighlight);设置一个按钮控件的选择状态intGetCheck()const;返回单选按钮的选择状态voidSetCheck(intnCheck);设置单选按钮的状态UINTGetButtonStyle()const;获得按钮的样式信息voidSetButtonStyle(UINTnStyle,BOOLbRedraw=TRUE);设置按钮的样式HICONGetIcon()const;获得按钮上的图标句柄HICONSetIcon(HICONhIcon);设置按钮上的图标HBITMAPGetBitmap()const;获得按钮上的位图的句柄HBITMAPSetBitmap(HBITMAPhBitmap);设置按钮上的位图HCURSORGetCursor();获得按钮上的光标的句柄HCURSORSetCursor(HCURSORhCursor);设置按钮上的光标virtualvoidDrawItem(……);重载该函数绘制一个CButton对象8.2.2使用按钮控件上面介绍了CButton类,现在根据示例介绍按钮控件的使用。【示例8.1】编写一个上网情况调查应用程序,利用按钮控件实现基本操作。程序设计的基本操作步骤如下所述。(1)创建一个基于对话框的应用程序,在上面添加多个按钮控件并设置标题,如图8.2所示。图8.2运行效果(2)利用向导为按钮控件添加变量。为了进行按钮的使用性学习,为每个按钮添加一个控制型变量。(3)添加单击确定按钮的消息响应函数。函数体如下:(4)编译、连接,运行结果如图8.3所示。图8.3运行结果上面的例子是按钮控件的常见使用模型,即通过资源编辑环境编辑按钮控件。并且设置其样式、标题等,然后利用类向导添加单击按钮或者双击按钮的消息映射,编写函数体,处理消息响应。8.3滚动条控件滚动条是Windows应用程序中常见的控件。滚动条在形式上分为窗口滚动条控件和子窗口滚动条控件两种。窗口滚动条控件是由系统创建,例如单文档程序中的窗口滚动条。子窗口滚动条控件则需要由程序员自己进行定义。8.3.1创建滚动条在MFC中,滚动条类是CScrollBar类,它由CWnd类派生。滚动条最常见的操作是实现窗口的滚动,包括垂直和水平方向两种。CScrollBar类的成员函数如表8.3所示。表8.3
CScrollBar类的成员函数在使用滚动条时,首先创建一个CScrollBar类的对象,然后调用初始化该对象。在实际应用中,经常直接使用资源编辑器中提供的控件。
注意:初始化对象时需要设置滚动条的范围和滚动条的当前位置。函
数说
明BOOLCreate(……);创建滚动条控件intGetScrollPos()const;获取滚动条当前位置intSetScrollPos(intnPos,BOOLbRedraw=TRUE);设置滚动条当前位置voidGetScrollRange(LPINTlpMinPos,LPINTlpMaxPos)const;获取滚动条最大和最小位置voidSetScrollRange(intnMinPos,intnMaxPos,BOOLbRedraw=TRUE);设置滚动条最大和最小位置voidShowScrollBar(BOOLbShow=TRUE);显示或隐藏滚动条控件BOOLEnableScrollBar(UINTnArrowFlags=ESB_ENABLE_BOTH);使滚动无效BOOLSetScrollInfo(……);设置滚动条信息BOOLGetScrollInfo(LPSCROLLINFOlpScrollInfo,UINTnMask);获取滚动条信息intGetScrollLimit();获取滚动条的范围8.3.2使用滚动条控件下面结合实例讲解滚动条控件的使用方法。【示例8.2】在对话框中放置滚动条控件,实现滚动条滑块的移动。操作步骤如下所述。(1)创建基于对话框的应用程序,在上面添加一个滚动条控件。如图8.4所示。图8.4添加滚动条控件(2)利用类向导为滚动条控件添加控制类型变量m_test。(3)在函数OnInitDialog()中对m_test变量进行初始化处理,在returnTRUE;语句前面添加代码如下:m_test.SetScrollRange(0,100);
//滚动条范围0到100m_test.SetScrollPos(10);
//当前位置为10注意:垂直滚动条的位置从上到下,即最上边为0。横向滚动条的位置从左到右,即最左边为0。(4)利用类向导添加消息响应函数。由于滚动条本身没有与之相应的事件,对滚动条的操作是通过对话框的OnVScroll事件来进行的。因此添加消息响应函数实际上是添加对话框的OnVScroll事件的消息响应函数。由于OnVScroll事件是对整个对话框进行的,因此如果这个对话框中有多个滚动条控件,那么如何区分到底是哪一个滚动条动作了呢?实际上只需要在OnVScroll()函数中进行判断就可以了。它的一个参数就是用来确定是哪一个滚动条的动作。编写函数代码如下:(5)编译、连接,运行结果如图8.5所示。图8.5运行结果上面的例子是滚动条控件的常见用法,在实际的文本显示或者其他需要滚动显示的地方经常使用滚动条控件。例如Word的右侧一般都会出现滚动条以实现快速翻页定位的操作。8.4静态文本控件在Windows程序中经常利用静态文本控件来显示一些控件的标题等。例如编辑框前面的标题,用来说明编辑框的内容是什么。实际应用中对静态文本控件的操作不多,但是有时需要改变文本框的内容。本节就这一问题进行介绍。静态文本控件的类是CStatic类,它是从CWnd派生出来的类。因此它继承了CWnd类的所有功能。若要改变静态文本的内容只需要利用该类的一个成员函数SetWindowText();就可以实现。通过上面的介绍,如果想在对话框上添加一个静态文本控件,并在程序中动态地改变其内容,那么基本步骤如下所述。(1)在资源编辑器中添加静态文本控件。(2)利用类向导添加静态文本控件的控制类型的变量。(3)在程序需要进行改变静态文本内容的地方调用SetWindowText();函数。注意:如果需要为静态文本控件添加变量,则需要改变控件的默认ID。这是因为所有静态文本控件的默认ID都相同。8.5列表框控件列表框控件是可以在若干选项中进行选择操作的控件。它可以显示出多个选项,可以允许用户进行唯一或者多项选择。利用该控件,在应用程序需要进行选项选择的地方可以带来很大方便。8.5.1列表框控件相关类列表框控件的类是CListBox,这也是一个从CWnd派生出来的类。CListBox中提供了许多函数以进行操作,其中主要的操作分为通用操作、单选列表框、多选列表框和字符串操作几类。下面分别进行介绍。1.通用操作通用操作用来获得和设置列表框控件选项的基本状态和属性。无论是单选列表框还是多选列表框都可以进行通用操作,对列表框的属性进行设置。列表框控件的通用操作如表8.4所示。表8.4CListBox类的通用操作函
数说
明intGetCount()const;获得列表框中选项的个数intGetHorizontalExtent()const;获得列表框水平滚动宽度voidSetHorizontalExtent(intcxExtent);设置列表框水平滚动宽度intGetTopIndex()const;获得列表框中第一个可用项的下标intSetTopIndex(intnIndex);设置列表框中第一个可用项的下标intGetSel(intnIndex)const;确定列表项的选择状态intSetItemHeight(intnIndex,UINTcyItemHeight);设置列表框中项的高度intGetItemHeight(intnIndex)const;设置列表框中项的高度2.单选列表框单选列表框是在实际中应用最广泛的列表框控件,它允许用户选择其选项中的一项。通用操作都可以对单选列表框进行操作,在此不再重复。单选列表框的操作如表8.5所示。表8.5单选列表框的操作
函
数说
明intGetCurSel()const;获得当前选项的下标
intSetCurSel(intnSelect);选择列表框某个下标的选项
3.多选列表框多选列表框允许用户选择其选项中的一项或多项。它是对单选列表框的扩展,同时它本身拥有许多特殊的操作。多选列表框的操作如表8.6所示。表8.6多选列表框的操作函
数说
明intSetSel(intnIndex,BOOLbSelect=TRUE);在列表框中切换项目的选择状态intGetCaretIndex()const;获得列表框中具有光标矩形项的下标intSetCaretIndex(intnIndex,BOOLbScroll=TRUE);在列表框中指定项具有光标矩形intGetSelCount()const;获得当前所选项的数目intGetSelItems(intnMaxItems,LPINTrgIndex)const;将当前所选项的下标放到整型数组中intSelItemRange(BOOLbSelect,intnFirstItem,intnLastItem);切换列表框项范围的选择状态intGetAnchorIndex()const;获得当前定位项的下标4.字符串操作字符串操作是对列表框中的选项进行处理的操作,包括添加选项、删除选项等。它适用于单选和多选列表框。字符串操作如表8.7所示。表8.7字符串操作列表框利用Create()函数创建列表框控件,但在实际应用中,程序员只需要在资源编辑器中添加列表框控件并设置其属性就可以了。函
数说
明intAddString(LPCTSTRlpszItem);在列表框中加入一个字符串intDeleteString(UINTnIndex);在列表框中删除一个字符串intInsertString(intnIndex,LPCTSTRlpszItem);在列表框指定下标处插入一个字符串voidResetContent();清除列表框所有选项intDir(UINTattr,LPCTSTRlpszWildCard);当前目录下文件的文件名加入到列表框intFindString(intnStartAfter,LPCTSTRlpszItem)const;在列表框指定下标开始查找字符串intFindStringExact(intnIndexStart,LPCTSTRlpszFind)const;在列表框中查找第一个匹配的字符串intSelectString(intnStartAfter,LPCTSTRlpszItem);在列表框中查找并选择某个字符串选项8.5.2使用列表框通过上面的讲解,可以看到列表框的基本使用方法。在实际应用中,列表框如何使用呢?大家知道Windows控件通过发送WM_COMMAND与应用程序进行通信。因此只需要利用类向导添加相应的消息响应函数就可以完成列表框的操作。下面通过实例讲解列表框在实际应用中的使用。【示例8.3】列表框控件使用举例。在对话框中添加列表框控件,列出多个选项,调查用户的爱好。单/双击某个选项时,提示用户单击选择(允许用户选择多项)。操作步骤如下所述。(1)创建一个基于对话框的应用程序。(2)在对话框中添加一个列表框控件,设置其属性,如图8.6所示。在设置中需要注意的是Styles属性页里的Selections下拉列表框。它有4种选择,Single表示一次只可以选择一个选项,即列表框是单选列表框;Multiple表示一次可以选择多个选项,即是多选列表框;Extended表示可以一次可以选择多个选项,与Multiple不同的是它可以通过拖动鼠标的方式选择多个选项;None表示不能选择。在此,将其设置为Multiple。图8.6设置属性(3)利用类向导为列表框控件添加控制型变量m_list。(4)在BOOLCTestDlg::OnInitDialog()中添加代码如下:说明:一般对对话框的初始化工作都在OnInitDialog()函数中完成,并且需要把代码加在returnTRUE;语句的前面。(5)利用类向导添加单击“确定”按钮时的消息响应函数,编写函数体,代码如下:上面的函数是在单击时对从上到下的各个选项进行检验,如果该项被选中,则将该项加入到字符串中。(6)添加一个双击某个选项时的消息响应函数。上面仅仅是为了说明列表框控件的消息响应过程,它可以响应单击、双击、右击、选择改变等多个消息。(7)编译、连接,运行结果如图8.7所示。图8.7运行结果分析:上面的例子是列表框控件的常见使用方法,一般情况下,列表框控件经常用来进行选择操作。上面的例子首先利用AddString()函数初始化列表框,然后单击“确定”按钮时根据所选项得到响应的字符串。同时列表框可以响应双击、右击和右键双击等多个消息。图
说明:由于列表项的内容一般是不变的,故CListBox未提供更新列表项字符串的函数。如果要改变某列表项的内容,可以先调用DeleteString()删除该项,然后再用InsertString()或AddString()将更新后的内容插入到原来的位置。8.6列表视图和树视图控件列表视图控件和树视图控件是Windows常用的控件类型,在应用程序中经常用到。例如Windows的资源管理器就是树视图控件的典型应用。应用列表视图控件和树视图控件可以使应用程序更加美观和实用。8.6.1列表视图控件的构成列表控件可以看做是功能增强的ListBox,它提供了4种风格,而且可以同时显示一列的多种属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建一个窗口。dwStyle中可以使用以下4种列表控件的专用风格,这4种风格决定控件的外观。LVS_ICON是大图标显示风格。LVS_SMALLICON是小图标显示风格。LVS_LIST是列表显示风格。LVS_REPORT是详细报表显示风格。在使用列表视图控件前,需要设置列表控件所使用的图标,如果使用大图标显示风格,需要以如下形式调用:CImageList*
SetImageList(CImageList*
pImageList,LVSIL_NORMAL);如果使用其他3种风格显示而不想显示图标,可以不进行任何设置。否则需要以如下形式调用:CImageList*SetImageList(CImageList*
pImageList,LVSIL_SMALL);。类CListCtrl定义了对列表视图控件的基本操作,其常用函数如表8.8所示。表8.8
CListCtrl的函数列表视图控件提供了多个消息响应函数,提供包括单击某个列表项、双击、获得输入焦点等。利用类向导可以方便地建立消息响应函数,在此不再介绍。函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建列表视图控件COLORREFGetBkColor()const;获得背景颜色BOOLSetBkColor(COLORREFcr);设置背景颜色CImageList*GetImageList(intnImageList)const;获取图标CImageList*SetImageList(CImageList*pImageList,intnImageList);设置图标intGetItemCount();获得列表项的数目DWORDGetItemData(intnItem)const;获得列表项的数据BOOLSetItem(constLV_ITEM*pItem);设置列表项数据intGetColumnWidth(intnCol)const;获得列表项宽度BOOLSetColumnWidth(intnCol,intcx);设置列表项宽度COLORREFGetTextColor()const;得到字体颜色BOOLSetTextColor(COLORREFcr);设置字体颜色COLORREFGetTextBkColor()const;获得字体背景色BOOLSetTextBkColor(COLORREFcr);设置字体背景色CStringGetItemText(intnItem,intnSubItem)const;获得某项的字符串BOOLSetItemText(intnItem,intnSubItem,LPTSTRlpszText);设置某项的字符串intInsertItem(intnItem,LPCTSTRlpszItem);插入列表项BOOLDeleteItem(intnItem);删除某一项8.6.2使用列表视图控件前面介绍了列表视图控件的一般使用方法,下面结合实例讲解其使用的具体过程。【示例8.4】创建一个对话框应用程序,添加列表视图控件。使用LVS_REPORT样式,在上面显示周一到周日的天气情况。操作步骤如下所述。(1)创建一个基于对话框的应用程序,添加一个列表视图控件,其ID为IDC_LIST1。(2)利用类向导为列表视图控件添加一个变量m_list;(3)在CTestDlg::OnInitDialog()函数中编写代码如下:上面的代码是对对话框上的列表视图控件进行初始化工作。一般情况下,对话框上的控件初始化都是在此函数中进行的。(4)编译、连接,运行结果如图8.8所示。字体背景色为红色,视图为黑色。图8.8运行结果上面的例子是列表视图控件的基本使用方法。一般情况下列表视图控件用来显示一些统计信息,列出多个统计变量,同时该控件可以响应单击、双击等多个消息。8.6.3树视图控件的构成树视图控件是Windows中最为常用的控件之一。该控件常用来显示一个树形结构。其中有一个根节点,称为根目录节点。根目录节点之下有多个子目录节点。树形控件常用来显示一个具有树形结构的组织结构。在MFC中使用CTreeCtrl类来封装树形控件的各种操作。CTreeCtrl类的成员函数Create()可以创建树视图控件。该函数的函数原型如下:BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);其中各个参数的意义如下所述。dwStyle:树视图控件的样式。rect:控件的窗口。pParentWnd:父窗口指针。nID:控件的ID。在上面的参数中,dwStyle用来指定控件样式,其常用的取值如下所述。TVS_HASLINES:在父/子节点之间绘制连线。默认不使用此样式。TVS_LINESATROOT:在根/子节点之间绘制连线。TVS_HASBUTTONS:在每一个节点前添加一个“+”按钮。TVS_EDITLABELS:可以对节点的字符进行编辑。TVS_NOTOOLTIPS:禁止树视图控件使用自动提示功能。类TreeCtrl定义了对列表视图控件的基本操作,常用操作如表8.9所示。表8.9CTreeCtrl的函数函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建树视图控件UINTGetCount();获得节点数目UINTGetIndent();获得每层缩进距离voidSetIndent(UINTnIndent);设置每层缩进距离CImageList*GetImageList(UINTnImage);获取图片列表CImageList*SetImageList(CImageList*pImageList,intnImageListType);设置图片列表HTREEITEMGetNextItem(HTREEITEMhItem,UINTnCode);获得下一节点BOOLItemHasChildren(HTREEITEMhItem);判断指定节点是否有子节点HTREEITEMGetChildItem(HTREEITEMhItem);获得子节点HTREEITEMGetNextSiblingItem(HTREEITEMhItem);获得兄弟节点HTREEITEMGetParentItem(HTREEITEMhItem);获得父节点HTREEITEMGetRootItem();获得根节点BOOLGetItem(TVITEM*pItem);获得指定节点信息COLORREFSetBkColor(COLORREFclr);设置背景颜色BOOLDeleteItem(HTREEITEMhItem);删除节点BOOLExpand(HTREEITEMhItem,UINTnCode);打开或者折叠节点CImageList*CreateDragImage(HTREEITEMhItem);创建图片,且可以进行拖放BOOLSortChildren(HTREEITEMhItem);排序子节点上面对树视图控件的基本函数进行了介绍。通过创建一个控件对象,可以方便地对树视图控件进行操作。下面介绍树视图控件的消息映射。树形控件的消息映射使用ON_NOTIFY宏,形式如同ON_NOTIFY(wNotifyCode,id,memberFxn),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数。函数的原型如同voidOnXXXTree(NMHDR*
pNMHDR,LRESULT*
pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。利用类向导可以方便地进行消息映射,在此不再叙述。
说明:树视图控件是Windows下最为常用的控件之一,例如资源管理器的左侧部分就是一个树视图控件。读者应了解该控件的常用场合。8.6.4使用树视图控件前面介绍了树视图的基本知识,下面结合实例介绍其使用方法。【示例8.5】创建一个基于对话框的应用程序,添加树视图控件,显示一个学校的组织结构。操作步骤如下所述。(1)创建一个基于对话框的应用程序,添加一个树视图控件。(2)设置树视图控件的属性,在TreeControlProperties对话框中,选择Styles标签,选择其中的Hasbuttons、Haslines和Linesatroot复选框,如图8.9所示。图8.9设置树视图控件的属性(3)在资源编辑器中添加3个图标资源。(4)在CTestDlg中添加数据成员CImageListm_imageList;。(5)在CTestDlg::OnInitDialog()添加代码如下:分析:可以看到InsertItem()函数是进行显示的重点,但是其插入项的样式及位置等信息则需要利用TV_INSERTSTRUCT类型的参数决定。下面对该结构进行介绍。TV_INSERTSTRUCT结构的主要成员包括下面几项。hParent:父节点项的句柄,如果取值为NULL则为第一项。hInsertAfter:表示插入的下一层位置,取值为TVI_LAST表示插入最后一个位置,TVI_FIRST表示插入第一个位置,TVI_SORT表示按字母排序插入。item:具体插入项的数据,是一个TV_ITEM类型的数据。TV_ITEM的结构成员如下所述。mask:指定某些成员有效,进行“|”运算指定有效项,具体情况如下所述。TVIF_CHILDREN:cChildren有效。TVIF_HANDLE:hItem有效。TVIF_IMAGE:iImage有效。TVIF_PARAM:lParam有效。TVIF_SELECTEDIMAGE:iSelectedImage有效。TVIF_STATE:state和stateMask有效。TVIF_TEXT:pszText和cchTextMax有效。hItem:该项的句柄。state:表示当前项的状态。lParam:用户指定的数据。pszText:该项的文字。cchTextMax:pszText缓冲区的长度。iSelectedImage:该项选中时的图标。stateMask:state的掩码。iImage:该项的图标。cChildren:指定该项是否有子节点。(6)编译、连接,运行结果如图8.10所示。图8.10运行结果上例是树视图控件的基本使用方法的介绍,树视图控件是一种常用的控件。例如Windows自带的注册表编辑器就是使用树视图控件,还有Windows的资源管理器也是树视图控件的使用例子。树视图控件与数据结构中的树结构有很大的相似之处。应用中,只要搞清楚父节点与子节点的关系就可以很快地设计出树视图控件。树视图控件与一般的控件一样,它可以响应单击、双击等多个消息,利用类向导可以方便地添加各个消息映射。8.7编辑框控件编辑框控件是用来接收用户输入最常用的一个控件,是Windows的标准控件之一。在应用程序中经常利用编辑框来获取用户的输入信息。本节介绍编辑框控件的基本属性应用。8.7.1编辑框的构成MFC对编辑框控件进行了封装,它所对应的类为CEdit类。CEdit类是直接从CWnd派生来的类。在CEdit了中封装了对编辑框的所有操作。编辑框又分为单行编辑框和多行编辑框。同时编辑框控件的基本属性可以设置编辑框为密码输入。熟悉和掌握编辑框的基本使用是非常重要的。一般来说,编辑框控件的操作分为通用操作和多行操作,下面分别进行介绍。1.通用方法通用方法可以对单行和多行编辑框适用。常见的通用方法如表8.10所示。表8.10CEdit的通用方法函
数说
明DWORDGetSel()const;获得编辑框当前开始和结束字符位置voidSetSel(DWORDdwSelection,BOOLbNoScroll=FALSE);选择字符的范围voidClear();删除当前的选择voidCopy();将编辑框内容复制到剪贴板中voidCut();将编辑框内容剪切到剪贴板中voidPaste();将剪贴板内容复制到编辑框中BOOLUndo();撤销操作BOOLCanUndo()const;决定编辑框是否可以撤销操作voidEmptyUndoBuffer();清除编辑框的撤销标志BOOLGetModify()const;设置编辑框内容是否可以修改voidSetModify(BOOLbModified=TRUE);设置编辑框的修改标志BOOLSetReadOnly(BOOLbReadOnly=TRUE);设置编辑框为只读TCHARGetPasswordChar()const;编辑框显示为密码intLineLength(intnLine=–1)const;获得编辑框的长度voidLineScroll(intnLines,intnChars=0);滚动多行编辑框intLineFromChar(intnIndex=–1)const;获得包含指定字符下标的行号voidGetRect(LPRECTlpRect)const;得到编辑框窗口的矩形voidLimitText(intnChars=0);限制编辑框输入长度2.多行编辑框操作方法多行编辑框有自己特殊的操作,它支持在编辑框窗口中进行多行编辑。其常用操作如表8.11所示。表8.11多行编辑框的操作方法
说明:多行编辑框是从0开始编行号的。在多行编辑框中,除了最后一行外,每一行的结尾处都有一对回车换行符(用"\r\n"表示)。程序员可以在字符串中添加回车换行符进行换行。函
数说
明intGetLineCount()const;获得多行编辑框的行数intGetLine(intnIndex,LPTSTRlpszBuffer)const;获得某一行的文本intLineIndex(intnLine=–1)const;设置某一行的字符的下标voidSetTabStops();设置制表键voidSetRect(LPCRECTlpRect);设置编辑框控件的格式化矩形HLOCALGetHandle()const;获得编辑框控件的句柄voidSetHandle(HLOCALhBuffer);设置编辑框句柄8.7.2使用编辑框编辑框控件通过发送WM_COMMAND消息通知应用程序,利用类向导可以方便地添加消息响应函数。下面结合例子说明编辑框控件的一般程序设计步骤。【示例8.6】在对话框中添加两个多行的编辑框控件和一个按钮控件。在其中一个输入一行字符串,单击“显示”按钮,在另一个编辑框中显示出来,并且将原来的编辑框内容清空。操作步骤如下所述。(1)创建基于对话框的应用程序。(2)添加两个编辑框控件和一个按钮控件,将按钮控件标题设置为“显示”,并且将两个编辑框的属性设置为多行。具体设置方法是,右击编辑框控件。在弹出的快捷菜单中选择Properties命令,弹出EditProperties对话框。选择Styles标签,在其选项中选中复选框如图8.11所示。图8.11属性设置说明:上面的属性设置为多行对话框,有垂直滚动条和横向滚动条。(3)为两个编辑框添加控制型变量m_edit1,m_edit2。(4)利用类向导添加单击“显示”按钮的消息响应函数。编写函数体如下:(5)编译、连接,运行效果如图8.12和图8.13所示。上面是编辑框控件的使用例子。编辑框控件是应用程序中最为常见的控件之一,一般情况下,编辑框用来接收数据或者输出数据。图8.12编辑框1中输入内容图8.13单击“显示”按钮8.8组合框控件组合框控件是Windows常用控件之一,它经常为用户提供选项供用户选择。它是输入框和列表框的结合体,这种控件的复合性使得其应用范围非常广泛。下面对组合框控件的类及其使用进行介绍。8.8.1组合框控件的构成在MFC中,类CComboBox对组合框控件进行封装。CComboBox是一个直接从CWnd派生来的类,因此它包含了CWnd的所有功能。类中常用的函数如表8.12所示。表8.12
CComboBox类的常见成员上面列出了组合框的常用函数,在实际的应用中,可以利用类向导添加一个对象,然后对组合框控件进行操作。函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID)创建组合框控件intGetCount()const;得到组合框的选项数目intGetCurSel()const;得到用户选择的项intSetCurSel(intnSelect);设置默认选择哪一项voidClear();清除所选的项voidCopy();复制所选的项voidCut();剪切所选的项voidPaste();将剪贴板内容粘贴到光标处BOOLLimitText(intnMaxChars);限制输入字符串长度intSetItemHeight(intnIndex,UINTcyItemHeight);设置选项的高度intAddString(LPCTSTRlpszString);往组合框中添加项intDeleteString(UINTnIndex);删除某一项intInsertString(intnIndex,LPCTSTRlpszString);插入一项intFindString(intnStartAfter,LPCTSTRlpszString)const;查找某个字符串intSelectString(intnStartAfter,LPCTSTRlpszString);查找并选择某个字符串intGetLBText(intnIndex,LPTSTRlpszText)const;voidGetLBText(intnIndex,CString&rString)const;得到某一项的文本8.8.2设置组合框在实际的使用过程中,利用资源编辑工具添加组合框控件以后,需要正确设置其属性才可以在应用程序中正确使用该控件。下面对常用的属性设置进行介绍。1.大小设置组合框的大小的设置与一般的控件不太相同。一般的控件调整大小只要选中该控件,然后在边框处按下鼠标拖动就可以了,这样的操作只可以改变组合框的横向大小。如果需要改变组合框的下拉选项的大小,那么则需要单击该组合框控件,然后将鼠标移动到下拉按钮上,单击鼠标,会出现一个边框,如图8.14所示。此时用鼠标拖动就可以改变纵向的大小。2.选项的输入有时对组合框选项的初始化可以在程序则中利用intAddString(LPCTSTRlpszString);函数动态地添加。但是如果整个程序运行中选项不变,则可以在“Properties”对话框中进行添加。方法为右击组合框,在弹出的快捷菜单中选择Properties命令,弹出Combo
BoxProperties对话框。选择Data标签,如图8.15所示。在编辑框控件中输入选项,每一行对应组合框的一个选项。
注意:输入数据时,每输入一项后,按Ctrl+Enter组合键可换到下一行继续输入。此时按下Enter键会退出ComboBoxProperties对话框,而不能换行。图8.14单击显示图图8.15ComboBoxProperties对话框3.组合框的类型组合框的类型有3种分别是Simple、DropDown和DropList。其中Simple类型只是包含一个编辑框和列表框;DropDown类型可以单击下三角按钮进行选项选择,也可在编辑框中输入文本,这是组合框的默认类型;DropList类型只能单击下三角按钮进行选择,编辑框无法进行输入。这3种类型分别如图8.16、图8.17和图8.18所示。图8.16Simple类型组合框图8.17DropDown类型组合框图8.18DropList类型组合框4.其他属性在前面的ComboBoxProperties对话框中还可以对组合框的其他属性进行设置。例如在Styles属性页里面可以选中Sort属性,这时可以对组合框选项进行排序。8.8.3组合框的消息传递MFC中封装了对许多消息的响应,组合框可以对一些常见的消息进行响应,例如用户单击某个选项、组合框失去输入焦点等。利用类向导可以方便地添加消息响应函数,然后程序员只需要编写相应的处理程序就可以了。在此不再进行介绍。8.9Tab属性页控件Tab属性页控件是Windows中较为常用的控件之一,它在一个对话框上可以利用标签来分别弹出不同的属性页。本节介绍在VisualC++中属性页控件的基本使用方法。8.9.1Tab属性页的构成在MFC中,类CTabCtrl对属性页控件进行封装,CTabCtrl是一个直接从CWnd派生来的类,因此它包含了CWnd的所有功能。CTabCtrl类中常用的函数如表8.13所示。表8.13CTabCtrl的常见成员上面列出了组合框的常用函数,在实际的应用中,可以利用类向导添加一个对象,然后对组合框控件进行操作。函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建属性页控件BOOLInsertItem(intnItem,TCITEM*pTabCtrlItem);BOOLInsertItem(intnItem,LPCTSTRlpszItem);BOOLInsertItem(intnItem,LPCTSTRlpszItem,intnImage);BOOLInsertItem(UINTnMask,intnItem,LPCTSTRlpszItem,intnImage,LPARAMlParam);插入属性页标签BOOLDeleteAllItems();删除所有标签intGetCurSel()const;获取当前选中的标签intSetCurSel(intnItem);设置当前标签BOOLGetItemState(intnItem,DWORDdwMask,DWORD&dwState)const;获取某个标签的状态BOOLSetItemState(intnItem,DWORDdwMask,DWORDdwState);设置某个标签的状态8.9.2使用属性页属性页的每一个标签下面都是一个对话框,也就是说属性页控件仅仅是把对话框显示出来。每个对话框可以单独地处理自己的控件消息。下面结合实例讲解属性页控件的使用。【示例8.7】在对话框上添加属性页控件,然后分别绑定两个对话框,可以响应单击标签消息,分别显示对应的对话框。分析:一个属性页控件利用函数绑定对话框,然后响应切换属性页或者说是单击标签的消息进行对话框的显示,具体步骤如下。(1)利用向导创建一个基于对话框的应用程序。(2)在对话框资源上添加一个属性页控件,其ID为IDC_TAB。并且利用类向导为该控件添加变量CTabCtrl
m_tab;。(3)利用资源编辑器添加两个对话框资源,并且设置对话框资源的属性,如图8.19所示。图8.19设置对话框属性上面的属性设置说明去掉对话框的标题,同时设置其样式为Child样式。注意:必须将对话框的样式设置为Child样式,否则对话框不能显示。(4)利用类向导为两个对话框添加类CDialog1和CDialog2。(5)在CTestDlg类的声明文件中包含两个对话框类的头文件,如下所示。#include"Dialog1.h"#include"Dialog2.h"在CTestDlg类中添加两个成员变量,如下所示。CDialog1dlg1;
//定义对象CDialog2dlg2;
//定义对象(6)在CTestDlg::OnInitDialog()中添加属性页控件的初始化语句,同时绑定两个对话框。代码如下:分析:上面的代码首先插入属性页标签,但并不是真正地插入属性页。然后创建了两个以属性页为父窗口的对话框,并且利用MoveWindow()函数将对话框移动到属性页的窗口上。最后显示一个对话框。(7)上面虽然创建了标签,但在切换时并不能真正地切换出对话框(为了显示两个对话框的不同,可以移动一个对话框上的按钮位置)。为了响应切换属性页的消息,可以利用类向导添加TCN_SELCHANGE消息和TCN_SECHANGING消息,前者是切换回发出的消息,后者是切换中发出的消息。利用类向导添加TCN_SELCHANGE消息映射,添加函数OnSelchangeTab(),编写函数代码如下:利用上面的代码实现切换属性页时显示不同的对话框。(8)编译、连接,运行结果如图8.20所示,选择属性页后,结果如图8.21所示。图8.20运行结果图8.21属性页切换上面介绍了属性页控件的一般使用方法。一般情况下,属性页的对话框不需要OK或者Cancel按钮,因为退出后,上面显示一片空白。实际应用中可以根据程序需要选择该控件的使用。
说明:一般来说属性页的子对话框是进行程序设计的主要处理对话框,主对话框仅仅是放在属性页控件。每个属性页标签下的对话框都是一个完整的对话框,可以进行消息处理。8.10其他常用控件在Windows中,除了前面介绍的控件以外,还有许多常用的控件。例如进度条控件、时间控件等。本节对其中常用的控件进行介绍。8.10.1进度条控件在Windows的安装程序或者其他程序中经常利用进度条控件显示程序运行进程。在MFC中利用CProgressCtrl类对进度条控件进行了封装。其中常见的函数如表8.14所示。表8.14CProgressCtrl类的常见成员使用过程中可以在对话框中添加一个进度条控件,然后创建一个指向该进度条的对象指针。在应用程序中可以利用类中的函数对进度条控件进行操作。进度条控件的使用一般需要利用一个时间计数器进行定时来实现进度条的前进。函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建进度条控件voidSetRange(shortnLower,shortnUpper);设置进度条表示范围intSetPos(intnPos);设置当前位置intSetStep(intnStep);设置渐进步长intStepIt();前进一步8.10.2滑块控件滑块控件是可以让用户通过拖动滑块来快速获得数据的控件。当用户拖动滑块时,空间将发送消息给应用程序。在MFC中,CSliderCtrl类对滑块控件进行了封装。其常见成员如表8.15所示。表8.15CSliderCtrl类的常见成员当利用鼠标拖动滑块控件时,可以添加消息响应函数来处理这一消息。函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建滑块控件voidSetRange(intnMin,intnMax,BOOLbRedraw=FALSE);设置滑块的表示范围voidSetPos(intnPos);设置当前位置intGetPos()const;获得当前位置voidSetSelection(intnMin,intnMax);设置选取范围8.10.3IPAddress控件在网络类应用程序中,经常需要对IP地址进行处理。而IP地址控件是一个四段型的标准IP地址的形式,用户可以以点分十进制形式输入IP地址。IP地址是一个32位的二进制数据,实际中常用的形式是点分十进制形式,例如119.232.11.34。而IPAddress控件就是这样一个标准形式。MFC中利用CIPAddressCtrl类对IPAddress控件进行了封装,CIPAddressCtrl是直接由类CWnd派生,因此它继承了CWnd的全部功能。其中CIPAddressCtrl类常见的成员如表8.16所示。表8.16CSliderCtrl类的常见成员在网络类程序中,经常利用IPAddress控件进行地址输入,掌握和了解该控件的使用有助于后面开发网络应用程序。在此不再介绍。函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建IPAddress控件BOOLIsBlank()const;查看IP是否为空voidClearAddress();清空IP地址intGetAddress(BYTE&nField0,BYTE&nField1,BYTE&nField2,BYTE&nField3);intGetAddress(DWORD&dwAddress);获得IP地址voidSetAddress(BYTEnField0,BYTEnField1,BYTEnField2,BYTEnField3);voidSetAddress(DWORDdwAddress);设置IP地址8.10.4时间控件在应用程序中经常需要对时间进行输入,而如果以字符串的形式输入则处理起来十分复杂。在VisualC++中提供了两个专门进行时间显示的控件DateTimePicker和MonthCalendar控件。这两个控件可以用来接收时间的输入或者输出。在MFC中使用CDateTimeCtrl类和CMonthCalCtrl类对该控件进行了封装。DateTimePicker控件与MonthCalendar控件有很多相同之处,DateTimePickerk可以看做是一个组合框控件和MonthCalendar控件的合成体。单击DateTimePickerk控件上的组合框的下三角按钮时会弹出一个MonthCalendar控件,而组合框中的编辑框内显示的是日期。CDateTimeCtrl类和CMonthCalCtrl类都是从CWnd派生出来的类。它们分别封装了DateTimePicker和MonthCalendar控件的各种操作和属性。MonthCalendar控件是用来显示一个月的日期的控件,称为日历控件。在该控件上显示了当前一个月的日期和星期。这样使得其界面更加美观,在MFC中使用CMonthCalCtrl类封装了对该控件的操作。其主要的成员函数如表8.17所示。表8.17CSliderCtrl类的常见成员函
数说
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);BOOLCreate(DWORDdwStyle,constPOINT&pt,CWnd*pParentWnd,UINTnID);创建一个日历控件BOOLCMonthCalCtrl::GetToday(COleDateTime&refDateTime)const;BOOLCMonthCalCtrl::GetToday(CTime&refDateTime)const;BOOLGetToday(LPSYSTEMTIMEpDateTime)const;得到今天的日期BOOLSetRange(constCOleDateTime*pMinRange,constCOleDateTime*pMaxRange);BOOLSetRange(constCTime*pMinRange,constCTime*pMaxRange);BOOLSetRange(constLPSYSTEMTIMEpMinRange,constLPSYSTEMTIMEpMaxRange);设置显示的日期范围COLORREFSetColor(intnRegion,COLORREFref);设置控件的颜色BOOLGetCurSel(COleDateTime&refDateTime)const;BOOLGetCurSel(CTime&refDateTime)const;BOOLGetCurSel(LPSYSTEMTIMEpDateTime)const;得到用户选择的日期CMonthCalCtrl类封装了对日历控件的操作。当用户单击该控件上的日期时会产生消息,包括选中和改变选择两个消息。MCN_SELECTCHANGE:用户选择改变。MCN_SELECT:用户选择了一个日期。注意:CMonthCalCtrl控件在初始化时会自动得到当前的日期,因此程序员不必对该控件显示当前日期进行处理。DateTimePickerk是一个组合框控件和MonthCalendar控件的合成体。单击DateTimePickerk控件上的组合框的下三角按钮时会弹出一个MonthCalendar控件,而组合框中的编辑框内显示的是日期。在MFC中使用CDateTimeCtrl类对DateTimePickerk的操作和属性进行了封装。该类的主要成员如表8.18所示。表8.18CDateTimeCtrl类的常见成员函
数说
明CDateTimeCtrl();构造函数BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建日期控件COLORREFGetMonthCalColor(intiColor)const;获得内嵌日历控件的颜色COLORREFSetMonthCalColor(intiColor,COLORREFref);设置内嵌日历控件的颜色BOOLSetFormat(LPCTSTRpstrFormat);设置日期格式CMonthCalCtrl*GetMonthCalCtrl()const;获取内嵌日历控件的指针BOOLSetRange(constCOleDateTime*pMinRange,constCOleDateTime*pMaxRange);BOOLSetRange(constCTime*pMinRange,constCTime*pMaxRange);设置日期范围BOOLSetTime(constCOleDateTime&timeNew);BOOLSetTime(const
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 可持续纺织品发展趋势试题及答案
- 广告设计师效果反馈机制试题及答案
- 机器人维修试题及答案
- 南京预防接种试题及答案
- 点胶机考试题及答案
- 助听器四级试题及答案
- 文化适应性营销的实践案例分析试题及答案
- 掌握广告设计师考试的重点试题及答案
- 2024年纺织行业市场分析工具试题及答案
- 手工艺考研试题及答案
- 第16课《有为有不为 》课件-2024-2025学年统编版语文七年级下册
- 海上丝绸之路(浙江海洋大学)学习通测试及答案
- 2024版股权分配与员工持股计划协议书模板3篇
- ISO 27040-2015 信息技术安全技术存储安全管理手册程序文件制度文件表单一整套
- DB37T 5061-2016 住宅小区供配电设施建设标准
- 中建中建轨道物流、气动物流施工方案范本
- 【MOOC】葡萄酒文化与鉴赏-西北工业大学 中国大学慕课MOOC答案
- 2024年同等学力人员申请硕士学位英语试卷与参考答案
- 【MOOC】3D工程图学应用与提高-华中科技大学 中国大学慕课MOOC答案
- 心力衰竭超滤治疗
- 18项医疗核心制度
评论
0/150
提交评论