在MFC程序中,使用CString来处理字符串是一个很不错的选择。CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串。CString的Format方法给我们进行字符串的转换带来了很大的方便,比如常见的int、float和double这些数字类型转换为CString字符串只需一行代码就可以实现。
先看看Format用于转换的格式字符:
%c 单个字符
%d 十进制整数(int)
%ld 十进制整数(long)
%f 十进制浮点数(float)
%lf 十进制浮点数(double)
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
1、int转换为CString:
CString str;
int number=15;
//str="15"
str.Format(_T("%d"),number);
//str=" 15"(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
str.Format(_T("%4d"),number);
//str="0015"(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
str.Format(_T("%.4d"),number);
long转换为CString的方法与上面相似,只需要把%d改为%ld就可以了。
2、double转换为CString:
CString str;
double num=1.46;
//str="1.46"
str.Format(_T("%lf"),num);
//str="1.5"(.1表示小数点后留1位,小数点后超过1位则四舍五入)
str.Format(_T("%.1lf"),num);
//str="1.4600"
str.Format(_T("%.4f"),num);
//str=" 1.4600"(前面有1个空格)
str.Format(_T("%7.4f"),num);
float转换为CString的方法也同上面相似,将lf%改为f%就可以了。
3、将十进制数转换为八进制:
CString str;
int num=255;
//str="377"
str.Format(_T("%o"),num);
//str="00000377"
str.Format(_T("%.8o"),num);
CEdit类控件的使用
当控件变量设置为Value时,必须用UpdateData。(通常编辑框变量设置为Value)
UpdateData(TRUE) -- 刷新控件的值到对应的变量
//程序
UpdateData(FALSE) -- 拷贝变量值到控件显示
控件变量设置为Control时,直接使用类的成员函数(.)操作。
m_path.SetWindowText("wangshuai!");
CString str;
GetDlgItem(IDC_EditPath)->GetWindowText(str);
MessageBox(str);
编辑控件用于程序需要获取文本的时候,例如,在对话框内输入名字或数字时,由编辑控件获取此信息。编辑控件是用来存储用户输入的自由格式文本的窗口,分为单行编辑控件和多行编辑控件。单行编辑控件是用于输入单行文本的控件,多行文本编辑控件是用于输入多行文本的控件。在多行编辑控件中经常使用滚动条,从而能输入比显示区域更多的文本。事实上,Windows中的记事本(Notepad)应用程序就是一个带有控件菜单的编辑控件。
每个编辑控件都提供了内置编辑能力,因此可以使用多行编辑控件来创建一个简单的文本编辑器。所有的编辑控件都支持特定的编辑功能,而不需要任何附加编程。在剪贴板中用到的粘贴命令在编辑控件中照常可以使用。
编辑控件能够发送WM NOTIFY消息到对话框窗口,并告诉对话框窗口用户对编辑控件所做的操作,编辑控件能够处理的消息类别如下所示。
消息类别发生事件
EN_ CHANGE输入框中的文本串被修改
EN_ ERRSPACE输入的文本串超过了输入框的显示范围
EN_ HSCROLL 按下水平滚动条
EN_KILLFOCUS 输入框失去焦点,也就是焦点转移到其他对象
EN_ MAXTEXT 输入的文本串超过了设定的最大输入长度
EN_ SETFOCUS 输入框获取焦点
EN_ UPDATE 更新显示内容
EN_ VSCROLL按下垂直滚动条
使用C1assWizard可以为一个编辑控件映射一个对话框的成员变量,通过对话框的数据交换机制,方便地获取用户输入的内容,或把应用程序的响应结果输出到编辑框。成员变量的数据类型可以设为CString, int, UINT, long, DWORD, float, double. BYTE, short,BOOL, COleDateTime, COleCurrency}方便程序员在不同应用情况下的数据处理。
(一)属性设置
通过Styles标签页的设置,可以得到不同类型的编辑框样式:多行编辑框、密码编辑框,只读编辑框,大小写转换编辑框、数字编辑框等等。
1 .Align text
控制编辑控件中的文本对齐方式。可能的取值有左对齐、居中和右对齐。
2: Muttiline
定义该编辑控件为多行文本编辑。通常情况下,该选项不被选中。
3. Number
限定用户输入的只能是数字。
4. Horizontal scroll
在多行编辑控件中提供一个水平滚动条。默认该选项不被选中。
5. Auto HScroll
当用户在编辑框的最右边输入字符时,文本自动进行滚动。该选项通常被选中。
6. Vertical scroll
在多行编辑控件中提供一个垂直滚动条。默认该选项不被选中。
7. Auto VScroll
在多行编辑控件中,当用户在最后一行按回车键时,文本自动向下滚动。默认该选项不被选中。
8 .Password
当用户在编辑控件中输入字符时,在编辑框中不显示输入的文本,而是相同个数的“*”字符。这一选项在多行编辑控件中不能使用。默认不被选中。
9. No hide selection
当编辑控件失去或重新获得焦点时,该项设置将改变文本的显示方式,使编辑框中选择的文本好像总是处于选中状态。默认该选项不被选中。
10. OEM convert
对用户输入内容进行从Windows字符集到OEM字符集的转化,这样可以使调用AnsiToOem时正常工作。默认不被选中。
11.Want return
应用于多行编辑控件。该选项允许在编辑控件中按Enter键换行,而不影响对话框的默认按钮。
12. Border
为控件创建边界,该选项默认被选中。
13. Uppercase
将所有的输入内容转化为大写字符,默认不被选中。
14. Lowercase
将所有的输入内容转化为小写字符,默认不被选中。
15. Read-only
禁止用户在编辑控件中输入或修改其内容,默认不被选中。与静态文本控件的扩展属性相比,编辑控件的扩展属性只增加了一项Left scroll bar,如果设置了垂直滚动条,这一项决定了滚动条在客户区的左边。它的类型是布尔型,默认情况下不选中。
编程实例:Exam6_1编写一个用户登录的应用程序,应用程序维护着一张合法用户的用户名和密码的列表,至于合法用户才能通过登录程序.要求如下:
(1)用户名输入后,转换为大写字母显示,最大长度不能超过10位。
(2)密码以‘*’代替显示,密码只能是6位数字。
(3)按“确定”按钮时,需要确认输入框不为空,且输入符合要求,否则返回输入框重新输入。
(4)对合法用户显示欢迎对话框,对不合法用户显示警告对话框。
相关参考函数代码:
void CExam6_01Dlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(true);
if(m_user.IsEmpty())
{
AfxMessageBox("用户名不能为空,请重新输入");
m_EditUser.SetFocus();
}
else if(m_pwd.IsEmpty())
{
AfxMessageBox("密码不能为空,请重新输入");
m_EditPwd.SetFocus();
}
else
{
int len=m_EditPwd.LineLength();
if(len!=6)
{
AfxMessageBox("密码必须为六位,请重新输入");
m_EditPwd.SetFocus();
}
else
{
for(int i=0;i<5;i++)
if((m_user==userlist[i][0])&&(m_pwd==userlist[i][1]))
{
MessageBox("You are welcome!");
break;
}
if(i==5)
MessageBox("Sorry,you are not permitted.");
}
}
CDialog::OnOK();
}
CExam6_01Dlg::CExam6_01Dlg(CWnd* pParent )
: CDialog(CExam6_01Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CExam6_01Dlg)
m_user = _T("");
m_pwd = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
userlist[0][0]="MARY";
userlist[0][1]="123456";
userlist[1][0]="MARY";
userlist[1][1]="123456";
userlist[2][0]="MARY";
userlist[2][1]="123456";
userlist[3][0]="MARY";
userlist[3][1]="123456";
userlist[4][0]="MARY";
userlist[4][1]="123456";
userlist[5][0]="MARY";
userlist[5][1]="123456";
}