8.1 控件
控件是Windows应用系统与用户交互的主要方式。控件是由Window提供的,预先包装好的对象,带有完整的消息响应处理机制。
系统通过控件可以向用户提供消息并将用户的输入反馈回系统,由此决定之后的操作。
在一个完整的客户交互窗口中,常常包含一个或多个控件,因此控件与窗口具有父子关系。当控件发出消息通知,说明某个事件发生时,它的父窗口是消息的实际接受者。
8.2 编辑框类CEdit
编辑框用来进行文本输入和编辑。编辑框控件分为单行编辑框和多行编辑框。CEdit类是CWnd类直接派生来的,具有CWnd的所有功能。
8.2.1 创建编辑框
方法一:编辑框可以通过工具箱拖动创建;
方法二:编辑框控件可以通过编写代码创建;系统首先调用CEdit构造函数构造CEdit对象,再调用Create成员函数创建Windows编辑控件并将其与CEdit对象连接。
CEdit主要函数
Create() 创建编辑框;
GetWindowText() 获得窗口标题或控件正文,返回以字节为单位的实际复制字符数
SetWindowText() 设置窗口的标题或控件正文
GetSel() 获得编辑控件中当前选择的开始和结束字符位置
SetSel() 在编辑控件中选择字符的范围
ReplaceSel() 用指定文本替代编辑框中当前选择的部分
GetWindowTextLength() 获得窗口的标题长度或控件中的正文长度
SetModify() 设置或清除编辑控件的修改标志
SetPasswordChar() 用户输入文本时设置或删除一个显示与编辑控件中的密码字符
SetReadOnly() 将编辑控件设置为只读状态
CEdit控件的样式
ES_LEFT 将文本左对齐
...
8.2.2 编辑框类的主要消息和方法
控件在发生某事件后,会向父窗口发出消息,父窗口通常由CDialog派生。
MFC提供了编辑框控件产生消息对应的宏,宏定义如下:
ON_EN_CHANGE 控件内容发生变化
ON_EN_ERRSPACE 编辑框不能申请足够的内存空间
ON_EN_KILLFOCUS 编辑控件失去输入焦点
ON_EN_MAXTEST 当前输入超过了指定的最大字符数
ON_EN_SETFOUCUS 编辑控件获得输入焦点
ON_EN_UPDATE 编辑控件要显示改变后的文本
ON_EN_VSCROLL 用户在垂直滚动条上单击鼠标
ON_EN_HSCROLL 用户在水平滚定条上单击鼠标
如果要处理控件发来的通知消息,在父窗口中需要为每一个消息添加一个消息映射入口和消息处理函数。
消息映射入口可采用如下形式:
ON_Notification(id,memberFxn); //id指定了发送通知的编辑控件的子窗口ID,memberFxn是处理通知的父窗口成员函数的名字
函数形式如下:
afx_msg void memberFxn();
8.2.3 MFC编辑对话框实例
基于对话框程序的执行流程:
1.DoModal()函数的功能:当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。
2.当在对话框上加载消息,即我们按一下按钮,对话框就要做出一定的回应。而这一功能就交给Run()函数处理。
模态对话框:
创建了 CCalculateDlg dlg 对象时,对话框并没有显示,只是构造另一个CCalculateDlg类型的对象,直到用户调用DoModal(),对话框才会显示出来。
dlg.DoModal()后显示一个模态对话框,此时DoModal()函数并不返回,直到用户关闭此对话框时DoModal才返回;
CDialog::DoModal() 的返回值为 IDOK/IDCANCEL. 表明操作者在对话框上选择“确认”或“取消”按钮;
非模态对话框:
在程序运行的过程中,若出现了非模态对话框,主窗口还可以发送消息;
点击非模态对话框中的OK按钮,非模态对话框没有销毁,只是隐藏了;
若想点击OK按钮时,非模态对话框也销毁,那么CTestDialog类必须重载其基类CDialog的虚函数ONOK(),在此函数中调用DestroyWindow()销毁此对话框。
方法一:
(1)给编辑框连接变量
对话框类的数据获取:在程序运行过程中,当向控件(如编辑框)输入值时,需要连带将值保存到对应的数据成员中;
反之,如果数据成员的值被修改,也需要把新的值显示到编辑框中。这一机制通过DoDataExchange函数实现。
DoDataExchange函数实现数据动态绑定,void AFXAPI DDX_Text(CDataExchange * pDx,int nIDC,double& value); 函数DDX_Text使用变量value的引用,因此控件nIDC与变量之间仅仅是使用关系,变量通过框架传递给控件。
函数DDX_Text必须通过函数UpdateDate();内部调用,该函数是MFC的窗口函数,用来刷新数据; BOOL UpdateData(BOOL bSaveAndValidate=true); 参数bSaveAndValidate用于指示数据的传输方向,TRUE将数据从控件传送到对应的数据成员,FALSE将数据从数据成员传送给对应的控件。
(2)按钮控件连接代码
在“+”按钮上选择“添加事件处理程序”,弹出“事件处理程序向导”,在消息类型列表框中选择BN_CLICKED项,单击按钮事件。
方法二:
Format函数
在MFC程序中,可以使用Format方法方便地实现int、float和double等数字类型转换为CString字符串。
CString的Format支持的格式说明:
%c 单个字符
%d 十进制整数(int)
%ld 十进制整数(long)
%f 十进制浮点数(float)
%lf 十进制浮点数(double)
%e 指数形式输出实数
%g 选用f与e格式中输出宽度较小的格式,不输出0
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
在VS环境中CString的运算需要用“_T”来表示