《计算机二级C语言学习第9章.ppt》由会员分享,可在线阅读,更多相关《计算机二级C语言学习第9章.ppt(164页珍藏版)》请在三一办公上搜索。
1、1,第9章 Windows 标准控件在可视化编程中的应用,2,控件是Windows 图形用户界面的主要组成部分之一,用户通过操作控件对象完成与应用程序之间的交互。控件的使用集中体现了Windows 系统面向对象的特点,3,9.1概述,控件工具栏,控件接受的消息主要有单击、双击和字符输入等,打开对话框编辑器就会出现控件工具栏(231页图),4,5,9.2 按钮控件及其应用,按钮控件,普通按钮圆按钮复选框按钮组框按钮自绘按钮,6,按钮控件消息:ON_BN_CLICKEDON_BN_DBLCLICKEDON_COMMAND,两个类似,按钮是最常见的控件之一,复选框,单选按钮,下压式按钮,分组框,常用
2、于只有两种完全相反状态的情况下,适用于同一组属性相同的数据中选一个数据,适用于消息的发送,没有太多的操作只是在窗口中划分区域范围,7,9.2.1 按钮控件的创建过程,CButton类的控件可以用对话框资源模板来创建,可以通过CButton类的成员函数Create函数来创建,该函数的声明为:BOOL Create(LPCTSTR lpszCaption,/指定了按钮显示的正文 DWORD dwStyle,/按钮的风格(202页表9-3)const RECT&rect,/按钮的位置和大小 CWnd*pParentWnd,/指向父窗口,UINT nID/按钮的ID),8,9,GetCheck()Se
3、tCheck()GetBitmap()SetBitmap()GetButtonStyle()SetButtonStyle()GetCursor()SetCursor()GetIcon()SetIcon()GetState()SetState(),CButton类的成员函数,这些函数(202页表9-4)是类的成员函数,所以调用的语句应该是对象.函数(参数)Set开头的有参数Get开头的无参数,10,CButton类是CWnd类的派生类,在知道按钮ID的前提下,还可使用与按钮有关的CWnd成员函数来设置或查询按钮状态,当然调用的语句也应该是 对象.函数(参数),CheckDlgButtonChec
4、kRadioButtonGetCheckedRadioButtonIsDlgButtonCheckedGetWindowTexGetWindowTextLengthSetWindowText,11,(1)CheckDlgButton(int nIDButton,UNIT nCheck)该函数用来设置按纽的选择状态。其中:nIDButton是按纽的ID。nCheck取值0表示按纽未被选择,1表示按纽被选择,2表示按纽处于不确定状态。(2)CheckRadioButton(int nIDFirstButton,int nIDLastButton,int nIDCheckButton)该函数用来选择
5、组中的一个单选按纽。其中:nIDFirstButton指定按纽组中第一个按纽的ID。nIDLastButton指定按纽组中最后一个按纽的ID。int nIDCheckButton指定要选择的按纽的ID,12,(3)GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton)该函数用来获得一组单选按纽中被选中按纽的ID。其中:nIDFirstButton指定按纽组中第一个按纽的ID。nIDLastButton指定按纽组中最后一个按纽的ID。(4)IsDlgButtonChecked(int nIDButton)该函数返回复选框或单选按纽的
6、选择状态。返回0表示按纽未被选择,1表示按纽被选择,2表示按纽处于不确定状态(仅用于复选框)。,13,(5)GetWindowTex获得正文GetWindowTextLength获得正文长度SetWindowText设置正文例如 m_btn2是一个按钮对象m_btn2.SetWindowText(“按钮已被按下!”);,14,MFC还提供了一个CBitmapButton的类,允许用户以图标的方式显示按钮,它是在CButtong下派生的,MFC调用方法DrawItem()在按钮上绘制位图,LoadBitmaps()方法为一个CBitmapButton对象附上位图,自定义按钮,15,9.2.2 按
7、钮控件示例,16,控件在可视化编程中的应用主要步骤:1、创建基于对话框项目 2、设计界面3、添加成员变量4、添加消息响应代码前两步也叫做应用程序的可视化编程部分后两步也叫做应用程序的代码编程部分,17,1、创建基于对话框项目(1)使用AppWizard创建“MFC AppWizard(exe)”类型项目。设项目名为MY(2)选择项目类型时选择“Dialog based”类型的应用程序,资源语言选择中文,否则界面上的中文无法正确显示。(3)点击Finish按钮,VC在工作台中显示可以进行可视化编辑的IDD_ MY _DIALOG对话框,同时,出现控件工具栏窗口,(或者在ResourceView选
8、项卡中打开Dialog资源组,然后双击IDD_ MY _DIALOG)。然后将对话框上默认的控件(一个Exit按纽和Cancel按纽)删除干净。,18,2、设计界面(1)在控件工具栏上击某控件(选一个)(2)在对话框中相应位置击一下或拖出来一个控件,把鼠标停在编辑框控件上,即可显示该控件的类型,控件工具栏提供了VC中所有可建立的控件类型,19,Group属性,(3)在新控件上右击,快捷菜单中选属性,就可以设置各控件的属性:Caption属性、Group属性和 Auto属性,20,对于radio和check类型的按钮,如果设置了Auto风格,则开发者不需要响应按钮的点击消息,按钮会自动响应的。如
9、果没有设置Auto风格,则开发者需要响应按钮的点击消息,并自行设置按钮的状态。对于radio类型的按钮,每个设置Group风格的按钮和接下来没有设置Group风格的按钮为一组。下一个设置了Group风格的按钮为新一组的开始,即每组的第一个按钮设置Group风格。要设置ID_BUTTON2按钮为默认按钮,就是要设置ID_BUTTON2的tab order为所有控件中的第一个。在资源编辑器中选择菜单Layout|Tab Order,对话框编辑画面如图所示。此时按顺序点击控件,就会更改控件的tab顺序(不是位置顺序,而是响应顺序)。,21,3、添加成员变量连接变量就是给对象起一个变量名,以便调用成员
10、函数。哪些对象需要连接变量呢?(1)非自动的radio和check类型的按钮一定要连接变量(2)要调用成员函数对其属性进行修改的命令按钮一定要连接变量(3)自动的radio按钮和check按钮一般不连接变量例如,我们给非自动的check类型的按钮IDC_CHECK1连接了变量m_chk1,在程序的代码中可以有语句 if(m_chk1.GetCheck()0)m_chk1.SetCheck(0);else m_chk1.SetCheck(1);与控件连接的变量是本对话框类中的成员变量,同时也是对象,是对应控件类的对象。,22,添加成员变量要使用类向导,View-ClassWizard选项,23,
11、4、添加消息响应代码:ClassWizard选Message Maps,24,void CMy9_1Dlg:OnButton1()m_btn1.SetWindowText(“你已按下了按钮!”);void CMy9_1Dlg:OnButton2()m_btn2.SetWindowText(“按钮已被按下!”);void CMy9_1Dlg:OnCheck1()if(m_chk1.GetCheck()0)m_chk1.SetCheck(0);else m_chk1.SetCheck(1);void CMy9_1Dlg:OnRadio1()m_rad1.SetCheck(1);,25,9.3 滚动
12、条控件,滚动条是一个交互式的、高度可视化的控件它包括一个滑块、滚动条的两端的按钮等。,滚动条控件与属于窗口的滚动条是不一样的,处于窗口的滚动条是由该窗口创建、管理和释放的,滚动条控件是由用户创建、管理和释放的,26,9.3.1 滚动条类的结构及其方法,滚动条可以通过Create函数来创建,也可以用对话框资源模板来创建,27,9.3.2 创建与初始化滚动条类,28,在设置滚动条控件时,要通过如下方法设置其范围CScrollBar:SetScrollRange()例如,设置滚动范围为-100到100的垂直滚动条pMyScroll-SetScrollRange(SB_VERT,-100,100);设
13、置滚动条范围的语句一般放在OnInitDialog()函数中,在对话框程序初始化时就设置滚动条范围,通过SetScrollPos()设置滚动块当前位置例如,滚动快的位置在-100到100的中间,即为0的位置pMyScroller-SetScrollPos(0);,29,滚动条类编程实例,30,(1)应用程序的可视化编程部分,31,(2)应用程序的代码编程部分,(a)给滚动条连接变量,ID变量名类别 类型IDC_SCROLLBARm_ScrollbarControlCScrollbarIDC_EDITlm_EditControlCEdit,32,BOOL CMy9_2Dlg:OnInitDial
14、og()CDialog:OnInitDialog();/TODO:Add extra initialization herem_Scrollbar.SetScrollRange(0,20);m_Scrollbar.SetScrollPos(10);char sPos10;itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);UpdateData(FALSE);return TRUE;,10进制数,(b)初始化滚动条,33,(3)给滚动条消息添加代码 在Class Wizard中的
15、Object IDs列表框中选控件的ID值,在Message列表框中选WM_VSCROLL选项,此即为垂直滚动条的消息,为此消息加上一个成员函数OnVScroll(),在该函数中对滚动条不同的动作(209页表9-7)做出不同的响应。在一个对话框中,不论有几个垂直滚动条,只添加一个成员函数OnVScroll(),不论有几个水平滚动条,只添加一个成员函数OnHScroll()。,OnVScroll(UNIT nSBCode,UNIT nPos,CScrollBar*pScrollBar);,34,(3)给滚动条消息添加代码 void CMy9_2Dlg:OnVScroll()/TODO:Add y
16、our message handler code herechar sPos10;int iNowPos;switch(nSBCode)if(pScrollBar=,35,case SB_LINEDOWN:/单击滚动条向下的箭头iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos+1;if(iNowPos20)iNowPos=20;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.Replace
17、Sel(sPos);break;,36,case SB_LINEUP:/单击滚动条向上的箭头iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos-1;if(iNowPos0)iNowPos=0;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;,37,case SB_PAGEDOWN:/单击箭头与滚块之间的区域iNowPos=m_Scrollbar.
18、GetScrollPos();iNowPos=iNowPos+3;if(iNowPos20)iNowPos=20;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;,38,case SB_PAGEUP:/单击箭头与滚块之间的区域iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos-3;if(iNowPos0)iNowPos=0;m_Scrollbar
19、.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;CDialog:OnVScroll(nSBCode,nPos,pScrollBar);,39,(4)给Exit按钮连接代码 void CMy9_2Dlg:OnExitButton()OnOK();/对话框类的成员函数(5)给Up按钮添代码 void CMy9_2Dlg:OnUpButton()m_Scrollbar.SetScrollPos(0);m_Edit.SetS
20、el(0,-1);m_Edit.ReplaceSel(0);,40,(6)给 Down按钮添加代码void CMy9_2Dlg:OnDownButton()m_Scrollbar.SetScrollPos(20);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(20);(7)给Reset按钮添加代码void CMy9_2Dlg:OnResetButton()m_Scrollbar.SetScrollPos(10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(10);,41,在应用程序中,编辑框只是用于显示滚动块的位置,不需要进行编辑,
21、因此必须将其属性改为只读,42,9.4 静态控件,43,9.4.1 静态控件的特点,一般情况下静态控件不发送消息。实际应用中,需要静态文本能够象超文本那样响应用户的输入,向应用程序发送控件消息。,要在创建静态控件时加入SS_NOTIFY样式,该样式允许静态控件向其父窗口发送WM_COMMAND消息,该消息的字参数的低字节中包含静态控件的ID,高字节中包含通知码(217页表9-10),44,9.4.2 静态控件应用举例,【例9-3】本例通过演示位图静态控件的使用方法,说明静态控件消息的强制生成与处理过程,当单击位图时,就报告该位图的尺寸。,45,假设已经建立了一个静态控件,并连接了变量m_bmp
22、,那么在静态控件上显示位图 的方法有3步:1)m_bmp.ModifyStyle(0,SS_BITMAP);/设置控件的风格为SS_BITMAP,否则图片无法显示2)HBITMAP hBmp=LoadBitmap(AfxGetInstanceHandle(),”bmpd”);/从磁盘文件载入位图,文件名为bmpd 或HBITMAP hBmp=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1);/载入资源名称为IDB_BITMAP1位图3)m_bmp.SetBitmap(hBmp);/在对象m_bmp上显示出位图句柄为hB
23、mp的位图代码放在OnInitDailog函数中,46,主要步骤如下:创建基于对话框的应用程序导入(加入到工程中)一张BMP格式图片。假设位图资源名称为IDB_BITMAP1向对话框上放上一个static控件,其ID为IDC_STATIC_BMP,并设置控件为nofity风格,并添加CStatic类型成员m_bmp,无此风格,静态控件无法响应鼠标消息,47,(4)在OnInitDailog函数中添加如下代码,设置控件为位图风格,并设置位图 BOOL CMy9_3Dlg:OnInitDialog()/TODO:Add extra initialization herem_bmp.ModifySt
24、yle(0,SS_BITMAP);HBITMAP hBmp=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1);m_bmp.SetBitmap(hBmp);return TRUE;也可以写成HBITMAP hBmp=LoadBitmap(AfxGetInstanceHandle(),”bmpd”);,48,(5)响应鼠标单击静态控件的消息。为static控件添加BN_CLICKED消息的响应 void CMy9_3Dlg:OnStaticBmp()/TODO:Add your control notification h
25、andler code hereBITMAP bmp;GetObject(m_bmp.GetBitmap(),sizeof(BITMAP),/在消息框中显示字符串msg,49,9.5 列表框控件,列表框经常用在对话框里,如用列表框选择文件名、目录等。列表框有一个预定义的键盘接口,用户可以用键盘上的箭头和PageUp或PageDown键在列表框中进行数据的选择,或通过适当的样式设置,允许与Shift或Ctrl键组合使用。,列表框常应用于从众多数据中选某一项,50,9.5.1 列表框控件的类结构,MFC中CListBox类的层次结构,51,9.5.2 列表框类的方法,52,(1)通用方法,通用方法
26、用来获得和设置列表框数据的值和属性,所有的CListBox列表框都有这些方法,包括单选列表框、多选列表框和自绘列表框等,53,(2)单项选择特定方法,列表框的默认模式是单选项模式;所有的通用方法均适用于单选项列表框,例如 int i=m_list.GetCurSel();/取得当前选项的下标,54,方法 说明 GetAnchorIndex()获得多项选择列表框中当前定位项的下标GetCaretIndex()获得多项选择列表框中具有光标矩形的项的下标GetSelCount()获得多项选择列表框中当前所选的项的数目GetSelItems()将所有当前被选列表框项下标放入一整型数组缓冲区SelIte
27、mRange()切换多选择列表框项范围的选择状态SetAnchorIndex()在多项选择列表框中扩充选择设置开始(定位)项SetCaretIndex()在多项选择列表框中指定下标项设置光标矩形SetSel()在多项选择列表框中切换项目的选择状态,(3)多项选择特定方法,多选项列表框扩展了标准单项选择列表框的能力,可以解决在一个列表框中选择多项带来的复杂性,特定多项选择列表框的CListBox类方法,55,(4)字符串指定的方法,方法 说明 AddString()在列表框中加入一个字符串DeleteString()从列表框中删除一个字符串Dir()从当前目录加文件名放入列表框FindStrin
28、g()在列表框中搜索一字符串FindStringExact()在列表框中搜索第一个与指定搜索字符串匹配的字符串InsertString()在列表框指定下标处插入一字符串ResetContent()清除列表框中的所有项SelectString()在单选列表框中搜索并选择一字符串例如 m_list.DeleteString(i);/删除下标为i的字符串,对列表框中字符串操作的方法,56,(5)虚拟方法,CLstBox类还声明了几个虚拟方法,你可以从CListBox类中派生一些类替换到你的类中。,方法 说明 CharToItem()可以替换此方法来为自绘列表框(没有字符串)处理WM-CHARComp
29、areItem()由MFC调用以得到排序的自绘列表框中的新项的位置DeleteItem()当用户从自绘列表框中删除一项时MFC调用此方法DrawItem()当确定自绘列表框项必须重绘时MFC调用此方法MeasureItem()当一自绘列表框被创建时MFC调用此方法来决定列表框的维数VKeyToItem()用户可替换此方法,来处理具有LBS_WANTKEYBOARDINPUT样式 的列表框的WM_KEYDOWN,能被替换的CListBox类的虚拟方法,57,创建和初始化CListBox对象,用C+关键字new和构造函数为CListBox对象分配一个实例:CListBox:CListBox(),(
30、2)初始化CListBox对象并赋于它一个Windows列表框,通过方法CListBox:Create()设置列表框的参数和样式,58,例如,下面代码分配一个CListBox对象并返回指向该对象的指针:ClistBox*pMyListBox=new CListBox;指针pMyListBox用CListBox:Create()方法进行初始化该方法声明如下:BOOL Create(DWORD dwStyle,/列表框控件的窗口样式 const Recy&rect,/指明控件的大小和位置 CWnd*pParentWnd,/指向控件所有者的指针 UINT nID/控件标识),59,9.5.3 列表框
31、和应用程序之间消息传递,60,1.列表框向应用程序发送消息 当用户与列表框交互时,列表框向应用程序发出WM_COMMAND消息。该消息字参数的高字节为标识列表框动作的消息通知码(如LBN_DBLCLK标识用户双击);低字节为控件标识值。LBN_SELCHANGE:列表框中的用户选择已发生改变LBN_DBCLK:双击LBN_SELCANCLE:列表框中的选择被取消LBN_SETFOCUS:列表框收到输入焦点LBN_KILLFOCUS:列表框失去输入焦点,61,2.应用程序向列表框发送消息 应用程序对列表框的操作通过调用函数SendMessage(150页)或SendDlgItemMessage向
32、其发送各种消息完成。,62,9.5.4 列表框应用举例,【例9-4】创建一个单选列表框,并在该列表框中列出当前目录的文件,双击后删除该项,63,主要步骤如下:(1)在对话框上放置一个List Box(IDC_LIST_DIR)控件和一个Static(IDC_STATIC_DIR)控件。List Box控件用于显示文件名称,Static控件用于显示当前显示的文件所在的目录(2)为List Box控件添加CListBox类型成员变量m_list,64,(3)在OnInitDialog函数中添加初始化列表框内容的代码 BOOL CMy9_4Dlg:OnInitDialog()CDialog:OnIn
33、itDialog();/TODO:Add extra initialization hereDWORD cchCurDir=MAX_PATH;LPTSTR lpszCurDir;CHAR tchBufferMAX_PATH;lpszCurDir=tchBuffer;GetCurrentDirectory(cchCurDir,lpszCurDir);DlgDirList(lpszCurDir,IDC_LIST_DIR,IDC_STATIC_DIR,0);return TRUE;,获得当前目录放在lpszCurDir,设置列表框显示条目为当前目录下所有文件名,65,(4)为了实现双击条目删除的功能
34、,需要响应列表框的LBN_DBLCLK消息 void CMy9_4Dlg:OnDblclkListDir()/TODO:Add your control notification handler code hereint i=m_list.GetCurSel();/取得当前选项的下标CString str;m_list.GetText(i,str);/表9-13,把下标为i的字符串给strm_list.DeleteString(i);/表9-15,删除下标为i的字符串CString msg=Item+str+deleted!;AfxMessageBox(msg);/在消息框中显示字符串msg,
35、66,9.6 编辑框控件,编辑框控件看起来是个非常简单的矩形窗口,但它具有许多功能,编辑框控件可以自带滚动条,显示多行文本。,CEdit是CWnd类直接派生来的,这就意味着它具有CWnd的所有功能,编辑框控件,单行编辑框控件,多行编辑框控件,67,9.6.1 编辑框类常用方法,68,69,9.6.2 编辑框与应用程序间的消息传递,编辑框通过向其父窗口发关WM_COMMAND消息通知应用程序用户的交互信息 应用程序对编辑框的操作通过调用函数SendMessage或SendDlgItemMessage,70,9.6.3 编辑类编程实例,单击Showl,则在Edit1编辑框中显示“This is t
36、he first EditBox.”单击Clear1,则Edit1编辑框中的内容被清除;单击Show2,则在Edit2编辑框中显示“This is the second EditBox!”单击Clear2,则Edit2编辑框中的内容被清除;单击Transfer,则把Edit1编辑框的内容复制到Edit2的编辑框中去单击Undo,则取消上一次操作若单击Exit,则退出程序的运行,71,具体的编程过程,生成了工程文件和工程工作区文件后在EditBox的工作区中选择ResourceView,72,(1)创建资源:在ResourceView选项卡中打开Dialog资源组,然后双击IDD_EDITBOX
37、_DIALOG。VC在工作台中显示可以进行可视化编辑的IDD_EDITBOX_DIALOG对话框,把鼠标停在编辑框控件上,即可显示该控件的类型,控件工具窗提供了VC中所有可建立的控件类型,73,(2)设置控件ID,将鼠标移到Edit1控键上-单击鼠标右键,选择Properties命令,在窗口中输入控件的ID标识值,IDC_EDIT1,用同样的方法设置其它各个对象的属性,74,(3)应用程序的代码编程部分,给编辑框连接变量1)CEDIT型,需要调用CEDIT类的方法时用2)int类型,在编辑框中要放整数时用3)CString类型,在编辑框中要放字符串时用,75,给编辑框连接变量(假设连接的变量名
38、为aa)分3种情况:1)需要调用CEDIT类的方法时要给编辑框连接CEDIT类型的变量,比如要改变编辑框显示的内容,代码为:aa.SetSel(0,-1);aa.ReplaceSel(“ABC”);2)在编辑框中要放整数时连接int类型的变量,比如计算器程序中。代码为:m1=aa;或 aa=3;3)在编辑框中要输入或输出字符串时连接CString类型的变量,比如需要输入学生的姓名等,输入之后,把姓名放到数据库或数组中,不需要调用CEDIT类的成员函数,此时就连接CString类型变量。例1:CString s1;if(aa!=”)s1=aa;AfxMessageBox(s1);,76,例2:在
39、一个编辑框中仅需要显示一个字符串,不对其修改,可以连接CString类型的变量,代码如下:char s10;Strcopy(s,”abc”);aa=_T(s);/_T将字符串转成串类,本句相当于aa=_T(“abc”);或者CString cs;cs.Format(“age is%d”,12);aa=cs;连接的变量为int类型和CString类型时,一般先用UpdateData(TRUE);从窗口中读入和各控件连接的变量,然后对变量进行修改,最后用UpdateData(FALSE);刷新屏幕。综合本题可知:在一个编辑框中需要调用CEDIT类的方法时,连接CEDIT类的变量。,77,(b)设置
40、成员变量名为m_Edit1,类别为Control,变量类型为CEdit,注意,不要将m_Edit1设为CString类型,因为只有设为CEdit 类型,才能够调用CEdit 类中的一些成员函数,如Copy,Paste等,这样才能完成本应用程序中对Transfer按钮要求复制内容的操作的响应,78,用同样的方法给编辑框EDIT2等其它对象连接各自的变量,增加变量之后MFC ClassWizard窗口将变为下图所示,79,若此时运行该程序,在Edit文本框中不能进行多行输入,只能单行输入文本,而且按回车键终止应用程序,同时,文本框中也没有水平和垂直滚动条。下面,我们来完善应用程序中编辑框的特性,使
41、之能够进行多行文本的输入,80,(c)修改编辑框的特性,如果不选这项,在编辑框中按回车键,就会终止程序如果选这项,按回车键就可以进行下一行的输入,多行,81,(4)添加代码,void CMy9_5Dlg:OnShow1Button()m_Edit1.SetSel(0,-1);/选中编辑框IDC_EDIT1中的全部内容 m_Edit1.ReplaceSel(This is the first EditBox.);,程序中SetSel()函数是CEdit类中的成员函数,因为m_Edit1是属于CEdit类的对象,故可以调用该类所有的成员函数。ReplaceSel()函数也是CEdit类中成员函数。
42、,(a)给Showl按钮连接代码,82,(2)给 Clear1按钮连接代码,void CMy9_5Dlg:OnClear1Button()m_Edit1.SetSel(0,-1);/选中IDC_EDIT1中的内容m_Edit1.ReplaceSel();/用空串代替所选文本,即把所选的文本删除,83,void CMy9_5Dlg:OnShow2Button()m_Edit2.SetSel(0,-1);m_Edit2.ReplaceSel(This is the second EditBox.);void CMy9_5Dlg:OnClear2Button()m_Edit2.SetSel(0,-1
43、);m_Edit2.ReplaceSel();,(3)给Show2和Clear2按钮连接代码,84,(4)给按钮IDC_Transfer_BUTTON连接代码,void CMy9_5Dlg:OnTransferButton()m_Edit1.SetSel(0,-1);m_Edit1.Copy();m_Edit2.SetSel(0,-1);m_Edit2.ReplaceSel();m_Edit2.Paste();,85,(5)给 Undo按钮连接代码,void CMy9_5Dlg:OnUndoButton()m_Edit1.Undo();m_Edit2.Undo();,(6)给Exit按钮连接代
44、码,void CMy9_5Dlg:OnExitButton()OnOK();,86,【例9-6】“乘法器”示例程序,使用者在“乘数”或者“被乘数”编辑框中输入数字的时候,程序可以随时计算乘法的结果,IDTypeMemberRead-onlyNumberIDC_EDIT_MUL1intm_A IDC_EDIT_MUL2intm_B IDC_EDIT_RESULT CString m_Result,87,初始化结果编辑框BOOL CMy9_6Dlg:OnInitDialog()CDialog:OnInitDialog();/TODO:Add extra initialization hereUpd
45、ateData(TRUE);/从窗口中读入和各控件连接的变量的值int i=m_A*m_B;m_Result.Format(%d,i);UpdateData(FALSE);/刷新屏幕return TRUE;,88,(2)当编辑框中的内容发生改变时,会产生EN_CHANGE消息,需要为乘数与被乘数两个编辑框响应该消息 void CMy9_6Dlg:OnChangeEditMul1()UpdateData(TRUE);int i=m_A*m_B;m_Result.Format(%d,i);UpdateData(FALSE);void CMy9_6Dlg:OnChangeEditMul2()Upda
46、teData(TRUE);int i=m_A*m_B;m_Result.Format(%d,i);UpdateData(FALSE);,89,(3)响应Reset按钮的消息 void CMy9_6Dlg:OnReset()m_A=0;m_B=0;int i=m_A*m_B;m_Result.Format(%d,i);UpdateData(FALSE);,90,一个控件可以根据需要连接多种类型的变量。一个编辑框连接2个变量的例子:判断合法用户void CExamDlg:OnOK()/TODO:Add extra validation hereUpdateData(true);/更新控件值变量if
47、(m_user.IsEmpty()/检查用户名不能为空 AfxMessageBox(用户名不能为空,请输入);m_EditUser.SetFocus();/焦点返回用户名输入框 else if(m_pwd.IsEmpty()/检查密码不能为空 AfxMessageBox(密码不能为空,请输入);m_EditPwd.SetFocus();/焦点返回密码输入框,91,else/检查密码长度必须为6位 int len=m_EditPwd.LineLength();/取得密码长度 if(len!=6)AfxMessageBox(密码必须为6位,请重新输入);m_EditPwd.SetFocus();e
48、lse/核对用户名和密码是否合法 if(m_user=userlist),92,9.7 组合框控件,93,9.7.1 组合框(CComboBox)类的结构及组合框的特点,组合框是两种预定义窗口的组合形式。在Windows编程中使用单一控件往往不能完全满足于用户交互的需要,最常见的组合框例子是对话框及与其相联系的静态文本和编辑框。,94,9.7.2 组合框与应用程序间消息传递,组合框通过向其父窗口发关WM_COMMAND消息通知应用程序用户的交互信息。应用程序对组合框的操作也通过使用函数SendMessage或SendDlgItemMessage向组合框发送消息进行。对组合框的操作实际上是对组合
49、框中各成员的操作。,95,9.7.3 组合框控件应用举例,【例9-7】本例创建组合框控件,当单击向下按钮时,显示可选文件的名字。当选中某一项时,显示该项的名称,96,组合框分3种普通组合框:显示一个编辑控件和一个列表框。下拉式组合框:隐藏列表框,直到用户打开它。下拉列表框:直到用户打开时才显示列表框,用户只能从列表框中选择选项,不允许用户输入。在组合框控件上选择Drop List风格。单击三角按纽,出现一个虚框,虚框的大小决定程序运行时下拉列表框的大小,用鼠标拖动中间的小方框,可以调整虚框的大小。对于普通组合框,当用户选择的内容发生改变的时候,会产生CBN_SELECTCHANGE消息。对于下
50、拉列表框,当用户选择的内容发生改变的时候,会产生CBN_SELENDOK消息。本例中是普通组合框,97,1)组合框一般连接ComboBox类型的变量2)给组合框装载选项:可以在OnInitDialog()函数中使用m_xx.AddString(“85”);的方法来装载选项,还可以打开组合框的属性表(右击控件,选Properties)选Data标签,输入组合框的选项,添加第一个选项后,按Ctrl+Enter换行输入第二个选项。如果同时使用这两种方法装载选项,选中Sort属性,插入的内容将按照字母顺序排序,否则,从Data标签添加的选项排在前面。3)设置初值:在OnInitDialog()函数中使