CEdit类编辑框、CRichEditCtrl类富文本编辑框是VC中最重要的控件之一。后者最大的特色在于可以设置文本字体、颜色、链接,插入图片等等格式化操作。编辑框默认支持15000左右的字符,富文本编辑框大约是35000左右,但两者都可以通过其类的方法来调整这一数值。另外,富文本框可以用"\r\n"控制换行,普通文本框不能识别。CEdit没有ctrl A的快捷键,richedit有;CEdit有右键菜单,CRichEditCtrl没有(需要自定义创建)。

1 使用富文本编辑框先要初始化

与编辑框使用不同的是,使用富文本框之前需要先调用AfxInitRichEdit()这个全局函数来初始化这个控件,否则程序启动后又自动退出了。

另外,AfxInitRichEdit()装载的只是RichEdit 1.0版本,2.0有更多的功能:

RichEdit2.0A自动为宽字符(WideChar),所以它可以解决中文乱码以及一些汉字问题;

RichEdit2.0A可设置行间距;

以下是初始化RichEdit并加载控件dll的代码:

test.cpp HMODULE hMod; //增加一全局变量 bool CTestApp::InitInstance() { …… AfxInitRichEdit(); //装载 RichEdit 1.0 CONTROL (RICHED32.DLL) hMod = LoadLibrary(_T("RICHED20.DLL")); //加载 Riched20.dll(Riched32.dll) …… } // 加载dll也可以在InitDialog中进行 BOOL CTestApp::::ExitInstance() { …… FreeLibrary(hMod); …… } 在对话框上放一个IDC_RICHEDIT1,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to "RichEdit20a".

Richedit20A的图框变成了黑色,也调不出正常的属性对话框,原因是在Records.rc文件中以下内容中有增加20A字样,改回即可。

CONTROL "",IDC_RICHEDIT1,"RICHEDIT20A",WS_TABSTOP,134,65,307,18

2 编辑框和富文本框的属性设置

要使富文本框或编辑框可以自由的编辑,先要设置一下属性。右击控件,单击属性,在属性栏中,将【Vertical Scroll】设为True,可以让垂直滚动条生效。水平滚动条则是【Horizontal Scroll】。【Want Return】设置为True,可以使富文本框接受回车换行,否则回车不会进行换行。当然要使富文本框有多行编辑功能,要将【Multiline】属性设置为True。

vc编辑框中的数据存储在哪里(编辑框与富文本编辑框的使用及其两类变量的比较)(1)

3 编辑框和富文本框都可以设置为value或control类型的变量。

vc编辑框中的数据存储在哪里(编辑框与富文本编辑框的使用及其两类变量的比较)(2)

value类型相当于基本数据类型,可以是CString、int、long、float、double、UINT、double、short、bool等类型。这种类型的变量可以直接使用赋值符号=去赋值,然后用全局函数UpdateData()与控件交换数据。(当然,如果选择的是CString,CString本身又是VC中的一个类,可以有诸多的方法可以调用。)如:

UpdateData(1); // 将控件上的值读入关联变量 m_edit1 = "cm"; // value类型的m_edit1如果选择的是CString,就可以使用CString类型相同的操作, // 如果选择的是int,就可以使用int类型相同的操作 UpdateData(false); // 更新,将关联变量的值更新到控件上

vc编辑框中的数据存储在哪里(编辑框与富文本编辑框的使用及其两类变量的比较)(3)

control类型其实定义的是一个对象,编辑框定义的是CEdit类的对象,富文本框定义的是CRichEditCtrl类的对象。自然,有诸多的方法可以调用,诸多的属性可以使用,与控件的交互也是通过这些属性和方法来进行的。关于各自类的方法和属性及构造函数见后面的图片。

如下图,一个控件在定义了value类型后,还可以接着再定义control类型:

vc编辑框中的数据存储在哪里(编辑框与富文本编辑框的使用及其两类变量的比较)(4)

全局函数GetDlgItem(control ID)可以返回一个对象指针,与control对象有相同的方法和属性可以调用。

另外,控件还可以声明和定义派生类,并可以用派生类来为该类控件实例化对象,然后用实例化后的对象来引用派生类定义的属性和方法。

如有一个CEdit控件,其ID是IDC_edit1,关连了一个control变量m_cedit,便可以使用如下代码与控件交换数据:

CString str1, str2; GetDlgItem(IDC_edit1)->GetWindowText(str1); m_cedit1.GetWindowText(str2);

需要注意的是,value类型因为是普通的基本数据类型,一般都可以使用赋值操作符。而control类型定义的是对象,只能使用对象访问成员的操作符“.”,而GetDlgItem(IDC_edit1)返回的是一个对象指针,只能使用指针访问成员的操作符“->”。

4 默认最高上限字符数量调整

CDialog::OnInitDialog(); { …… m_textblock.LimitText(1000000); // 设置文本框可以容纳的字数上限; //CEdit类使用的是SetLimitText(); …… }

5 随内容自动滚动控制

m_Log.SetWindowText(strs);// m_Log为Control控件变量 m_Log.LineScroll(m_Log.GetLineCount());

6 CEdit类和CRichEditCtrl类定义的属性和方法

vc编辑框中的数据存储在哪里(编辑框与富文本编辑框的使用及其两类变量的比较)(5)

-End-

,