我在程序中使用CRichEditCtrl作为基类,创建了一个模板编辑控件,从最早的1.0到最新的3.0,其中需要注意的一些问题总结如下:
1、在创建CRichEditCtrl之前,或者在显示包含CRichEditCtrl对话框之前,必须首先调用
AfxInitRichEdit。如果是使用2.0版本的控件,则需要调用
AfxInitRichEdit2。
2、对于1。0版本的CRichEditCtrl,对于的DLL为RichEdit32.DLL,2.0和3.0版本的控件对应的DLL为RICHEDIT20.DLL。
AfxInitRichEdit函数会加载
RichEdit32.DLL,而
AfxInitRichEdit2会加载RICHEDIT20.DLL。
3、如果在VC2005中的对话框资源中添加一个RICHEDIT控件则在资源文件中控件类的名称为RichEdit20a。此时如果希望调用1.0版本,则需要将资源中控件的类名称由RichEdit20a替换为RICHEDIT。
4、1。0版本的控件默认支持多字节字符串,而2。0和3.0则默认支持UNICODE。
5、如果应用程序的编译选项设置为UNICODE,则通过GetWindowText()函数得到的字符串是UNICODE,如果编译选项是多字节,则GetWindowText()函数的到的是非UNiCode字符串。
6、3.0版本的RichEditCtrl通过GetSel和SetSel函数默认的字符串格式是UniCode。
7、如果希望在多字节的程序中以UniCode的方式返回CRichEditCtrl控件中的文本,则不能使用GetWindowText()函数,而应该通过消息EM_GETTEXTEX :
// 得到编辑控件的Unicode格式的文本
void CMyEditBase::GetWindowTextUniCode(CStringW &sText)
{
GETTEXTEX gt;
gt.cb=1024*1024;
gt.codepage=1200;
gt.flags=GT_DEFAULT;
gt.lpDefaultChar=NULL;
gt.lpUsedDefChar=NULL;
CStringW sBuff;
this->SendMessage(EM_GETTEXTEX,(WPARAM)>,(LPARAM)sBuff.GetBuffer(1024*1024));
sBuff.ReleaseBuffer();
sText=sBuff;
}
8、如果希望在多字节的程序中以UniCode字符串设置CRichEditCtrl控件的文本,不应该使用SetWindowText,而应该通过消息EM_SETTEXTEX :
void CMyEditBase::SetWindowTextUniCode(CStringW strText)
{
SETTEXTEX st;
st.codepage=1200;
st.flags=GT_DEFAULT;
this->SendMessage(EM_SETTEXTEX,(WPARAM)&st,(LPARAM)strText.GetBuffer());
}
9、如果希望在多字节程序中以UniCode字符串替换CRichEditCtrl中的文本,则应该使用消息EM_SETTEXTEX:
//以UniCode的文本对选中的区域进行替换操作
void CMyEditBase::ReplaceSelUniCode(CStringW strText,BOOL bCanUndo )
{
SETTEXTEX st;
st.codepage=1200;
if(bCanUndo)
st.flags=ST_SELECTION|ST_KEEPUNDO;//替换选择部分ST_KEEPUNDO
else
st.flags=ST_SELECTION;
this->SendMessage(EM_SETTEXTEX,(WPARAM)&st,(LPARAM)strText.GetBuffer());
}
因为消息EM_SETTEXTEX实际上包含了EM_SETTEXT和EM_REPLACESEL的功能,并且可以支持Unicode。