关于CRichEditCtrl

    我在程序中使用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)&gt,(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。



你可能感兴趣的:(function,null,dll)