6.1传统控件在上一课的表5.1已经列出了Windows的传统控件及其对应的控件类。在这些控件中,读者应该重点掌握命令按钮、选择框、单选按钮、编辑框、列表框和组合框。.1.1传统控件的控件通知消息控件通过向父窗口发送控件通知消息来表明发生了某种事件.例如,当用户在按钮上单击鼠标时,按钮控件会向父窗口发送BN_CLICKED消息.传统控件的通知消息实际上是通过WM_COMMAND消息发给父窗口的(滚动条除外),在该消息的wParam中含有通知消息码(如BN_CLICKED)和控件的ID,在lParam中则包含了控件的句柄.利用ClassWizard可以很容易地为控件通知消息加入消息映射和消息处理函数,这在上一章中已经演示过了.传统控件的消息映射宏是ON_XXXX,其中XXXX表示通知消息码,如BN_CLICKED.ON_XXXX消息映射如下所示,该宏有两个参数,一个是控件的ID,一个是消息处理函数名.ON_XXXX(nID,memberFxn)消息处理函数的声明应该有如下形式:afx_msgvoidmemberFxn();例如,某按钮的BN_CLICKED消息的消息映射及其处理函数的声明如下所示ON_BN_CLICKED(IDC_ADD,OnAdd)afx_msgvoidOnAdd();有时,为了处理方便,需要把多个ID连续的控件发出的相同消息映射到同一个处理函数上.这就要用到ON_CONTROL_RANGE宏.ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。例如,要处理一组单选按钮发出的BN_CLICKED消息,相应的消息映射如下所示:ON_CONTROL_RANGE(BN_CLICKED,IDC_FIRST,IDC_LAST,OnRadioClicked)函数OnRadioClicked的声明如下,该函数比上面的OnAdd多了一个参数nID以说明发送通知消息的控件ID.afx_msgvoidOnRadioClicked(UINTnID);ClassWizard不支持ON_CONTROL_RANGE宏,所以需要手工建立消息映射和消息处理函数.提示:事实上,在使用ClassWizard时只要运用一个小小的技巧,就可以把不同控件的通知消息映射到同一个处理函数上,也可以把一个控件的不同通知消息映射到同一个处理函数上.这个技巧就是在用ClassWizard创建消息处理函数时,指定相同的函数名即可.此方法的优点在于控件的ID不必是连续的,缺点是处理函数没有nID参数,因而不能确定是哪一个控件发送的消息.6.1.2静态控件静态控件包括静态正文(StaticText)和图片控件(Picture)。静态正文控件用来显示正文。图片控件可以显示位图、图标、方框和图元文件,在图片控件中显示图片的好处是不必操心图片的重绘问题。静态控件不能接收用户的输入。在上一章中,读者已经用过静态正文和组框控件。图片控件的例子可以在AppWizard创建的IDD_ABOUTBOX对话框模板中找到,在该模板中有一个图片控件用来显示图标。静态控件的主要起说明和装饰作用。MFC的CStatic类封装了静态控件。CStatic类的成员函数Create负责创建静态控件,该函数的声明为BOOLCreate(LPCTSTRlpszText,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID=0xffff);参数lpszText指定了控件显示的正文。dwStyle指定了静态控件的风格,表6.1显示了静态控件的各种风格,dwStyle可将这些风格组合起来。rect是一个对RECT或CRect结构的引用,用来说明控件的位置和尺寸。pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.表6.1静态控件的风格控件风格含义SS_BLACKFRAME指定一个具有与窗口边界同色的框(缺省为黑色)。SS_BLACKRECT指定一个具有与窗口边界同色的实矩形(缺省为黑色)。SS_CENTER使显示的正文居中对齐,正文可以回绕。SS_GRAYFRAME指定一个具有与屏幕背景同色的边框。SS_GRAYRECT指定一个具有与屏幕背景同色的实矩形。SS_ICON使控件显示一个在资源中定义的图标,图标的名字有Create函数的lpszText参数指定。SS_LEFT左对齐正文,正文能回绕。SS_LEFTNOWORDWRAP左对齐正文,正文不能回绕。SS_NOPREFIX使静态正文串中的&不是一个热键提示符。SS_NOTIFY使控件能向父窗口发送鼠标事件消息。SS_RIGHT右对齐正文,可以回绕。SS_SIMPLE使静态正文在运行时不能被改变并使正文显示在单行中。SS_USERITEM指定一个用户定义项。SS_WHITEFRAME指定一个具有与窗口背景同色的框(缺省为白色)。SS_WHITERECT指定一个具有与窗口背景同色的实心矩形(缺省为白色)。除了上表中的风格外,一般还要为控件指定WS_CHILD和WS_VISIBLE窗口风格。一个典型的静态正文控件的风格为WS_CHILD|WS_VISIBLE|SS_LEFT。对于用对话框模板编辑器创建的静态控件,可以在控件的属性对话框中指定表6.1中列出的控件风格。例如,可以在静态正文控件的属性对话框中选择Simple,这相当于指定了SS_SIMPLE风格。Cstatic类主要的成员函数在表6.2中列出。可以利用CWnd类的成员函数GetWindowText,SetWindowText和GetWindowTextLength等函数来查询和设置静态控件中显示的正文.表6.2CStatic类的主要成员函数函数声明用途HBITMAPSetBitmap(HBITMAPhBitmap);指定要显示的位图。HBITMAPGetBitmap()const;获取由SetBitmap指定的位图。HICONSetIcon(HICONhIcon);指定要显示的图标。HICONGetIcon()const;获取由SetIcon指定的图标。HCURSORSetCursor(HCURSORhCursor);指定要显示的光标图片。HCURSORGetCursor();获取由SetCursor指定的光标。HENHMETAFILESetEnhMetaFile(HENHMETAFILEhMetaFile);指定要显示的增强图元文件。HENHMETAFILEGetEnhMetaFile()const;获取由SetEnhMetaFile指定的图元文件。静态控件较简单,故这里就不举例说明了。6.1.3按钮控件按钮是指可以响应鼠标点击的小矩形子窗口。按钮控件包括命令按钮(Pushbutton)、检查框(CheckBox)、单选按钮(RadioButton)、组框(GroupBox)和自绘式按钮(Owner-drawButton)。命令按钮的作用是对用户的鼠标单击作出反应并触发相应的事件,在按钮中既可以显示正文,也可以显示位图。选择框控件可作为一种选择标记,可以有选中、不选中和不确定三种状态。单选按钮控件一般都是成组出现的,具有互斥的性质,即同组单选按钮中只能有一个是被选中的。组框用来将相关的一些控件聚成一组.自绘式按钮是指由程序而不是系统负责重绘的按钮。按钮主要是指命令按钮、选择框和单选按钮。后二者实际上是一种特殊的按钮,它们有选择和未选择状态。当一个选择框处于选择状态时,在小方框内会出现一个“√”,当单选按钮处于选择状态时,会在圆圈中显示一个黑色实心圆。此外,检查框还有一种不确定状态,这时检查框呈灰色显示,不能接受用户的输入,以表明控件是无效的或无意义的。按钮控件会向父窗口发出如表6.3所示的控件通知消息。表6.3按钮控件的通知消息消息含义BN_CLICKED用户在按钮上单击了鼠标。BN_DOUBLECLICKED用户在按钮上双击了鼠标。FC的CButton类封装了按钮控件。CButton类的成员函数Create负责创建按钮控件,该函数的声明为BOOLCreate(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);参数lpszCaption指定了按钮显示的正文。dwStyle指定了按钮的风格,如表6.4所示,dwStyle可以是这些风格的组合。rect说明了按钮的位置和尺寸。pParentWnd指向父窗口,该参数不能为NULL。nID是按钮的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.表6.4按钮的风格控件风格含义BS_AUTOCHECKBOX同BS_CHECKBOX,不过单击鼠标时按钮会自动反转。BS_AUTORADIOBUTTON同BS_RADIOBUTTON,不过单击鼠标时按钮会自动反转。BS_AUTO3STATE同BS_3STATE,不过单击按钮时会改变状态。BS_CHECKBOX指定在矩形按钮右侧带有标题的选择框。BS_DEFPUSHBUTTON指定缺省的命令按钮,这种按钮的周围有一个黑框,用户可以按回车键来快速选择该按钮。BS_GROUPBOX指定一个组框。BS_LEFTTEXT使控件的标题显示在按钮的左边。BS_OWNERDRAW指定一个自绘式按钮。BS_PUSHBUTTON指定一个命令按钮。BS_RADIOBUTTON指定一个单选按钮,在圆按钮的右边显示正文。BS_3STATE同BS_CHECKBOX,不过控件有三种状态:选择、未选择和变灰。除了上表中的风格外,一般还要为控件指定WS_CHILD、WS_VISIBLE和WS_TABSTOP窗口风格,WS_TABSTOP使控件具有Tabstop属性。创建一个普通按钮应指定的风格为WS_CHILD|WS_VISIBLE|WS_TABSTOP。创建一个普通检查框应指定风格WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX。创建组中第一个单选按钮应指定风格WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_AUTORADIOBUTTON,组中其它单选按钮应指定风格则不应该包括WS_TABSTOP和WS_GROUP。对于用对话框模板编辑器创建的按钮控件,可以在控件的属性对话框中指定表6.4中列出的控件风格。例如,在命令按钮的属性对话框中选择Defaultbutton,相当于指定了BS_DEFPUSHBUTTON。CButton类的主要的成员函数有:UINTGetState()const;该函数返回按钮控件的各种状态。可以用下列屏蔽值与函数的返回值相与,以获得各种信息。0x0003。用来获取检查框或单选按钮的状态。0表示未选中,1表示被选中,2表示不确定状态(仅用于检查框)。0x0004。用来判断按钮是否是高亮度显示的。非零值意味着按钮是高亮度显示的。当用户点击了按钮并按主鼠标左键时,按钮会呈高亮度显示。0x0008。非零值表示按钮拥有输入焦点。voidSetState(BOOLbHighlight);当参数bHeightlight值为TRUE时,该函数将按钮设置为高亮度状态,否则,去除按钮的高亮度状态。intGetCheck()const;返回检查框或单选按钮的选择状态。返回值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态(仅用于检查框)。voidSetCheck(intnCheck);设置检查框或单选按钮的选择状态。参数nCheck值的含义与GetCheck返回值相同。UINTGetButtonStyle()const;获得按钮控件的BS_XXXX风格。voidSetButtonStyle(UINTnStyle,BOOLbRedraw=TRUE);设置按钮的风格。参数nStyle指定了按钮