《第10章基本控件使用(二)课件.ppt》由会员分享,可在线阅读,更多相关《第10章基本控件使用(二)课件.ppt(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第1010章章 基本控件使用(二)10.1 按钮类按钮类10.2 列表框类列表框类10.3 按钮类与列表框类的应用实例按钮类与列表框类的应用实例习题习题10.1 按钮类按钮是一个矩形窗口,通常包含一个标题用来说明按钮的作用。CButton(按钮控件)类是从CWnd类继承下来的,它在MFC窗口类中的位置如图10-1所示。图10-1CButton类在MFC窗口类的层次结构中的位置10.1.1 按钮类的结构按钮类的结构VC+在Afxwin.h中定义了CButton类的结构,结构代码如下:classCButton:publicCWndDECLARE_DYNAMIC(CButton)/Construc
2、torspublic:CButton();BOOLCreate(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);/AttributesUINTGetState()const;voidSetState(BOOLbHighlight);intGetCheck()const;voidSetCheck(intnCheck);UINTGetButtonStyle()const;voidSetButtonStyle(UINTnStyle,BOOLbRedraw=TRUE);#if(WINVER=0 x400)H
3、ICONSetIcon(HICONhIcon);HICONGetIcon()const;HBITMAPSetBitmap(HBITMAPhBitmap);HBITMAPGetBitmap()const;HCURSORSetCursor(HCURSORhCursor);HCURSORGetCursor();#endif/Overridables(forownerdrawonly)virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);/Implementationpublic:virtualCButton();protected:virtual
4、BOOLOnChildNotify(UINT,WPARAM,LPARAM,LRESULT*);表10-1就是CButton类中按钮特有的样式。表10-1 CButton类中按钮特有的样式10.1.2 按钮类的方法按钮类的方法按钮类(CButton类)提供了如下的访问方法,如表10-2所示。表10-2 CButton类的方法10.2 列表框类列表框类CListBox类在MFC类层次结构中的位置如图10-2所示。图10-2CListBox类在MFC类层次结构中的位置10.2.1 列表框类的结构列表框类的结构MFC定义了列表框类的结构,其结构如下:classCListBox:publicCWndDE
5、CLARE_DYNAMIC(CListBox)/Constructorspublic:CListBox();BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);/Attributes/forentirelistboxintGetCount()const;intGetHorizontalExtent()const;voidSetHorizontalExtent(intcxExtent);intGetTopIndex()const;intSetTopIndex(intnIndex);LCIDGetLocale()const
6、;LCIDSetLocale(LCIDnNewLocale);#if(WINVER=0 x400)intInitStorage(intnItems,UINTnBytes);UINTItemFromPoint(CPointpt,BOOL&bOutside)const;#endif/forsingle-selectionlistboxesintGetCurSel()const;intSetCurSel(intnSelect);/formultiple-selectionlistboxesintGetSel(intnIndex)const;/alsoworksforsingle-selectioni
7、ntSetSel(intnIndex,BOOLbSelect=TRUE);intGetSelCount()const;intGetSelItems(intnMaxItems,LPINTrgIndex)const;voidSetAnchorIndex(intnIndex);intGetAnchorIndex()const;/forlistboxitemsDWORDGetItemData(intnIndex)const;intSetItemData(intnIndex,DWORDdwItemData);void*GetItemDataPtr(intnIndex)const;intSetItemDa
8、taPtr(intnIndex,void*pData);intGetItemRect(intnIndex,LPRECTlpRect)const;intGetText(intnIndex,LPTSTRlpszBuffer)const;voidGetText(intnIndex,CString&rString)const;intGetTextLen(intnIndex)const;/SettableonlyattributesvoidSetColumnWidth(intcxWidth);BOOLSetTabStops(intnTabStops,LPINTrgTabStops);voidSetTab
9、Stops();BOOLSetTabStops(constint&cxEachStop);/takesanintintSetItemHeight(intnIndex,UINTcyItemHeight);intGetItemHeight(intnIndex)const;intFindStringExact(intnIndexStart,LPCTSTRlpszFind)const;intGetCaretIndex()const;intSetCaretIndex(intnIndex,BOOLbScroll=TRUE);/Operations/manipulatinglistboxitemsintAd
10、dString(LPCTSTRlpszItem);intDeleteString(UINTnIndex);intInsertString(intnIndex,LPCTSTRlpszItem);voidResetContent();intDir(UINTattr,LPCTSTRlpszWildCard);/selectionhelpersintFindString(intnStartAfter,LPCTSTRlpszItem)const;intSelectString(intnStartAfter,LPCTSTRlpszItem);intSelItemRange(BOOLbSelect,intn
11、FirstItem,intnLastItem);/Overridables(mustoverridedraw,measureandcompareforownerdraw)virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);virtualvoidMeasureItem(LPMEASUREITEMSTRUCTlpMeasureItemStruct);virtualintCompareItem(LPCOMPAREITEMSTRUCTlpCompareItemStruct);virtualvoidDeleteItem(LPDELETEITEMST
12、RUCTlpDeleteItemStruct);virtualintVKeyToItem(UINTnKey,UINTnIndex);virtualintCharToItem(UINTnKey,UINTnIndex);/Implementationpublic:virtualCListBox();protected:virtualBOOLOnChildNotify(UINT,WPARAM,LPARAM,LRESULT*);像所有的窗口一样,列表框也有窗口样式的组合。由于它们本身是窗口,因此除可用窗口样式外,还可以使用如表10-3所示的样式的组合。表10-3 列表框控件可用的样式表10-4显示了消
13、息映像项,它用于处理列表框通知。表10-4 CListBox消息的消息映像项10.2.2 列表框类的方法1通用方法表10-5给出了每个通用方法的简单描述。表10-5 CListBox类的通用方法2单选列表框的方法3多选列表框的方法这些方法作为通用方法的补充如表10-6所示。4特定字符串方法特定字符串的方法适用于单选择和多选择两种模式的列表框,它们处理列表框中的字符串项。表10-7列出了用于CListBox对象的字符串方法。表10-6 特定于多项选择列表框的CListBox类方法表10-7 CListBox类中字符串特定的方法5虚拟方法虚拟方法表10-8列出了CListBox类的虚拟方法,通过替
14、换可以完成MFC没有直接提供的功能。表10-8 可被替换的CListBox类的虚拟方法10.2.3 创建和初始化列表框对象创建和初始化列表框对象CListBox对象像大多数MFC对象一样,使用两步构造过程。创建一个列表框要执行下列步骤:(1)用C+关键字new和构造函数CListBox:CListBox()为CListBox对象分配一个实例。(2)初始化CListBox对象并赋于它一个Windows列表框,通过方法CListBox:Create()设置列表框的参数和样式。例如,下面的代码分配一个CListBox对象并返回指向该对象的指针:CListBox*pMyListBox=newCList
15、Box;指针pMyListBox用CListBox:Create()方法进行初始化。该方法声明如下:BOOLCreate(WORDdwStyle,/dwStyle是列表框控件的窗口样式constRecy&rect,/rect是一个矩形,它指明控件的大小和位置CWnd*pParentWnd,/pParentWnd是指向控件所有者的指针UINTnID/nID是父窗口用来与列表框通信的控件标识)10.3 按钮类与列表框类的应用实例按钮类与列表框类的应用实例例10-1 编写应用程序,其主窗口如图10-3所示,标题为“按钮与列表”。在这个窗口中,包含有三个标题,分别为Check Box、Radio Bo
16、x和Combo Box的分组框。在Check Box分组框中,包含两个复选框Date和Time,以及Enable、Disable、Show Again和Hide the Clock Setting四个按钮;在Radio Box分组框中,含有两个子分组框、一个按钮和一个编辑框,子分组框名字分别为Sex Selecting和Age Range,它们分别包含了一组单选按钮,此外还有一个名字为Show the Sex and Age的按钮;在Combo Box分组框中,有一个Course分组框(其中包含三个单选按钮)、一个名字为Record的下拉列表框、一个Show_Combo按钮和一个编辑框。(1)
17、CheckBox分组框中的控件:Date复选框:单击Date复选框,在其下面的编辑框中显示当前的日期,并在复选框中显示选中标志。Time复选框:单击Time复选框,在其下面的编辑框中显示当前的系统时间,并在复选框中显示选中标志。Disable按钮:单击Disable按钮,上面的两个复选框变成无效,不响应操作,并且复选框和编辑框都变灰。Enable按钮:单击Enable按钮,复选框又变成有效,可对其进行操作。HidetheClockSetting按钮:单击Hide按钮,隐藏复选框和编辑框,使它们不可见。ShowAgain按钮:重新显示被隐藏的复选框和编辑框。(2)RadioBox分组框中的控件:
18、SexSelecting子分组框:在此子分组框中有Boy和Girl单选按钮,可单击其中的任何一项进行性别的选择。AgeRange子分组框:在此框中进行年龄段的选择。ShowtheSexandAge按钮:单击此命令按钮,在其下面的编辑框中显示一行信息,报告当前单选按钮的状态。(3)ComboBox分组框中的控件:Course子分组框:在此子分组框中有English、Computer和Nature三门课的选项,单击其中的任何一项进行课程科目的选择。Record下拉列表框:在此框中进行成绩的选择。Show_Combo按钮:单击此命令按钮,在其下面的编辑框中显示一行信息,报告当前单选按钮及下拉列表框的
19、状态。(4)Exit按钮:单击此按钮,退出应用程序。1应用程序的界面设计应用程序的界面设计在处于编辑状态的对话框中,通过控件工具进行各个控件的属性的设置,各控件的ID等属性如表10-9所示。表10-9 “按钮与列表”应用程序对话框中各个对象的属性2应用程序的代码编程部分应用程序的代码编程部分1)给各个控件连接变量在进行程序的代码编程之前,必须给每一个控件连接变量,控件的变量如表10-10所示。表10-10 控件及其连接的变量2)与有关按钮、编辑框等控件的连接方法与有关按钮、编辑框等控件连接的方法如表10-11所示。表10-11 与控件连接的方法3)方法的实现(1)给复选框IDC_DATE_CH
20、ECK添加代码。OnDateCheck()方法的实现代码如下:voidCSELECTBOXDlg:OnDateCheck()/在此处加入控件通知句柄代码/编写代码开始UpdateData(TRUE);if(m_DateCheck=TRUE)CTimetNow;tNow=CTime:GetCurrentTime();CStringsNow=tNow.Format(%y.%m.%d);m_DateEdit.SetSel(0,-1);m_DateEdit.ReplaceSel(sNow);elsem_DateEdit.SetSel(0,-1);m_DateEdit.ReplaceSel();Upda
21、teData(FALSE);/编写代码结束(2)给复选框IDC_TIME_CHECK添加代码。OnTimeCheck()方法的实现代码如下:voidCSELECTBOXDlg:OnTimeCheck()/在此处加入控件通知句柄代码/编写代码开始UpdateData(TRUE);if(m_TimeCheck=TRUE)CTimetNow;tNow=CTime:GetCurrentTime();CStringsNow=tNow.Format(%I:%M:%S);m_TimeEdit.SetSel(0,-1);m_TimeEdit.ReplaceSel(sNow);elsem_TimeEdit.Se
22、tSel(0,-1);m_TimeEdit.ReplaceSel();UpdateData(FALSE);/编写代码结束(3)给Enable按钮添加代码。OnEnableButton()方法的实现代码如下:voidCSELECTBOXDlg:OnEnableButton()/在此处加入控件通知句柄代码/编写代码开始GetDlgItem(IDC_DATE_CHECK)-EnableWindow(TRUE);GetDlgItem(IDC_TIME_CHECK)-EnableWindow(TRUE);m_DateEdit.EnableWindow(TRUE);m_TimeEdit.EnableWin
23、dow(TRUE);/编写代码结束(4)给Disable按钮添加代码。OnDisableButton()方法的实现代码如下:voidCSELECTBOXDlg:OnDisableButton()/在此处加入控件通知句柄代码/编写代码开始GetDlgItem(IDC_DATE_CHECK)-EnableWindow(FALSE);GetDlgItem(IDC_TIME_CHECK)-EnableWindow(FALSE);m_DateEdit.EnableWindow(FALSE);m_TimeEdit.EnableWindow(FALSE);/编写代码结束(5)给ShowAgain按钮添加代码
24、。OnShowButton()方法的实现代码如下:voidCSELECTBOXDlg:OnShowButton()/在此处加入控件通知句柄代码/编写代码开始GetDlgItem(IDC_DATE_CHECK)-EnableWindow(SW_SHOW);GetDlgItem(IDC_TIME_CHECK)-EnableWindow(SW_SHOW);GetDlgItem(IDC_DATE_EDIT)-EnableWindow(SW_SHOW);m_DateEdit.ShowWindow(SW_SHOW);GetDlgItem(IDC_TIME_EDIT)-EnableWindow(SW_SHO
25、W);m_TimeEdit.ShowWindow(SW_SHOW);/编写代码结束(6)给HidetheClockSetting按钮添加代码。OnHideButton()方法的实现代码如下:voidCSELECTBOXDlg:OnHideButton()/在此处加入控件通知句柄代码/编写代码开始GetDlgItem(IDC_DATE_CHECK)-EnableWindow(SW_HIDE);GetDlgItem(IDC_TIME_CHECK)-EnableWindow(SW_HIDE);m_DateEdit.ShowWindow(SW_HIDE);m_TimeEdit.ShowWindow(S
26、W_HIDE);/编写代码结束(7)给 Show_Sex_and_Age按 钮 添 加 代 码。OnShowSexAgeButton()方法的实现代码如下:voidCSELECTBOXDlg:OnShowSexAgeButton()/在此处加入控件通知句柄代码/添加代码开始charsEdit50;intiSexRADIO;intiAgeRADIO;iSexRADIO=GetCheckedRadioButton(IDC_Boy_RADIO,IDC_Girl_RADIO);if(iSexRADIO=IDC_Boy_RADIO)strcpy(sEdit,TheBoysageis);if(iSexRA
27、DIO=IDC_Girl_RADIO)strcpy(sEdit,Thegirlsageis);iAgeRADIO=GetCheckedRadioButton(IDC_Age1_RADIO,IDC_Age3_RADIO);if(iAgeRADIO=IDC_Age1_RADIO)strcat(sEdit,greatthan20);if(iAgeRADIO=IDC_Age2_RADIO)strcat(sEdit,between15and20);if(iAgeRADIO=IDC_Age3_RADIO)strcat(sEdit,lessthan15);m_ResultEdit.SetSel(0,-1);
28、m_ResultEdit.ReplaceSel(sEdit);/添加代码结束(8)给Show_Combo按钮添加代码。OnShowComboButton()方法的实现代码如下:voidCSELECTBOXDlg:OnShowComboButton()/加入代码开始UpdateData(TRUE);charsCourseEdit30;charsRecordEdit15;intiCourseRadio;iCourseRadio=GetCheckedRadioButton(IDC_ENGLISH_RADIO,IDC_NATURE_RADIO);if(iCourseRadio=IDC_ENGLISH_
29、RADIO)strcpy(sCourseEdit,Englishrecordis);if(iCourseRadio=IDC_COMPUTER_RADIO)strcpy(sCourseEdit,Computerrecordis);if(iCourseRadio=IDC_NATURE_RADIO)strcpy(sCourseEdit,Naturalrecordis);m_Record.GetWindowText(sRecordEdit,15);strcat(sCourseEdit,);strcat(sCourseEdit,sRecordEdit);m_ComboEdit=_T(sCourseEdi
30、t);UpdateData(FALSE);/加入代码结束(9)给Exit按钮添加代码。OnExitButton()方法的实现代码如下:voidCSELECTBOXDlg:OnExitButton()/在此处加入控件通知句柄代码/编写代码开始OnOK();/编写代码结束4)初始化单选按钮BOOL CSELECTBOXDlg:OnInitDialog()CDialog:OnInitDialog();/Add About.menu item to system menu./IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOU
31、TBOX&0 xFFF0)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);/Settheiconforthisdialog.Theframeworkdoesthisautomatically/whentheapplicationsmainwindowisnotadialogSetIcon(m_hIcon,TRUE);/SetbigiconSetIcon(m_hIcon,FALSE);/Setsmallicon/
32、在此加入其他初始化代码/添加代码开始CheckRadioButton(IDC_Boy_RADIO,IDC_Girl_RADIO,IDC_Boy_RADIO);CheckRadioButton(IDC_Age1_RADIO,IDC_Age3_RADIO,IDC_Age2_RADIO);UpdateData(FALSE);m_English=0;m_Record.AddString(85);m_Record.AddString(90);m_Record.AddString(95);m_Record.SelectString(-1,95);UpdateData(FALSE);/代码添加结束retur
33、nTRUE;/returnTRUEunlessyousetthefocustoacontrol习习 题题10-1 简答题简答题(1)按钮控件是如何应用的?(2)按钮控件分为哪几类?(3)使用什么函数实现按钮禁用?(4)如何实现按钮隐藏?(5)哪些按钮控件需要初始化?(6)如何创建和初始化CListBox对象?(7)如何定义单选按钮组?(8)单选按钮组的初始化是如何实现的?10-2 编程题编程题(1)创建一个显示成绩的单选按钮控件,成绩项包括“100”、“90”、“80”和“70”四档;创建一个复选按钮控件组,复选项为“加权”(对上述成绩的权量分别为10、9、8、7),布置一个“计算”按钮和一个“退出”按钮,当单击“计算”按钮时,在编辑框中显示成绩的平均值。(2)创建一个下拉列表框控件,能对10个学生的名字进行选择;另有一个列表框,列有五个有关学生兴趣爱好的选项。在两个下拉列表框中选择相应的内容,单击OK按钮后,在对话框中显示所选的学生的名字和相应的爱好。