1.32k likes | 1.51k Views
第 9 章 Windows 控件. 9.1 Windows 标准控件. 控件工具栏. 打开对话框编辑器就会出现控件工具栏. 控件接受的消息 主要有单击、双击 和字符输入等. 9.1.1 控件的创建 9.1.2 控件的管理 9.1.3 控件的通用属性. 9.1.4 常用控件窗口操作函数 Windows 应用程序对控件的操作实质上是对窗口的操作,对话框窗口中的控件被视为对话框窗口的子窗口,具有通用的窗口属性,所以控件的操作还可以通过一组窗口操作函数来完成。 常用的控件子窗口操作函数如下: 1 .CreateWindow() 或 CreateWindowEx()
E N D
9.1 Windows标准控件 控件工具栏 打开对话框编辑器就会出现控件工具栏 控件接受的消息 主要有单击、双击 和字符输入等
9.1.1控件的创建 9.1.2控件的管理 9.1.3控件的通用属性
9.1.4常用控件窗口操作函数 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() 通过函数MoveWindow()可以移动控件或改变控件的大小。函数原型为: BOOL MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint=TRUE) 坐标x,y决定控件所在的位置,nWidth和nHeight分别表示控件的宽度和高度,决定控件的大小,bRepaint表明对话框窗口移动后,控件是否需要重画,以使其与对话框窗口的相对位置与大小保持不变。 5.DestoryWindow() 通过该函数能够关闭一个控件,函数原型为: Void DestoryWindow() 6.CheckDlgButton() 该函数用来设置按钮的选择状态。函数原型为: CheckDlgButton(int nIDButton, UINT nCheck) nIDButton是按钮的ID。nCheck取值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态。
7.CheckRadioButton() 该函数用来选择单选按钮组中的一个单选按钮。函数原型为: CheckRadioButton(int nIDFirstButton, int nIDLastButton,int nIDCheckButton) nIDFirstButton指定按钮组中第一个按钮的ID。nIDLastButton指定按钮组中最后一个按钮的ID。nIDCheckButton指定要选择的按钮的ID。 8.GetCheckedRadioButton() 该函数用来获得一组单选按钮中被选中按钮的ID。函数原型为 int GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton) nIDFirstButton是单选按钮组中第一个按钮的ID。nIDLastButton是单选按钮组中最后一个按钮的ID。函数返回值为被选中按钮的ID。 9.IsDlgButtonChecked() 该函数返回检查框或单选按钮的选择状态。函数原型为: int IsDlgButtonChecked(int nIDButton) 返回值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态(仅用于检查框)。
10.SetWindowText() 该函数用来设置按钮中显示的正文。函数原型为: SetWindowText(LPCTSTR lpszString) 此函数设置窗口标题为指定的内容,参数lpszString为指向新标题的指针。 例如 m_btn2是一个按钮对象 m_btn2.SetWindowText(“按钮已被按下!”); 11.GetWindowText() 函数GetWindowText()用来查询按钮中显示的正文, GetWindowText(CString& rString) 参数rString为接收窗口标题文本的CString对象的引用。 12.GetWindowTextLength() 函数GetWindowTextLength()用来查询按钮中显示的正文长度。函数原型为: int GetWindowTextLength()
9.2静态控件及其应用 静态控件的有:静态文本(Static Text)、组框(Group Box)和静态图像(Picture)三种。 9.2.1静态文本控件 用户能添加到对话框中的最简单控件是静态文本控件。静态文本控件不要求与对话框进行交互,需要显示的文本只要在该控件属性对话框的General标签中的Capion属性中直接输入。 9.2.2组框控件 组框的外形为左上角包含文字的矩形框,组框是一种特殊的按钮形式,虽然它属于按钮类控件,但组框既不处理鼠标和键盘输入,也不向其父窗口发送消息,实际上没有太多的操作,只是用于在窗口中对特定的区域划分范围,并把相同属性的数据划分在一起并加以说明,使窗口简洁明了。
9.2.3静态图像控件 在静态图像控件的常规属性对话框中,用户可以选择图像“类型”、“颜色”两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图像控件中。用户还可设置其样式来改变控件的外观以及图像在控件的位置等。另外,静态图像控件还可用来在对话框中形成一个水平或垂直蚀刻线,蚀刻线可起到分隔其它控件的作用。
【例9-1】开发一个使用静态图像控件的程序,在对话框中创建一个水平蚀刻线和两个图像,如图9-10所示。【例9-1】开发一个使用静态图像控件的程序,在对话框中创建一个水平蚀刻线和两个图像,如图9-10所示。 实现步骤如下: (1)用应用程序向导生成一个基于对话框的应用程序ex9_1。 (2)在打开的对话框资源模板中,将“确定”和“取消”按钮向对话框左边移动一段位置,然后将鼠标移至对话框资源模板右下角的实心蓝色方块处,拖动鼠标,将对话框资源模板的大小缩小一些。
(3)在对话框资源模板中间位置添加一个静态图像控件,右击该控件,从弹出的快捷菜单中选择“属性”,弹出其属性对话框。在“类型”下拉列表框中选择默认的“框架(Frame)”,在“颜色”下拉列表框中选择“蚀刻(Etched)”,然后关闭属性对话框。此时,静态图像控件变成一个蚀刻的矩形框。将鼠标移动到添加的静态图像控件的右下角位置,使鼠标指针变成十字型,拖动鼠标使控件的大小变成一条水平线。(3)在对话框资源模板中间位置添加一个静态图像控件,右击该控件,从弹出的快捷菜单中选择“属性”,弹出其属性对话框。在“类型”下拉列表框中选择默认的“框架(Frame)”,在“颜色”下拉列表框中选择“蚀刻(Etched)”,然后关闭属性对话框。此时,静态图像控件变成一个蚀刻的矩形框。将鼠标移动到添加的静态图像控件的右下角位置,使鼠标指针变成十字型,拖动鼠标使控件的大小变成一条水平线。 (4)在对话框资源模板中靠左位置添加一个静态图像控件,右击该控件,从弹出的快捷菜单中选择“属性”,弹出其属性对话框。将Type属性设置为Icon或者Bitmap的时候,可以设置lmage属性为相应的资源ID,来显示一幅图标或者位图。我们在资源中导人一幅位图,命名为IDB_BITMAP_DOT,设置新加的Picture控件的Type为Bitmap,Image设置为BITMAP_DOT,见图9-10中左上角的图像。 (5)在对话框资源模板中靠右位置添加一个静态图像控件,在其常规属性对话框中,将其“类型”选择为“图标(Icon)”,再将其“图像”选择为IDR_MAINFRAME,则静态图像控件显示出图标,见图9-10中右上角的图像。
9.3按钮控件 9.3.1按钮控件的种类及消息 按钮控件的类型比较丰富,其中主要有命令按钮、单选按钮、复选框按钮。这三类按钮之间无论在外观还是在使用上都有较大的差异,但 MFC 中使用了一个类 CButton来封装这三种不同控件。 常用消息: BN_CLICKED 单击按钮 BN_DOUBLECLICKED 双击按钮
9.3.2按钮控件的成员函数 这些是CButton类的成员函数,它们必须通过对象或指向对象的指针来引用。 对象.函数(参数) 对象—>函数(参数) GetCheck( ) SetCheck( ) GetBitmap() SetBitmap() GetButtonStyle() SetButtonStyle() GetCursor() SetCursor() GetIcon() SetIcon() GetState() SetState()
CButton类是CWnd类的派生类,在知道按钮ID的前提下,还可使用与按钮有关的CWnd成员函数来设置或查询按钮状态 ,当然调用的语句也应该是 对象.函数(参数) CheckDlgButton CheckRadioButton GetCheckedRadioButton IsDlgButtonChecked GetWindowTex GetWindowTextLength SetWindowText
9.3.3命令按钮 【例9-2】开发一个基于对话框的应用程序,界面如图9-12所示。当单击第一个按钮时,按钮上的文字“这里是一个命令按钮,按我吧!”就变成“命令按钮已被按下!”,第二个按钮标记为“这里是一个默认按钮,按下试试看!”,按下此按钮后,按钮的标记信息就变成“默认按钮已被按下!”。
主要步骤如下: (1)用应用程序向导生成一个基于对话框的应用程序ex9_2。 (2)设计界面: 将对话框上默认的控件删除干净,添加2个命令按钮,然后设置控件在对话框中的位置和大小,设置控件的标题属性,它们的ID号使用系统设置的默认值IDC_BUTTON1和 IDC_BUTTON2。 (3)要设置IDC_BUTTON2为默认按钮,就是要设置IDC_BUTTON2的tab order为所有控件中的第一个。在资源编辑器中选择Layout菜单下的Tab Order菜单项,按顺序点击控件,会更改控件的tab顺序。要设置第二个按钮为默认的,则首先点击第二个按钮,通过tab order可以修改一组按钮控件的先后顺序(不是位置顺序,而是响应顺序)。 (4)为控件连接变量,即在对话框类中添加数据成员。为两个按钮分别连接CButton 型变量m_Button1和 m_Button2。 在Add Member Variable对话框的Category列表框中选择要连接的变量种类。如果要在消息响应函数代码中调用某个控件类的成员函数,要连接control类型的变量。如果要在消息响应函数代码中使用用户的选择或用户输入的值,要连接value类型的变量。
(5)对命令按钮进行消息映射。可以通过类向导为按钮添加消息处理函数,也可以在对话框编辑器中双击按钮控件来添加消息处理。在对话框类中添加2个消息响应函数OnButtonl()和OnButton2(),分别响应这2个命令按钮的单击消息。(5)对命令按钮进行消息映射。可以通过类向导为按钮添加消息处理函数,也可以在对话框编辑器中双击按钮控件来添加消息处理。在对话框类中添加2个消息响应函数OnButtonl()和OnButton2(),分别响应这2个命令按钮的单击消息。 消息处理代码如下 void CEx9_2Dlg::OnButtonl(){ //TODO:Add your control notification handler code here m_Button1.SetWindowText("命令按钮已被按下!"); //对象.设置窗口文本(“…”) } void CEx9_2D1g::OnButton2(){ //TODO : Add your control notification handler code here m_Button2.SetWindowText("默认按钮已被按下!"); }
9.3.4单选按钮 对于成组的单选按钮,只在每组的第一个按钮的属性中选中Group选项。每个设置Group风格的按钮和接下来没有设置Group风格的按钮为一组。下一个设置了Group风格的按钮为新一组的开始。一组内的多个radio之间是互斥的,也就是说任何时候只有一个单选按钮可以被选中。 在设计的过程中,同一组单选按钮必须一个接一个地放进对话框中,中间不能插入其它的控件,因为Visual C++按照放入对话框中的先后顺序,给每个控件赋一个ID值,所以连续放入的控件的ID值是连续的。如果ID值不连续,只能删掉,然后重新加入单选按钮到对话框中。 可以从resource.h的资源头文件中得到ID值,
Auto风格的单选按钮会自动响应单击消息,在所选项的前面加点,同时去掉同组中其它单选按钮前面的点,所以,Auto风格的单选按钮可以不连接变量,如果需要调用CButton类的成员函数,就要给每个单选按钮连接CButton型变量。单选按钮也可以连接int型的变量,连接整型变量时,每一组单选按钮中只有第一个按钮可以赋予变量名,其它的单选按钮不能获得变量名,而且变量的值为所选选项的下标。一般要在某个控件的消息响应函数代码中根据单选按钮当前的选项做出不同反应。Auto风格的单选按钮会自动响应单击消息,在所选项的前面加点,同时去掉同组中其它单选按钮前面的点,所以,Auto风格的单选按钮可以不连接变量,如果需要调用CButton类的成员函数,就要给每个单选按钮连接CButton型变量。单选按钮也可以连接int型的变量,连接整型变量时,每一组单选按钮中只有第一个按钮可以赋予变量名,其它的单选按钮不能获得变量名,而且变量的值为所选选项的下标。一般要在某个控件的消息响应函数代码中根据单选按钮当前的选项做出不同反应。
【例9-3】有三个Auto风格的单选按钮组成的一个单选按钮组,分别是“汉族”“回族”“少数民族”,单击OK按钮时,则弹出一个消息框显示选中的民族,如图9-16所示。【例9-3】有三个Auto风格的单选按钮组成的一个单选按钮组,分别是“汉族”“回族”“少数民族”,单击OK按钮时,则弹出一个消息框显示选中的民族,如图9-16所示。 控件在可视化编程中的应用主要步骤: 1、创建基于对话框项目 2、设计界面 3、添加成员变量 4、添加消息响应代码 前两步也叫做应用程序的可视化编程部分 后两步也叫做应用程序的代码编程部分
首先创建基于对话框的项目ex9_3,然后设计界面。接下来要给按钮连接变量,根据单选按钮是否连接了变量,有两种处理方法。首先创建基于对话框的项目ex9_3,然后设计界面。接下来要给按钮连接变量,根据单选按钮是否连接了变量,有两种处理方法。 方法一: (1)每个单选按钮都不连接变量。 (2)OnInitDialog()函数中添加代码如下: CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO2); //设置第2项被选中
(3)对OK按钮添加消息响应函数OnOK(),并在消息响应函数中添加代码:(3)对OK按钮添加消息响应函数OnOK(),并在消息响应函数中添加代码: void CEx9_3Dlg::OnOK () { //TODO:Add your control notification handler code here CString cs; int iRADIO; //存放民族单选按钮组的选中项的ID值 iRADIO=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3); if(iRADIO==IDC_RADIO1) { cs=" 汉族" ; } else if(iRADIO==IDC_RADIO2) { cs="回族"; } else {cs="少数民族" ;} AfxMessageBox(cs ); } 或者 CString cs; if (IsDlgButtonChecked(IDC_RADIO1)) { cs="汉族"; } else if (IsDlgButtonChecked(IDC_RADIO2)) { cs="回族" ; } else {cs=" 少数民族"; }
方法二: (1)给第一个单选按钮连接int型的变量m_radio。 (2)OnInitDialog()函数中添加代码如下: m_radio=1; //设置第2项被选中(下标为1) UpdateData(FALSE); (3)对OK按钮添加消息响应函数OnOK(),并添加代码: void CEx9_3Dlg::OnOK () { //TODO:Add your control notification handler code here UpdateData(TRUE); CString cs; if (m_radio==0) { cs=" 汉族"; } else if(m_radio==1) { cs=" 回族"; } else {cs=" 少数民族"; } AfxMessageBox(cs ); } 控件连接的变量为int类型、CString和BOOL类型时,一般先用UpdateData(TRUE); 从窗口中读入和各控件连接的变量,然后对变量进行修改,最后用UpdateData(FALSE); 刷新屏幕。
9.3.5复选按钮 复选按钮与单选按钮一样,是Windows提供的另一种形式的按钮。使用复选按钮,可以从一组选项中选择一个选项或多个选项,各个选项之间的选中状态互不相关。如果设置了auto风格,复选按钮会自动响应点击消息,设置按钮的状态。否则开发者需要响应按钮的点击消息,并自行设置按钮的状态。 在程序中需要根据复选框是否选中做出不同的处理。复选框可以不连接变量,也可以连接BOOL型变量,还可以连接CButton型变量。
【例9-4】有一个党员复选框,如果该复选框处于选中状态,单击OK按钮时,则弹出一个消息框,显示“党员”,否则消息框中显示“不是党员”。如图9-17所示。【例9-4】有一个党员复选框,如果该复选框处于选中状态,单击OK按钮时,则弹出一个消息框,显示“党员”,否则消息框中显示“不是党员”。如图9-17所示。 首先创建基于对话框的项目ex9_4,然后设计界面。接下来要给按钮连接变量,根据复选框连接的变量类型不同,有三种处理方法。
方法一: (1)为复选框连接一个value类型的变量m_bcheck用于传递数据,该变量的值是BOOL型,值为true时表示选中复选框,值为false时表示未选中复选框。 (2)设置复选框初始状态为选中,在OnInitDialog()函数中添加代码如下: m_bcheck=TRUE; UpdateData(FALSE);
(3)对OK按钮添加消息响应函数OnOK(),并在消息响应函数中添加代码:(3)对OK按钮添加消息响应函数OnOK(),并在消息响应函数中添加代码: void Ctestl9_4Dlg::OnOK () { //TODO:Add your control notification handler code here UpdateData(TRUE); CString cs; if (m_bcheck==TRUE) { cs="党员"; } else { cs="不是党员"; } AfxMessageBox(cs );//MessageBox }
方法二: (1)复选框不连接变量。 (2)在OnInitDialog()函数中设置复选框初始状态为选中,添加代码如下: CheckDlgButton(IDC_CHECK,1); (3)对OK按钮添加消息响应函数OnOK(),并在消息响应函数中添加代码: void CEx9_4Dlg::OnOK () { //TODO:Add your control notification handler code here CString cs; if (IsDlgButtonChecked(IDC_CHECK)) { cs="党员"; } else { cs="不是党员"; } AfxMessageBox(cs ); }
方法三: (1)给复选框连接CButton型变量m_check。 (2)OnInitDialog()函数中添加代码如下: m_check.SetCheck(1); (3)对OK按钮添加消息响应函数OnOK()并在消息响应函数中添加代码: void CEx9_4Dlg::OnOK () { //TODO:Add your control notification handler code here CString cs; if(m_check.GetCheck()) { cs="党员"; } else { cs="不是党员" ; } AfxMessageBox(cs ); }
9.4编辑框控件 9.4.1编辑框属性 9.4.2编辑框类的成员函数
9.4.4编辑框控件的使用 编辑框控件可以连接的变量有3种: (1)需要调用CEDIT类的方法时要给编辑框连接CEdit类型的变量; (2)在编辑框中要放整数时连接int类型的变量; (3)在编辑框中要输入或输出字符串时连接CString类型的变量;比如需要输入学生的姓名,输入之后把姓名放到数据库或数组中,不需要调用CEdit类的成员函数,此时就连接CString类型变量。 编辑框主要用于下面3种情况:
(1)用于字符串输入 例如,单击OK按钮时,将编辑框中输入的内容显示到消息框中,那么OK按钮的消息响应函数中添加代码有两种写法。 如果编辑框连接了CEDIT类变量m_edit,代码编写如下: char str[10]; m_edit.GetwindowText(str,10);//10为字节数,将编辑框的内容放到字符串变量str中 AfxMessageBox(str); 如果连接了CString类变量cs,代码编写如下: UpdateData(TRUE); AfxMessageBox(cs );
_T(“Hello”)是一个宏,作用是让程序支持Unicode编码,因为Windows使用两种字符集ANSI和UNICODE,前者是通常使用的单字节方式,而后者是双字节方式,方便处理双字节字符,如中文。_T(“Hello”)是一个宏,作用是让程序支持Unicode编码,因为Windows使用两种字符集ANSI和UNICODE,前者是通常使用的单字节方式,而后者是双字节方式,方便处理双字节字符,如中文。 (2)用于字符串输出 例如,单击OK按钮时,将字符串“ABC”显示到编辑框中,那么OK按钮的消息响应函数中添加代码有两种写法。 如果编辑框连接了CEDIT类变量m_edit,代码编写如下: m_edit.SetSel(0,-1); m_edit.ReplaceSel("ABC"); 如果编辑框连接了CString类变量cs,那么要给cs赋值,然后使用UpdateData(FALSE);语句去更新,代码编写如下: char s[10];strcpy(s,"ABC");cs=_T(s); //以上三条语句相当于cs=_T("abc"); UpdateData(FALSE); 或者 CString cs; cs.Format("ABC"); UpdateData(FALSE);
(3)用于数值的输入、输出 例如,单击OK按钮时,将编辑框中数值加一,假设编辑框连接的是int类型的变量m_i,那么OK按钮的消息响应函数中添加代码如下: UpdateData(TRUE); m_i++; UpdateData(FALSE); 连接的变量为int类型和CString类型时,一般先用UpdateData(TRUE); 从窗口中读入和各控件连接的变量,然后对变量进行修改,最后用UpdateData(FALSE); 刷新屏幕。 在编辑框中仅需要显示一个字符串,不对其修改,连接CString类型或CEDIT类的变量都行。一个控件可以根据需要连接多种类型的变量。
9.4.5编辑框编程实例 【例9-5】编写基于对话框的应用程序,其窗口布局如图9-19所示。在程序主窗口中有两个编辑框,分别为姓名Edit1、学号Edit2、备注Edit3和总信息Edit4,Edit3为多行编辑框,其余3个为单行编辑框,单击OK按钮时,将输入的姓名、学号和备注内容在总信息编辑框中显示出来。主窗口中还有Cut、Copy、Paste、Clear All、Undo和Exit6个按钮,分别完成从一个编辑框到另一个编辑框相应操作。若单击Cut按钮,则剪切当前编辑框的内容;若单Copy击按钮,则复制当前编辑框的内容;若单击Paste按钮,则将剪贴板的内容复制到当前编辑框;单击Clear All 按钮,则两个编辑框中的内容都被清除;单击Undo按钮,则取消编辑框中的上一次操作,再单击一次Undo按钮,又显示刚才的内容;若单击Exit按钮,则退出程序的运行。
(1)用应用程序向导生成一个基于对话框的应用程序ex9_5。(1)用应用程序向导生成一个基于对话框的应用程序ex9_5。 (2)按照图9-19设置窗口界面。添加控件,然后设置控件在对话框中的位置和大小,设置控件的标题属性,并将备注编辑框设置为多行编辑框。总信息编辑框设置为只读。 (3)为各个控件连接变量如表9-7所示。 (4)在ex9_5Dlg.h中添加公有成员变量,代码如下: int editFlag; //EDIT1获得输入焦点时,editFlag的值为1,依此类推,clear all 之后editFlag的值为4,OK之后editFlag的值为5 int oldEditFlag; //原来的editFlag的值
(5)在对话框的初始化函数OnInitDialog()中添加代码如下:(5)在对话框的初始化函数OnInitDialog()中添加代码如下: BOOL CEx9_5Dlg::OnInitDialog() { // TODO: Add extra initialization here UpdateData(TRUE); editFlag=0; oldEditFlag=0; return TRUE; // return TRUE unless you set the focus to a control }
(6)为Button1的BN_CLICKED消息添加消息响应函数OnButton1(),并在该函数下添加代码如下:(6)为Button1的BN_CLICKED消息添加消息响应函数OnButton1(),并在该函数下添加代码如下: void CEx9_5Dlg::OnButton1() { // TODO: Add your control notification handler code here switch(editFlag) { case 0: AfxMessageBox("No Focus Here"); break; case 1: m_Edit1.SetSel(0,-1); m_Edit1.Cut(); break; case 2: m_Edit2.SetSel(0,-1); m_Edit2.Cut(); break; case 3: m_Edit3.SetSel(0,-1); m_Edit3.Cut(); break; default: AfxMessageBox("Flag Error"); } }
(7)为Button2的BN_CLICKED消息添加消息响应函数OnButton2(),并在该函数下添加代码如下:(7)为Button2的BN_CLICKED消息添加消息响应函数OnButton2(),并在该函数下添加代码如下: void CEx9_5Dlg::OnButton2() { // TODO: Add your control notification handler code here switch(editFlag) { case 0: AfxMessageBox("No Focus Here"); break; case 1: m_Edit1.SetSel(0,-1); m_Edit1.Copy(); break; case 2: m_Edit2.SetSel(0,-1); m_Edit2.Copy(); break; case 3: m_Edit3.SetSel(0,-1); m_Edit3.Copy(); break; default: AfxMessageBox("Flag Error"); } }
(8)为Button3的BN_CLICKED消息添加消息响应函数OnButton3(),并在该函数下添加代码如下:(8)为Button3的BN_CLICKED消息添加消息响应函数OnButton3(),并在该函数下添加代码如下: void CEx9_5Dlg::OnButton3() { // TODO: Add your control notification handler code here switch(editFlag) { case 0: AfxMessageBox("No Focus Here"); break; case 1: m_Edit1.SetSel(0,-1); m_Edit1.ReplaceSel(""); m_Edit1.Paste(); break; case 2: m_Edit2.SetSel(0,-1); m_Edit2.ReplaceSel(""); m_Edit2.Paste(); break; case 3: m_Edit3.SetSel(0,-1); m_Edit3.ReplaceSel(""); m_Edit3.Paste(); break; default: AfxMessageBox("Flag Error"); } }
(9)为Button4的BN_CLICKED消息添加消息响应函数OnButton4(),并在该函数下添加代码如下:(9)为Button4的BN_CLICKED消息添加消息响应函数OnButton4(),并在该函数下添加代码如下: void CEx9_5Dlg::OnButton4() { // TODO: Add your control notification handler code here m_Edit1.SetSel(0,-1); m_Edit2.SetSel(0,-1); m_Edit3.SetSel(0,-1); m_Edit1.Clear(); m_Edit2.Clear(); m_Edit3.Clear(); CString csBlank; m_Edit4.SetWindowText(csBlank); editFlag=4; }
(10)为Button5的BN_CLICKED消息添加消息响应函数OnButton5(),并在该函数下添加代码如下:(10)为Button5的BN_CLICKED消息添加消息响应函数OnButton5(),并在该函数下添加代码如下: void CEx9_5Dlg::OnButton5() { // TODO: Add your control notification handler code here CString csBlank; CString oldCS1; static CString oldCS2; switch(editFlag) { case 0: AfxMessageBox("No Focus Here"); break; case 1: m_Edit1.Undo(); break; case 2: m_Edit2.Undo(); break; case 3: m_Edit3.Undo(); break; case 4: m_Edit1.Undo(); // clear all 之后editFlag值为4 m_Edit2.Undo(); m_Edit3.Undo(); break;
case 5: //ok之后undo,需要清除总信息,如果再次undo还要恢复总信息 m_Edit4.GetWindowText(oldCS1); if(oldCS1!="") {m_Edit4.SetWindowText(csBlank);oldCS2=oldCS1; } else m_Edit4.SetWindowText(oldCS2); break; default: AfxMessageBox("Flag Error"); } } (11)为Button6的BN_CLICKED消息添加消息响应函数OnButton6(),并在该函数下添加代码如下: void CEx9_5Dlg::OnButton6() { // TODO: Add your control notification handler code here OnOK();}