1、,第11章 制作含编辑框的应用程序,编辑框在Windows风格的应用程序中是随处可见的,当需要获得来自用户的文本信息,或者要让用户输入或编辑文本时,应该使用编辑控件。,编辑框控件,单行编辑框控件多行编辑框控件,11.1 编辑框控件简介编辑框控件具有许多功能,Windows中的 记事本(Notepad)应用程序就是一个带有控件 菜单的编辑控件。,编辑框控件类CEdit的结构很复杂,当创建CEdit对象时, MFC自动赋予该对象一个标准的Windows编辑控件,它定 义了CEdit对象。,Afxwin.h,class CEdit : public CWnd, DECLARE_DYNAMIC(CEd
2、it),/ 定义构造函数,public:,CEdit();,BOOLCreate(DWORD dwStyle, const RECT& rect, CWnd*,pParentWnd, UINT nID);,/ 定义成员函数,BOOLCanUndo() const; int GetLineCount() const; BOOLGetModify() const;,void SetModify(BOOLbModified = TRUE); void GetRect(LPRECT lpRect) const; DWORD GetSel() const;,void GetSel(int,void Se
3、tHandle(HLOCALhBuffer);,#if (WINVER = 0x400),void SetMargins(UINT nLeft, UINT nRight);DWORD GetMargins() const;void SetLimitText(UINT nMax);UINT GetLimitText() const;,CPoint PosFromChar(UINT nChar) const;int CharFromPos(CPoint pt) const;,#endif,/ NOTE: first word in lpszBuffer must contain the size
4、of the buffer!,int GetLine(int nIndex, LPTSTR lpszBuffer) const;,int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const;,/ 操作,void EmptyUndoBuffer();,BOOLFmtLines(BOOLbAddEOL); void LimitText(int nChars = 0);,int LineFromChar(int nIndex = -1) const; int LineIndex(int nLine = -1) const; int
5、 LineLength(int nLine = -1) const;,void LineScroll(int nLines, int nChars = 0);,void ReplaceSel(LPCTSTR lpszNewText, BOOLbCanUndo = FALSE); void SetPasswordChar(TCHAR ch); void SetRect(LPCRECT lpRect); void SetRectNP(LPCRECT lpRect);,void SetSel(DWORD dwSelection, BOOLbNoScroll = FALSE);,void SetSel
6、(int nStartChar, int nEndChar, BOOLbNoScroll = FALSE); BOOLSetTabStops(int nTabStops, LPINT rgTabStops); void SetTabStops();,BOOLSetTabStops(const int / takes an int,/ 剪贴板操作,BOOLUndo(); void Clear(); void Copy(); void Cut();,void Paste();,BOOLSetReadOnly(BOOLbReadOnly = TRUE); int GetFirstVisibleLin
7、e() const;,TCHAR GetPasswordChar() const;,/ Implementation public:,virtual CEdit(); /虚拟析构函数,;,表 11-1 通用 CEdit 类的方法,表 11-2 多行编辑所支持的 CEdit 法,应用程序的窗口布局如图所示。功能如下:,11.2编辑控件的应用,单击Showl,则在Edit1编辑框中显示“This is the first EditBox.”;单击Clear1,则Edit1编辑框中的内容被清除;,单击Show2,则在Edit2编辑框中显示“This is the secondEditBox!”;,单
8、击Clear2,则Edit2编辑框中的内容被清除;,单击Transfer,则把Edit1编辑框的内容复制到Edit2的编辑框中去;,单击Undo,则取消上一次操作;若单击Exit,则退出程序的运行。,具体的编程过程 1建立工程文件2. 可视化编程,因为本应用程序是基于对话框的,由向导生成对话框窗口作为应用程序的主窗口,并且给这个对话框取名为IDD_EDITBOX_DIALOG,然后在这个对话框窗口中进行界 面 设 计。生成了工程文件和 工程工作区文件后 在EditBox的工作区 中选择ResourceView,在ResourceView选项卡中打开Dialog资源组,然后双击 IDD_EDIT
9、BOX_DIALOG。,VC在工作台中显示可以进行可视化编辑的IDD_EDITBOX_DIALOG对 话框,把鼠标停在编辑框 控件上,即可显示,该控件的类型,控件工具窗提供了VC中 所有可建立的控件类型,利用控件窗口中的编 辑框控件,在对话框 中布置如右图所示的 编辑框,将鼠标移到Edit1编辑 框上 单击鼠标右键 ,(在快捷菜单中)选择 Properties命令, 在窗口中输入控件的ID 标识值,IDC_EDIT1, 用同样的方法设置其它 各个对象的属性,(b) 在Control Ids列表框中单击IDC_EDIT1项,使之高亮化,3. 应用程序的代码编程部分给编辑框连接变量 把鼠标移到编辑
10、框EDIT1上,单击鼠标右键,在弹出的快捷菜 单中选择ClassWizard命令,此时显示一个ClassWizard对话框。(a)选择Member Variables选项卡(c) 单击Add Variable按钮,此时显示,Add MemberVariable窗口,设置成员变量名为m_Edit1,类别为Control,变量类型为CEdit注意,不要将m_Edit1设为CString类型,因为只有设为CEdit 类型,才能够调用CEdit类中的一些成员函数,,如Copy () , Paste () 等,这样才能完成本应用程序中对Transfer按钮要求复制内容的操作的响应。,用同样的方法给编辑框
11、EDIT2等其它对象连接各自的变量,增加变量之后MFC ClassWizard窗口将变为下图所示。,若此时运行该程序,在Edit文本框中不能进行多行输入,只能单行输入文本,而且按回车键终止应用程序,同时,文本框中也没有水平和垂直滚动条。,下面,我们来完善应用程序中编辑框的特性,使之能够进,行多行文本的输入。,在编辑框EDIT1,单击 鼠标 右键,在快捷菜单中选 Properties命令,选Styles 选项卡,可进行多行输入,增加水平及垂直滚动条,如果不选择这 一项的话,在,编辑框中按回 车键就会终止 应用程序,若,选此项,按回 车键就可进行 下一行的输入,,实现多行文本 的输入,4 . 修改
12、编辑框的特性,5. 添加代码,1. 在按钮Showl上单击鼠标右键,在,弹出的快捷菜单中选择ClassWizard,3.选择BN_CLICKED项,4.单击,2. 选择IDC_SHOW1_BUTTON项5.在弹出的AddMember Function中接受建议的函数名OnShow1Button()6.Member functions 列表框中增加了成员 函数OnShow1Button()7.单击,void CEditBoxDlg:OnShow1Button(),m_Edit1.SetSel(0,-1);/选中编辑框IDC_EDIT1中的全部内,容,m_Edit1.ReplaceSel(“Thi
13、s is the first,EditBox.”); ,程序中SetSel()函数是CEdit类中的成员函数,因为m_Edit1 是属于CEdit类的对象,故可以调用该类所有的成员函数。 ReplaceSel()函数也是CEdit类中成员函数。,(1) 给Showl按钮连接代码,(2) 给 Clear1按钮连接代码,Void CEditBoxDlg:OnClearlButton(),m_Editl.SetSel(0,-1);/表示选中编辑框IDC_EDIT1中的全部内容,m_Editl.ReplaceSel(“);/用空字符串代替所选中的文本,即把所选的文本删除掉/ 代码编写结束,(3)给Sh
14、ow2和Clear2按钮连接代码 Void CEditBoxDlg:OnShow2Button(),m_Edit2.SetSel(0,-1);表示选中编辑框IDC_EDIT2中的全部内容,m_Edit2.ReplaceSel(“This is the second EditBox.“);/用新的文本代替所有原有的文本Void CEditBoxDlg:OnClear2Button()m_Edit2.SetSel(0,-1);/表示选中编辑框IDC_EDIT2中的全部内容m_Edit2.ReplaceSel(“);/用空字符串代替所选中的文本,即把所 选的文本删除掉 ,(4)给按钮IDC_Tran
15、sfer_BUTTON连接代码,void CEditBoxDlg:OnCopyButton(),m_Editl.SetSel(0,-1);,m_Editl.Copy();/将m_Editl编辑框中所选的内容拷贝到剪贴板上m_Edit2.SetSel(0,-1),m_Edit2.ReplaceSel(“);,m_Edit2.Paste();/将剪贴板中的内容粘贴到m_Edit2编辑框中,(5) 给 Undo按钮连接代码,void CEditBoxDlg:OnUndoButton(),m_Edit1.Undo();/ Undo()函数是CEdit类中的成员函数,表示取消编辑框中上一次操作,m_Ed
16、IT2.Undo();/ 编写代码开始,(6) 给Exit按钮连接代码,void CEditBoxDlg:OnOKButton() ,OnOK();,【例】编写一个程序,能够输入学生的信息,包括:“ 学号”、“姓名”、“性别”、“年龄”和所在的系, 并能根据学生的“学号”、“姓名”和系别来进行检索 。当检索到的信息超过一个时,能够依次显示。,下面以“学生信息”组合框、“学号” 静态文本框和编辑框为例进行详细的介绍。,在左图中单击“组合框”按钮,在对话框的 左上角按下鼠标左键并拖动鼠标画出一个大 小合适的组合框,然后在组合框上单击鼠标 右键,在弹出的快捷菜单中选择Properties 菜单项,然
17、后在弹出的Group box,properties对话框中的输入ID值和Caption 属性。,再单击“静态文本”按钮,在“学生信息”组合框中的左上角按 下鼠标左键并拖动鼠标画静态文本框,然后在静态文本框上单击 鼠标右键,在弹出的快捷菜单中选择Properties菜单项,然后在 弹出的Properties对话框中的Caption属性编辑框中输入“学 号”。,再单击“编辑框”按钮,在“学生信息”组合框中的右上角按 下鼠标左键并拖动鼠标画出一个编辑框,然后在编辑框上单击 鼠标右键,在弹出的快捷菜单中选择Properties菜单项,然后 在弹出的Edit Properties对话框中设置编辑框的属性
18、,如下图 所示。,同样在已建立的各个控件上单击鼠标右键,在弹出的菜单中选择 Properties选项,按照从上到下的顺序设置各编辑框对象的属性 如下表所示。最后两列是控件连接的变量。例题中的编辑框及组合框对象的变量及其类型,依照例题要求建立按钮控件,首先删除对话框中的Cancel按钮 和OK按钮。在控件工具栏中单击“按钮”按钮,在窗口的右下 角按下鼠标左键并拖动鼠标画出一个按钮,在按钮上单击鼠标 右键,在弹出的菜单中选择Properties菜单项,此时弹出了一 个Push Button Properties对话框,输入ID和Caption属性。 依次可以绘制其它的下压式按钮。其属性如下表所示。
19、,例题中的按钮对象的属性值,添加变量界面,在文件11-8Dlg.h中的对话框类CMy11-8Dlg定义前,加入记录学生信息的结构体定义:struct student ,CString csCode; CString csName; CString csSex; CString csAge; CString csDept;,/学号 /姓名 /性别 /年龄 /系别,;,在窗口中打开ClassView窗口,在 对话框类CMy11-8Dlg上单击鼠标右 键,在弹出的菜单中选择Add,Member Variables选项(如右图), 在弹出的Add Mmember Variables 对话框中的vari
20、able编辑框中输入 student,在variable name编辑框 中输入structStudent10,这样 就定义了一个能记录10个学生信息 的结构数组。然后采用此种办法加 入变量:int nStudentNum,int nAccordNum,int,nAccordItem10。分别用来记录 以输入学生的数目,检索时符合条 件的学生的数目,符合检索条件的 学生在structstudent10中的位 置。,void CMy11_8Dlg:OnBtnInput() ,UpdateData(TRUE); /从窗口编辑框中读入数据 structStudentnStudentNum.csCod
21、e = m_csCode;,/赋值给学生结构体,structStudentnStudentNum.csName = m_csName; structStudentnStudentNum.csSex = m_csSex; structStudentnStudentNum.csAge = m_csAge; structStudentnStudentNum.csDept = m_csDept; nStudentNum+;,定义函数UpdateData(TRUE)将窗口中编辑框中信息存储到与 编辑框连接的CString型变量中去。然后将这些CString型变量保 存到structStudent数组中。
22、然后变量nStudentNum自增。,void CMy11_8Dlg:OnBtnSearch(), BOOL bAccordCode = FALSE; /设置学号是否符合的变量,BOOL bAccordName = FALSE; /设置姓名是否符合的变量,BOOL bAccordDept = FALSE; /设置所在系名称是否符合的变量 CString csBuffer;,nAccordNum = 0; /符合Search条件的记录个数 UpdateData(TRUE);,for(int i=0;inStudentNum;i+) /从窗口编辑框中读入数据 /学号是否符合.,if(m_csSea
23、rchCode=“|m_csSearchCode=structStudenti.csCode), bAccordCode = TRUE; else bAccordCode = FALSE;,/姓名是否符合.,if(m_csSearchName=“|m_csSearchName=structStudenti.csName), bAccordName = TRUE;,else bAccordName = FALSE;,/系名称是否符合.,if(m_csSearchDept=“|m_csSearchDept=structStudenti.csDept), bAccordDept = TRUE; ,e
24、lse bAccordDept = FALSE; ,/如果都符合.,if(bAccordCode=TRUE&bAccordName=TRUE&bAccordDept=TRUE), nAccordItemnAccordNum = i; nAccordNum+; ,/显示记录框,csBuffer.Format(“There are %d according records“,nAccordNum); MessageBox(csBuffer,“Attention“,MB_OK|MB_ICONINFORMATION); /显示第1条符合的记录 if(nAccordNum0),m_csCode = st
25、ructStudentnAccordItem0.csCode;m_csName = structStudentnAccordItem0.csName;m_csSex = structStudentnAccordItem0.csSex;m_csAge = structStudentnAccordItem0.csAge;m_csDept = structStudentnAccordItem0.csDept;UpdateData(FALSE);,/当记录数大于1时,Continue按钮有效 if(nAccordNum1), GetDlgItem(IDC_BTN_CONTINUE)-EnableWin
26、dow(1); ,当符合检索条件的学生数大于1时,“下一条信息”按钮有效。单击此按钮 ,用于显示下一个学生信息。 void CMy11_8Dlg:OnBtnContinue() static int nCurAccordNum=2; /定义已显示过记录的数量的变量/当总记录数大于2并且已显示过的记录数小于总记录数时 if(nAccordNum = 2 /显示警 告信息,GetDlgItem(IDC_BTN_CONTINUE)-EnableWindow(0);,/Continue按钮无,效 nCurAccordNum = 1; /恢复原值 ,【例】创建一程序,包含四个 编辑框,一个单行编辑框,一 个多行编辑框和两个只读编辑 框。多行编辑框拥有垂直滚动 条,能自动滚动。两个只读编 辑框能动态显示多行编辑框中 当前文本的字符数、行数。另 外有“剪切”、“复制”、“ 粘贴”、“撤销”、和“退出 ”按钮。分别完成对单行或多 行编辑框中选中文本的“剪切 ”、“复制”,“粘贴”、“ 撤销”和整个程序的“退出” 操作。界面如图所示。,