一、 Windows标准控件概述
(一)Windows标准控件
Windows系统提供的标准控件主要包括静态控件、按钮控件、编辑框控件、列表框控件、组合框控件等,如表所示。
Windows标准控件的类型
1、控件的创建
控件的创建分为静态创建和动态创建两种方式。
静态创建是指在对话框模板创建控件,并设置控件的属性,这样,在调用该对话框时,窗口系统会自动按预先的设置为对话框创建控件。程序员可以使用ClassWizard为该控件在对话框类中创建一个控件类的对象。
动态创建是指在程序的运行中根据需要,定义一个控件类的对象,再通过窗口函数CreateWindow()或CreateWindowEx()创建控件、函数ShowWindow()显示控件,正如操作一个子窗口。
2、控件的属性设置
每个控件都有一个属性集,对于静态创建的控件,可以在对话框模板中,打开控件的属性对话框直接设置控件的初始属性。在程序设计过程中,可以通过控件类对象调用方法设置控件的属性。
3、控件消息类别
上表所列出的控件中,静态控件不发送消息,其他控件对于用户的操作都能发送消息,不同类的控件发送的消息类别是不相同的,可以使用ClassWizard为控件映射各种消息处理函数。
4、控件对象的常用方法
MFC控件类提供丰富的方法函数,帮助程序员操作控件对象。
5、用户输入消息的获取和响应
在前一章已经介绍了MFC支持应用程序与用户之间的通信的方法,为控件的显示值映射一个对话框类的成员变量,再通过对话框数据交换和校验机制在对话框打开和关闭的时候实现数据传递,在程序运行过程中,通过UpdateData()函数主动地控制数据在控件显示和成员变量之间交换。这是MFC应用程序获取用户输入消息的主要方法。
同时MFC保留了Windows API函数,可直接通过控件ID操作控件,获取或设置控件的显示值。例如SetDlgItemText()和GetDIgItemText()函数可以用于设置或获取编辑框的显示文本串。
(二)控件的通用属性
Windows标准控件的属性窗口通常由3个属性标签构成。
1、General标签页
General标签页中设置常规属性,通常包括:
(1)ID
程序通过控件ID来访问一个控件。所有的控件中,只有Static Box控件和GroupBox控件的ID是可以重复,一般使用默认设置IDC_STATIC。而其他类控件的ID在一个应用程序中应该是惟一的。
(2)Visible
设置对话框打开时控件是否可见。它的类型是布尔类型。默认为TRUE.即运行程序时显示控件。
(3)Disabled
设置当对话框在打开时该控件是否不可用,它的类型是布尔类型,默认为FALSE。
(4)Group
标记一组控件中的第一个控件。
(5)Tap stop
设置TAB键是否可以该控件上驻留,它的类型是布尔型,默认值为TRUE。
(6) Help ID
分配一个帮助ID给一个控件。这个帮助ID建立在资源ID基础上。它的类型是布尔型,默认为FALSE。
2、Styles标签页
可以通过Style标签页设置一些与控件风格有关的属性,不同的控件所设置的属性不相同,在本章的后续小节中将按不同的控件介绍。
3、Extend Styles标签页
Extent Styles标签页设置与控件显示风格有关的属性,通常包括:
(1)Client edge
围绕对话框建立一个有下凹风格的边框。它的类型是布尔型,默认值是FALSE.
(2)Static edge
围绕对话框建立一个边框。它的类型是布尔型,默认值是FALSE.
(3)Modal frame
该选项提供一个3D框架。
(4)Transparent
使用这种风格的窗口在层叠状态下是透明的,它的类型是布尔型,默认值是FALSE.
(5)Accept files
这种风格的对话框可接受拖放文件操作。如果用户拖动一个文件到此对话框上,对话框将接收到一个WM_DROPFILES消息。该选项的类型是布尔型,默认值是FALSE.
(6)Right aligned text
指定在一个对话框中文本是右对齐的。它的类型是布尔型,默认值是FALSE.
(7)Right-to-left reading order
对话框的文本按从右到左的顺序编排,这是为了一些特殊语言的阅读方便而设置的(如阿拉伯语言)。它的类型是布尔型,默认值是FALSE.
(三)常用控件窗口操作函数
Windows应用程序对控件的操作实质上是对窗口的操作,对话框窗口中的控件被视为对话框窗口的子窗口,具有通用的窗口属性,所以控件的操作还可以通过一组窗口操作的函数来完成。常用的控件子窗口操作函数如下:
1 、CreateWindow()或CreateWindowEx()
在程序运行过程中,可以通过调用创建窗口的函数来动态地创建控件,创建窗口的函数是CreateWindow()或CreateWindowEx()。
2、ShowWindow()
使用函数ShowWindow()可以显示或隐藏控件。它的函数原型为:
BOOL ShowWindow(int nCmdShow);
参数nCmdShow表示窗口的显示特性,例如,取值SW_HIDE表示隐藏控件,取值SW_SHOW表示显示控件。
3、EnableWindow()
通过函数EnableWindow(可以激活控件或禁止控件接受用户输入。它的函数原型为
BOOL EnableWindow(BOOL nEnable=true);
参数nEnable决定控件的激活或禁止状态,当值为true时,允许控件接受用户输入,当其值为false时,不允许控件接受用户输入,其呈灰色显示。
4、MoveWindow()
5、 DestroyWindow()
二、CStatic类控件的使用
在程序中出现的文本根据作用的不同,可以分为两大类:静态文本和动态文本。静态文本在程序的执行中保持不变,主要用来表示控件的功能、下一步执行的操作等。动态文本在程序执行过程中是可以改变的,在Windows中可以通过编辑控件来实现。
MFC中使用CStatic类来管理静态文本控件,包括StaticText控件和Group Box控件,StaticText控件通常用来标识一个控件,Group Box通常用来分割不同组别的控件。
一般情况下,静态控件不接受用户输入,也不发出消息。它的ID号默认为IDC_STATIC,只有CStatic类的控件的ID号是可以重复的。
(一)Static Text控件
(二) Group Box控件
1 .Horizontal alignment
此选项用于设置Group Box中文本串显示的水平对齐位置,在下拉列表中提供了4个选项:Default, Right, Left, Center和默认选项Default,表示左对齐。
2. Icon
此选项表示使用图标作标识,代替文本串。
3. Bitmap
此选项表示使用位图作标识,代替文本串。
4. Notify
此选项表示当控件被选中或双击时,通知父窗口。此选项的类型是布尔型,默认值是FALSE。
5. Flat
此选项设置Group Box的线条显示风格。
三、 CEdit类控件的使用
编辑控件用于程序需要获取文本的时候,例如,在对话框内输入名字或数字时,由编辑控件获取此信息。编辑控件是用来存储用户输入的自由格式文本的窗口,分为单行编辑控件和多行编辑控件。单行编辑控件是用于输入单行文本的控件,多行文本编辑控件是用于输入多行文本的控件。在多行编辑控件中经常使用滚动条,从而能输入比显示区域更多的文本。事实上,Windows中的记事本(Notepad)应用程序就是一个带有控件菜单的编辑控件。
每个编辑控件都提供了内置编辑能力,因此可以使用多行编辑控件来创建一个简单的文本编辑器。所有的编辑控件都支持特定的编辑功能,而不需要任何附加编程。在剪贴板中用到的粘贴命令在编辑控件中照常可以使用。
(一)属性设置
14. Lowercase
将所有的输入内容转化为小写字符,默认不被选中。
15. Read-only
禁止用户在编辑控件中输入或修改其内容,默认不被选中。与静态文本控件的扩展属性相比,编辑控件的扩展属性只增加了一项Left scroll bar,如果设置了垂直滚动条,这一项决定了滚动条在客户区的左边。它的类型是布尔型,默认情况下不选中。
编程实例:Exam6_1编写一个用户登录的应用程序,应用程序维护着一张合法用户的用户名和密码的列表,至于合法用户才能通过登录程序.要求如下:
相关参考函数代码:
void CExam6_01Dlg::OnOK() { // TODO: Add extra validation here UpdateData(true); if(m_user.IsEmpty()) { AfxMessageBox("用户名不能为空,请重新输入"); m_EditUser.SetFocus(); } else if(m_pwd.IsEmpty()) { AfxMessageBox("密码不能为空,请重新输入"); m_EditPwd.SetFocus(); } else { int len=m_EditPwd.LineLength(); if(len!=6) { AfxMessageBox("密码必须为六位,请重新输入"); m_EditPwd.SetFocus(); } else { for(int i=0;i<5;i++) if((m_user==userlist[i][0])&&(m_pwd==userlist[i][1])) { MessageBox("You are welcome!"); break; } if(i==5) MessageBox("Sorry,you are not permitted."); } } CDialog::OnOK(); } CExam6_01Dlg::CExam6_01Dlg(CWnd* pParent /*=NULL*/) : CDialog(CExam6_01Dlg::IDD, pParent) { //{
{AFX_DATA_INIT(CExam6_01Dlg) m_user = _T(""); m_pwd = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); userlist[0][0]="MARY"; userlist[0][1]=""; userlist[1][0]="MARY"; userlist[1][1]=""; userlist[2][0]="MARY"; userlist[2][1]=""; userlist[3][0]="MARY"; userlist[3][1]=""; userlist[4][0]="MARY"; userlist[4][1]=""; userlist[5][0]="MARY"; userlist[5][1]=""; }
四、CButton类控件的使用
(一)CButton类控件介绍
按钮控件是Windows对话框中最常见的控件之一。按钮控件的类型比较丰富,其中主要有命令按钮、单选按钮、复选框按钮等。
按钮控件能够处理的消息类别如下所示。
消息类别 发生事件
BN_CLICKED 单击按钮
BN_DOUBLECLICKED 双击按钮
BN_SETFOCUS 按钮获取焦点
BN_KILLFOCUS 按钮失去焦点
注:BN:Button Notify
CButton类提供的常用访问方法:
GetBitmap( )获得用SetBitmap()设置的位图的句柄
GetButtonStyle()获得有关按钮控件的样式信息
GetCheck( )获得按钮控件的选中状态
GetCursor()获得通过SetCursor()设置的光标图像的句柄
Gedcon()获得由Setlcon()设置的图标句柄
GetState()获得按钮控件的选中、选择和聚焦状态
Sefitmap( )指定按钮上显示的位图
SetBunonStyle()设置按钮样式
SetCheck()设置按钮控件的选中状态
Setclrsor( )指定按钮控件上的光标图像
SetIcon()指定按钮上显示的图标
SetState()设置按钮控件的选择状态
(二)命令按钮
MFC应用程序的对话框模板默认为每一个对话框配置两个按钮—“确认”和“取消”按钮,ID固定为IDOK和IDCANCEL,并在对话框基类中定义了BN_CLICKED消息处理函数OnOK()和OnCancel(),用于完成关闭对话框时所需要的工作。这两个函数是虚函数,可以在应用程序的对话框类中重载这两个函数。
程序员可以自由地修改默认按钮和添加新的命令按钮。通常命令按钮上都有标题以表明此按钮的作用,命令按钮的Caption属性用于设置命令按钮的标题。例如,标题“确认”表示接受用户的选择等。
在Styles标签页中主要设置按钮的显示,默认为Default button风格,Owner draw提供了另一种按钮边框风格.Icon和Bitmap属性允许创建一个显示图标或位图的按钮,Multiline属性允许按钮上显示多行文本。Horizontal alignment和Vertical alignment属性设置标题在按钮上显示的水平及垂直方向的对齐方式。
(三)单选按钮
使用单选按钮(Radio Button),只能从一组选项中选择惟一一个选项,在组中选择一个上次未选中的选项时,其他选项自动变成未选中状态。用户可以在应用程序中添加单选按钮,并通过设置不同的属性满足自己的需要。
属性对同一组单选按钮的设置非常重要,每一个按钮的Caption属性用于设置单选按钮的显示文本。一组中的第一个控件要选中Group属性,表示一组控件的开始,同组的其他控件则不能设置Group属性,并且同一组控件的Tab Order要求是连续的。
打开ClassWizard的Member Variables标签页,可以发现对一组单选按钮,列表中只出现第一个控件ID,这意味着只能在对话框类中设置一个值类型的成员变量。该变量的值是int型,表示所选中的单选按钮在组中的序号,序号从0开始。例如,如果选择第2个单选按钮,则返回值为1。同样,一组单选按钮只能在对话框类设置一个单选按钮对象,也就是说一个单选按钮对象控制一组单选按钮。
MFC除了提供值类型成员变量操作单选按钮,还支持Win32 API函数通过控件ID直接操作单选按钮,CheckRadioButton()用于设置单选按钮的选中状态,函数原型为
CDialog::CheckRadioButton(int nIDFirstButton,int nIDLastButton,int nID_CheckButton);
该函数包括3个参数,第一个参数是一组单选按钮中第一个按钮的ID,第二参数是一组单选按钮中最后一个按钮的ID,第三个参数是设置为选中的单选按钮的ID.函数IsDlgButtonChecked()用于检查一个按钮是否被选中,函数原型为
CDialog::IsDlgButtonChecked(int nIDButton);
该函数只包含一个参数,即所检查按钮的ID号,返回值为true或false.
Radio按钮属性对话框的Style标签页:
1 .Auto
该项被选中时,控件状态将自动改变。该项通常被选中。
2. Left text
把控件的标题放在控件的左边。通常,控件的标题放在控件的右边。
3. Push-like
将控件设置成具有下压按钮的外观。则单击该按钮时,由原来的凸状态改变成下压状
态。
4. Multiline
控件的标题可通过多行显示。若该项未被选中,则标题超过按钮的宽度时,自动截去
后面部分
5. Flat
将控件左边的小圆圈显示为平放。默认为凹入。
6. Icon
将控件标题设置为图标。该项通常未选中。
7. Bitmap
将控件的标题用位图代替。Bitmap与Icon选项中,至多选中一个。该选项通常未选中。
(四)复选按钮
五、 CListBox类控件的使用
(一) CListBox类控件介绍
对于要从若干数据项中进行选择的场合,一个方便的方法是使用列表框。列表框是一个矩形窗口,在矩形窗口中包含一些列表字符串或其他的数据元素。列表框通常出现在对话框里,如用列表框选择文件名、目录等。列表框有一个预定义的键盘接口,用户可以用键盘上的箭头或PageUp及PageDown键在列表框中进行数据的选择,或通过适当的样式设置与Shift或Ctrl键组合使用。
列表框包括两种样式—单选列表框和多选列表框。单选列表框只允许用户一次选择一个选项,而多选列表框则可以一次选择多个选项。列表框可以自带滚动条,数据项可按排序后的顺序显示,使用己排序的列表框时,用户很容易在大量选项中搜索并作出选择。
列表框控件属性的Styles标签的具体属性设置如下:
1.Selection
设置列表框中选项的选中方式。有4个选项一Single,表示在给定的选项电至多有一个被选中:Multiple,表示可以有多个选项被选中,但忽略Shift键和Ctrl键;Extended,允许选择多个选项,在选择时,可以使用Shift和Ctrl键:None,不允许选择任何选项。
2. Owner draw
设置列表框将由列表框所有者来绘制,在大多数情况下,该选项设置为No.
3. Sort
设置列表框内容应按字母顺序排序,该选项通常被选中。
4. Multi-column
创建一个多列列表框,该选项通常未选中。
5. Use tapstops
设置列表框中显示的文本选项可以包含标签页,该选项通常未选中。
6. Want key input
设置列表框有输入焦点,当按键时列表框所有者收到WM_VKEYTOITEM或WM_CHARTOITEM消息。该选项通常未选中。
7. Disable no scroll
即使不需要,也显示一个垂直滚动条。该选项通常未选中。
CListBox类的通用方法用来获得和设置列表框数据的值和属性,所有的ClistBox控件都有这些方法,包括单选列表框、多选列表框和自绘列表框等。
CListBox类通用方法包括:
GetCount() 获得列表框中列表项数目
Geforiwntafxtent( ) 获得列表框的水平滚动宽度(以像素为单位)
GetItemData() 获得与某列表框项有关的32位值
GetITermDataPtr() 获得指向列表框项的指针
GetItemHeight( ) 获得列表框中项的高度
GetItemRect() 获得列表框项边界矩形
GetLocale() 获得列表框的位置标识(LCID)
GetSel() 获得列表框项的选中状态
GetText() 把列表框中字符串复制到缓冲区
GetTextLen() 返回列表框字符串的长度(单位:字节)
GetTopIndex() 获得列表框中第一个可见项的下标(由0开始)
ItemFrompoint()确定和返回离某点最近的列表框项的下标
SetColumnWidth()设置多列列表框的列宽度
SetHotizontalExtent()设置列表框的水平滚动宽度(单位:像素)
SetItemData()设置与一个列表框项有关的32位值
SetDataPtr()设置一个列表框项的指针
SetltemHeight()设置列表框中项的高度
SetLocale( )设置列表框的位置标识(LCID )
SetTabStops()设置列表框的制表位(Tab-Stop)位置
SetTopIndex()设置列表框中第一个可见项的下标(由0开始)
使用列表框之前,需要预先准各好列表框中的数据选择项,在对话框的运行过程中还允许对选择项执行增加和删除操作,CListBox类提供了操作字符串的一套方法,CListBox类用于操作列表框中字符串的方法如下:
AddString( ) 在列表框中加入一个字符串
DeleteString( ) 从列表框中删除一个字符串
Dir() 从当前目录加文件名放入列表框
FindString( ) 在列表框中搜索一个字符串
FindSIringEacact() 在列表框中搜索第一个与指定字符串匹配的字符串
InsertStting( ) 在列表框指定下标处插入一个字符串
ResetContent() 清除列表框中的所有项
SelectString() 在单选列表框中搜索并选择一个字符串
CListBox类还声明了几个虚函数:
CharToItem() 可以重载此方法来为自绘列表框(没有字符串)处理WM-CHAR消息
CompareItem() 由MFC调用以得到排序后的自绘列表框中的新项的位置
DeleteItem( ) 当用户从自绘列表框中删除一项时,MFC调用此方法
DrawItem() 当确定自绘列表框项必须重绘时,MFC调用此方法
MeasureItem( ) 创建自绘列表框时MFC调用此方法来决定列表框的维数
VKeyToItem( ) 用户可重载此方法,来处理具有LBS_WANTKEYBOARDINPUT样式的列表框的WM_KEYDOWN消息
与列表框相关的消息
LBN_DBLCLK当双击某列表框选项时发送。
LBN_ERRSPACE因为内存不够,一个操作不能执行时发送。
LBN_KILLFOCUS当列表框失去输入焦点时发送。
LBN_SELCANCEL当用户取消某列表框选择时发送。
LBN_SELCHANGE当列表框中的选择状态改变时发送
LBN_SETFOCUS当列表框得到输入焦点时发送。
上面的消息都用LBN_作前缀(LBN:List Button Notify)。如果要发送这些消息,列表框必须在Properties对话框里选中Notify复选框。LBN_DBLCLK消息是最常用的消息,大多数用户希望双击列表框选项时执行某种默认的操作。例如,显示文件名列表时,希望双击某文件名可以打开该文件进行编辑。
(二)单选列表框
当未选中Sort属性时,使用C1assWizard可在对话框类为列表框控件关联两种类型的值成员变量,CString类型的值成员变量表示选择项的显示值,int类型的值成员变量表示选择项的下标值。当选中Sort属性时,只能关联一个CString类型的值成员变量。所关联的值成员变量的数据类型不同,决定着在初始化时进行选中操作的方法也不同。
(三)多选列表框
六、 CComboBox类控件的使用
组合框控件是把编辑框和列表框控件组合起来的一类控件。组合框使用户既能像使用编辑控件那样直接输入数据,也能像使用列表框那样从一些选项中选择某一选项来输入数据。
当用户没有被限制必须选择列表框中选项时,组合框十分有用。组合框的列表框部分能用来显示最近的选择,同时给用户在编辑控件中输入新选择的自由。
有如下三种类型的组合框控件:
1.简单组合框(Simple)
显示一个编辑控件和列表框。该列表框总是可见的。当列表框包含的选项太多,显示不下时,将使用一个滚动条在整个列表框中滚动。
2.下拉式组合框(Dropdown)
隐藏列表框,直到用户打开它。使用这种类型的组合框,在对话框中占用的空间比简
单组合框要小得多。
3.下拉式列表框(Drop List)
与下拉式组合框相似,只有被用户打开时,才显示列表框。同时,编辑框只能显示选中的选项,而不允许用户输入。因此,用户只能从列表框中选择选项。
(一)CComboBox类控件介绍
七、 CScroIIBar类控件的使用
(一) CScrollBar类控件介绍
滚动条是一种交互式的、高度可视化的控件,它对用户的输入有几种不同的响应。滚动条中包括一个滑块,这个滑块能够沿滚动条移动;在滚动条的两端还各有一组按钮。
滚动条控件与属于窗口的滚动条是不一样的,属于窗口的滚动条由该窗口创建、管理和释放,而滚动条控件由用户创建、管理和释放。滚动条在窗口中可以设置为水平或垂直,单击滚动条两端的箭头按钮时,滚动条移动的距离称为滑块的滚动单位,滚动单位可以根据程序的需要进行设置。
滚动条控件是Windows窗口操作中常用的工具。滚动条控件最直接的功能是当应用程序显示的内容超过窗口的范围时,用户可通过拖动滚动条遍历整个窗口内容。滚动条在功能上分为垂直与水平滚动条,分别实现窗口内容的纵向和横向滚动。
注:SB:Scroll Bar
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231407.html原文链接:https://javaforall.net
