2.0版本的富文本RICHEDIT20A的一些总结

RichEdit的加载问题 1、问题来源 今天编译一个界面库代码,在VS2010下没有问题,但是在VS2012下却报了很多错,其中一个是说没有找到riched20.lib这个库。首先到SDK路径下去找,确实没有找到这个库,难道是微软的人打瞌睡,出了这样的错误? 2. 找原因 我带着疑惑,在VS2010种查找了一下。在这里边我用的是SDK 7.0A, 很让人高兴,riched20.lib这个库在lib目录下,所以编译没 阅读详情
最近在修改即时通讯模块相关问题的时候,发现1.0版本的富文本控件CRichEditCtrl有一些bug和问题,比如选中文字时背景色是黑色;当输入白色文字时,选中后不显示文字等。所以决定使用2.0版本的富文本控件,但是远没有刚开始想的那么简单,遇到很多有疑惑的问题,下面就简单的总结一下。

        1、使用2.0版本的富文本控件的准备工作

        如何在程序中使用2.0版本的富文本控件呢?方法如下:

        方法一:(msdn上的做法,适用于用VC.NET及以后版本创建的工程)
            To update rich edit controls in existing Visual C++ applications to version 2.0,
            open the .RC file as text, change the class name of each rich edit control from   "RICHEDIT" to "RichEdit20a". 
            Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
       方法二:(以VC6对话框为例)--(我的是VC6的工程,所以使用这种方法)
       (1) 在CxxxApp中增加一成员变量 HMODULE  m_hMod;
       (2) 在CxxxApp::InitInstance()中添加一句m_hMod = LoadLibrary(_T("riched20.dll")),加载2.0版本的dll库;
             在CxxxApp::ExitInstance()中添加一句FreeLibrary(m_hMod),即在程序退出时,释放dll库;
       (3) 以已有的富文本控件的ID,搜索到.rc文件中的相关内容,将richedit控件的类名由"RICHEDIT" 修改成 "RICHEDIT20A",如下所示:

  1. IDD_INFO_STATUS_DLG DIALOG DISCARDABLE  0, 0, 243, 219  
  2. STYLE WS_POPUP | WS_CLIPSIBLINGS  
  3. FONT 9, "宋体"  
  4. BEGIN  
  5.     PUSHBUTTON      "",IDC_CLOSE,221,7,15,14  
  6.     CONTROL         "",IDC_EDIT_INFO,"RICHEDIT20A",ES_MULTILINE |   
  7.                     ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_TABSTOP,  
  8.                     25,37,195,148  
  9. END  

        注意:在将"RICHEDIT" 替换成 "RICHEDIT20A"时,一定要所有的地方都替换掉,否则运行时在显示相关窗口时会出现ASSERT(::IsWindow(m_hWnd))错误。原因是程序载入的2.0版本的富文本控件,如果继续使用1.0版本,将会导致所在的窗口创建失败,从而在显示窗口的时候出现assert错误,比如程序会在下面的代码错报错(CInfoDlg对话框中使用到richedit,资源中忘记将"RICHEDIT" 替换成 "RICHEDIT20A"):

  1. CInfoDlg::Instance().Create( CInfoDlg::IDD, this->GetParent() );  
  2. CInfoDlg::Instance().CenterWindow( this->GetParent() );  
  3. CInfoDlg::Instance().ShowWindow( SW_HIDE ); // 程序会在此句报错  

        2、在现有内容尾部追加新字符

        要在现有内容结尾处追加新字符,则要先调用SetSel选中最末尾处,然后调用ReplaceSel将新内容加上去。richedit 1.0是按多字节进行处理的,要在richedit 1.0控件中添加新字符,可以用以下的方法:

  1. nTotalTextLength = m_ChatDisplay.GetWindowTextLength(); // 调用CWnd的GetWindowTextLength接口获取当前字符数     
  2. m_ChatDisplay.SetSel( nTotalTextLength, nTotalTextLength );  
  3. m_ChatDisplay.ReplaceSel( _T("打开文件") );  

        richedit 2.0则包括RICHEDIT20A和RICHEDIT20W版本,前者是ANSI版本的,后者是宽字节版本。根据工程是否是UNICODE来选择使用哪个版本,本文主要讨论RICHEDIT20A版本的问题(因为我们的工程是非UNICODE的)。对于RICHEDIT20A,要添加新内容就不能使用上面的代码了,GetWindowTextLength()获得的是字节数,而RICHEDIT20A在计算字符位置时,是将一个汉字看成一个字符的,所以要使用上面的代码就不对了,应该使用下面的代码:

  1. m_ChatDisplay.SetSel( -1, -1 );  // 选中结尾处  
  2. m_ChatDisplay.ReplaceSel( _T("打开文件") );  

         RICHEDIT20A在计算字符位置时,将一个汉字看成一个字符,这个规则很重要,在很多地方需要注意。在下面添加超链接时会用到;在发送截图时,截图是以文件传输的方式发到对端的,对于接收端在收到聊天消息时,先用一个预设图片显示到richedit中,带截图文件接收完成后再找到对应的预设图片位置用实际图片将预设图片替换掉,这里面也牵涉到位置计算问题。              

        3、在RICHEDIT20A中添加自定义超链接               

        之前这个问题折腾了很长时间,一度以为RICHEDIT20A不能添加自定义超链接。因为不知道RICHEDIT20A在计算字符位置时,将一个汉字看成一个字符这个原则,一直使用CWnd的GetWindowTextLength接口来计算字符位置,导致添加链接失败。

        一般我们要改写MFC提供的控件,都是将MFC控件作为基类派生出来一个类,稍加改造实现我们想要的功能,所以我们可以从CRichEditCtrl派生一个类出来。要使richedit能响应超链接点击事件,需设置事件位ENM_LINK;要使richedit能自动识别超链接,比如我们输入网址,它会自动检测到并将值设置为超链接,需向richedit发送一个EM_AUTOURLDETECT消息,我们可以重写CRichEditCtrl的PreSubclassWindow接口,在这个接口中完成上述设置。另外,要能响应超链接点击事件,需要添加映射和效应函数,相关代码如下所示:

  1. class CRichEditCtrlEx : public CRichEditCtrl  
  2. ......  
  1. void CRichEditCtrlEx::PreSubclassWindow()   
  2. {  
  3.         CRichEditCtrl::PreSubclassWindow();  
  4.   
  5.     SetEventMask( ENM_LINK ); // 使richedit能响应超链接点击事件  
  6.     SendMessage( EM_AUTOURLDETECT, (WPARAM)true, 0 ); // 使richedit能自动检测超链接  
  7. }  
  1. ON_NOTIFY_REFLECT( EN_LINK, OnURLClick ) // 消息映射  
  1. void CRichEditCtrlEx::OnURLClick( NMHDR *pNmhdr, LRESULT *pResult ) // 链接点击响应函数  
  2. {  
  3.     ENLINK *pLink = (ENLINK*)pNmhdr;  
  4.     ASSERT(pLink);  
  5.   
  6.     if ( pLink->msg == WM_LBUTTONUP )  
  7.     {  
  8.         SetSel(pLink->chrg);  
  9.   
  10.         TCHAR cUrl[MAX_PATH * 2] = {0};  
  11.         GetSelText(cUrl);  
  12.           
  13.         TCHAR achFilePath[MAX_PATH] = { 0 };  
  14.         CString strFilePath;  
  15.         CString strFilePathParam;  
  16.   
  17.         // 对于文件传输,传输结束后在界面中会显示“打开文件”和“打开所在文件夹”的链接  
  18.         if ( _tcscmp( cUrl, _T("打开文件") ) == 0 ) //“打开文件”链接  
  19.         {  
  20.             strFilePath = GetFilepath( pLink->chrg.cpMin, TRUE ); // 获取对应的路径信息  
  21.             strFilePathParam.Format( _T("\"%s\""), strFilePath ); // 加上双引号以防路径中有空格导致ShellExecute参数解析错误,2012/05/18  
  22.             ShellExecute(NULL, "open", strFilePathParam, NULL, NULL, SW_SHOWNORMAL);  
  23.         }  
  24.         else if ( _tcscmp( cUrl, _T("打开所在文件夹") ) == 0 ) // “打开所在文件夹”链接  
  25.         {  
  26.             strFilePath = GetFilepath( pLink->chrg.cpMin, FALSE ); // 获取对应的路径信息  
  27.             CString strTemp; // 打开文件夹并选中文件,要使用“/select, ”选项  
  28.             strTemp.Format( _T("\"%s\""), strFilePath ); // 加上双引号以防路径中有空格导致ShellExecute参数解析错误,2012/05/18  
  29.             strFilePathParam = _T("/select, ");  
  30.             strFilePathParam += strTemp;  
  31.             ShellExecute( NULL, "open", _T("explorer.exe"), strFilePathParam, NULL, SW_SHOWNORMAL ); // 使用资源管理器打开  
  32.         }  
  33.         else  
  34.         {  
  35.             ShellExecute(NULL, "open", cUrl, NULL, NULL, SW_SHOWNORMAL);  
  36.         }  
  37.     }  
  38.     pResult = FALSE;  
  39. }     

        上面简单叙述了一下使用超链接的前期准备工作,下面着重说一下如何添加自定义超链接的事情。

        其实设置自定义超链接也容易,关键是找到超链接字符对象的位置,然后选中超链接字符,设置超链接格式即可。那么不能使用CWnd的GetWindowTextLength接口,如何得到超链接字符的位置呢?用下面的代码段即可实现:

  1. long nStart = 0;  
  2. long nEnd = 0;  
  3.        m_ChatDisplay.SetSel( -1, -1 ); // 选中现有文字的末尾  
  4. m_ChatDisplay.GetSel( nStart, nEnd ); // 得到末尾处的位置  
        具体一点,比如在文件传输模块中,当文件接收完成后,将文件接收完成的信息写入到richedit中显示,此时需要紧接在后面添加“打开文件”和“打开所在文件夹”超链接,给用户提供快捷的查看接收到的文件的简洁途径,方便用户操作。下面以添加“打开文件”超链接为例:
  1. // 前面已经将文件传输提示信息加入到richedit中,下面紧接着在后面添加“打开文件”的超链接  
  2.               CHARFORMAT cf;  
  3. ZeroMemory( &cf, sizeof(CHARFORMAT) );  
  4. cf.cbSize = sizeof(CHARFORMAT);  
  5. cf.dwMask = CFM_COLOR | CFM_FACE | CFM_LINK | CFM_SIZE /*| CFM_UNDERLINE*/;  
  6. cf.dwEffects = CFE_LINK | ~CFE_AUTOCOLOR;  
  7. cf.crTextColor = RGB( 0, 114, 193 ); <span style="font-weight: bold;">// 文字颜色,这句改变颜色好像是无效的</span>  
  8.   
  9. long nStart = 0;  
  10. long nEnd = 0;  
  11. long nStart2 = 0;  
  12. long nEnd2 = 0;  
  13.   
  14. // 设置“打开文件”的超连接  
  15. m_ChatDisplay.SetSel( -1, -1 ); // 选中现有文字的末尾  
  16. m_ChatDisplay.GetSel( nStart, nEnd ); // 找到现有文字的末尾位置,并记录  
  17. CString strLinkText = _T("打开文件");  
  18. m_ChatDisplay.ReplaceSel( (LPCSTR)strLinkText );  
  19. m_ChatDisplay.SetSel( -1, -1 ); // 选中现有文字的末尾  
  20. m_ChatDisplay.GetSel( nStart2, nEnd2 ); // 找到添加“打开文件”后的末尾位置,并记录  
  21. m_ChatDisplay.SetSel( nStart, nStart2 ); // 选中“打开文件”字样   
  22. m_ChatDisplay.SetSelectionCharFormat( cf ); // 设置超链接格式  
        有人可能会说,这样处理有点麻烦,因为我们知道超链接的长度,按照RICHEDIT20A在计算字符位置时,将一个汉字看成一个字符这个原则,可以计算得到末尾位置,不用两次调用GetSel。事实上,超链接长度有时是未知的,是不好去实时计算的,特别是超链接文字中既包含字母又包含汉字的情况,所以还是有必要调用两次GetSel来获取末尾位置的。

        4、如何让自定义超链接执行指定的操作

        根据实际的需求,从超链接处找到相关的数据,在超链接点击的响应函数中来执行指定的操作。以文件传输为例,文件传输的界面如下图所示:

        首先,我要解析出文件路径,然后传递给ShellExecute函数去执行我们预定的操作。难点在于如何解析出文件路径,我这个地方采用的是笨办法,从“打开文件”超链接处向前找,因为提示文字使用统一的格式,考虑到路径长度一般不超过MAX_PATH长度,所以向前推MAX_PATH个位置,但是此处又要注意这一原则:RICHEDIT20A在计算字符位置时,将一个汉字看成一个字符,所以考虑到截取的字符传中可能包含汉字字符,所以在原有的长度基础上增加一倍,以免调用GetSelText时buf溢出。获取到字符串以后,根据提示文字的格式,就可以解析出具体的路径信息。由于上面已给出响应超链接单击的接口,下面接着给出解析路径的相关代码:

  1. // 获取“打开文件”链接前面的文字,解析出文件的完整路径  
  2. CString CRichEditCtrlEx::GetFilepath( UINT nCurPos, BOOL bForOpenFile )  
  3. {  
  4.     UINT nTempCurPos = nCurPos;  
  5.   
  6.     // 下面对文件路径的解析,严格按照提示信息的格式进行解析,提示信息的格式  
  7.     // 为:您成功接收了文件“E:\test-13.txt”。打开文件  打开所在文件夹   
  8.   
  9.     // 如果是为“打开所在文件夹”链接解析文件路径,要将链接前面的“打开文件  ”文字给  
  10.     // 偏移掉(“打开文件”四个汉字以及两个英文输入法下的空格)  
  11.     if ( !bForOpenFile )   
  12.     {  
  13.         nTempCurPos -= 2*1; // 偏移两个英文输入法下的空格  
  14.         nTempCurPos -= 4*1; // 4*1,偏移“打开文件”四个汉字  
  15.     }  
  16.   
  17.     // 考虑文件路径最长不超过MAX_PATH长度,所以由“打开文件”链接的位置,找到前MAX_PATH长度的文字  
  18.     int nStartPos = 0;  
  19.     int nEndPos = 0;  
  20.     if ( nTempCurPos >= MAX_PATH*sizeof(TCHAR)+2*1 ) // 2*1表示将“打开文件夹”链接前的"”。"两个汉字字符去掉  
  21.     {  
  22.         nStartPos = nTempCurPos - MAX_PATH*sizeof(TCHAR) - 2*1;  // 2*1,保证nStartPos大于等于0  
  23.     }  
  24.     else  
  25.     {  
  26.         nStartPos = 0;  
  27.     }  
  28.   
  29.     nEndPos = nTempCurPos-2*1; // 去掉链接前面的"”。"两个汉字字符  
  30.   
  31.     // 对于RICHEDIT2.0有点奇怪,它在计算字符的位置时,将汉字看作一个字符,所以下面在计算nBufLen时要乘以2,  
  32.     // 防止buf越界  
  33.     int nBufLen = (nEndPos - nStartPos + 1)*2; // 防止选中文字长度大于buf长度,导致数组越界   
  34.   
  35.     SetSel( nStartPos, nEndPos );   
  36.     TCHAR* pchText = new TCHAR[nBufLen];  
  37.     memset( pchText, 0, nBufLen );  
  38.     GetSelText( pchText );  
  39.       
  40.     // 截取的文字中可能包含多个路径信息,下面要找到最后一个路径信息,即找到最后一个_T("“")  
  41.     CString strFilePath = pchText;  
  42.     int nPos = 0;  
  43.     int nTemp = strFilePath.Find( _T("“") );  
  44.     CString strTemp = strFilePath;  
  45.     while( nTemp != -1)  
  46.     {  
  47.         nPos += nTemp;  
  48.         strTemp = strTemp.Right(  strTemp.GetLength() - nTemp - 2 ); // 2表示将_T("“")字符偏移掉  
  49.         nTemp = strTemp.Find( _T("“") );  
  50.         if ( nTemp != -1 )  
  51.         {  
  52.             nPos += 2; // 2表示将_T("“")字符偏移掉  
  53.         }  
  54.     }  
  55.   
  56.     int nLen = strFilePath.GetLength() - nPos - 2;  
  57.     strFilePath = strFilePath.Right( strFilePath.GetLength() - nPos - 2 ); // 2表示将_T("“")字符偏移掉  
  58.   
  59.     nLen = strFilePath.GetLength();  
  60.   
  61.     delete []pchText;  
  62.   
  63.     SetSel( -1, -1 );  
  64.   
  65.     return strFilePath;  
  66. }  

        上面的代码始终要结合RICHEDIT20A在计算字符位置时,将一个汉字看成一个字符这一原则来看,看起来可能有很多感觉别扭的地方,但为了实现我们的目标,不得不改造出上面的代码。

        以上就是将richedit1.0改造成2.0版本的 RICHEDIT20A过程中遇到的一些细节问题,鉴于网上关于 RICHEDIT20A细节处理方面的问题介绍的很少,所以在此分享出来。
告别对话框显示异常:手把手教你用AfxInitRichEdit2()搞定MFC RichEdit控件初始化 本文深入解析MFC RichEdit控件初始化问题,详细介绍了使用AfxInitRichEdit2()AfxInitRichEdit5()解决对话框显示异常的方法。通过版本选择、初始化函数详解及高级技巧,帮助开发者高效使用RichEdit控件,提升MFC应用开发效率。 阅读详情

相关推荐

从写字板到Word:用MFC RichEdit控件打造富文本编辑器的实战心得

本文详细介绍了如何使用MFC RichEdit控件开发功能强大的富文本编辑器,涵盖从基础配置到高级功能的实现。通过CRichEditCtrl类,开发者可以构建支持多种文本格式、段落布局撤销重做功能的编辑器,同时优化大文档处理性能。文章还分享了与现代UI集成及调试技巧,助力开发者打造媲美Word的桌面应用。

weixin_30627341的博客 362

Replacing "RICHEDIT" control with "RichEdit20A"

来源: http://www.codeguru.com/cpp/controls/richedit/article.php/c2389/CRichEditCtrlEx--Replacing-RICHEDIT-control-with-RichEdit20A.htm While writing a dev notes Visual Studio plug in, I wanted the rich edit control in a dialog to understand URL's so developers could add links to sites and email addresses. After talking to "Long John", he led me to the easy way of doing it, and now I am posting the work for others. Basically this requires CRichEditCtrlEx to use the new rich edit DLL RICHED20.DLL. The first thing to do it change the window class name of the rich edit controls from "RICHEDIT" to "RichEdit20A" in the *.rc file. Next, we create a class derived from CRichEditCtrl called CRichEditCtrlEx and override the Create() method: class CRichEditCtrlEx : public CRichEditCtrl { public: CRichEditCtrlEx(); virtual ~CRichEditCtrlEx(); // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL( CRichEditCtrlEx ) public: virtual BOOL Create( DWORD in_dwStyle, const RECT& in_rcRect, CWnd* in_pParentWnd, UINT in_nID ); //}}AFX_VIRTUAL // Generated message map functions protected: //{{AFX_MSG( CRichEditCtrlEx ) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Now implement the Create() method like this: Post a comment Email Article Print Article Share Articles Digg del.icio.us Newsvine Facebook Google LinkedIn MySpace Reddit Slashdot StumbleUpon Technorati Twitter Windows Live YahooBuzz FriendFeed BOOL CRichEditCtrlEx::Create(DWORD in_dwStyle, const RECT& in_rcRect, CWnd* in_pParentWnd, UINT in_nID) { if( ! ::AfxInitRichEditEx() ) { return FALSE ; } CWnd* l_pWnd = this ; return l_pWnd->Create( _T( "RichEdit20A" ), NULL, in_dwStyle, in_rcRect, in_pParentWnd, in_nID ); } This is almost exactly what is in CRichEditCtrl::Create(), except the different window class name, and the call to AfxInitRichEdit() has been changed to AfxInitRichEditEx() which first calls AfxInitRichEdit (we do not want to break the normal CRichEditCtrl). In the RichEditCtrlEx.h file, you need to add the DLL holder class and function prototype: class _AFX_RICHEDITEX_STATE { public: _AFX_RICHEDITEX_STATE(); virtual ~_AFX_RICHEDITEX_STATE(); HINSTANCE m_hInstRichEdit20 ; }; BOOL PASCAL AfxInitRichEditEx(); Now, in the source code, add the implementation: _AFX_RICHEDITEX_STATE::_AFX_RICHEDITEX_STATE() { m_hInstRichEdit20 = NULL ; } _AFX_RICHEDITEX_STATE::~_AFX_RICHEDITEX_STATE() { if( m_hInstRichEdit20 != NULL ) { ::FreeLibrary( m_hInstRichEdit20 ) ; } } _AFX_RICHEDITEX_STATE _afxRichEditStateEx ; BOOL PASCAL AfxInitRichEditEx() { if( ! ::AfxInitRichEdit() ) { return FALSE ; } _AFX_RICHEDITEX_STATE* l_pState = &_afxRichEditStateEx ; if( l_pState->m_hInstRichEdit20 == NULL ) { l_pState->m_hInstRichEdit20 = LoadLibraryA("RICHED20.DLL") ; } return l_pState->m_hInstRichEdit20 != NULL ; }

告别对话框崩溃!Visual Studio 2019里MFC RichEdit控件初始化保姆级教程

本文详细解析了Visual Studio 2019中MFC RichEdit控件初始化问题,提供了从基础到高级的完整解决方案。通过分析RichEdit控件的特殊加载机制版本差异,帮助开发者避免对话框崩溃问题,并实现版本升级与性能优化。

weixin_30394981的博客 473

C++程序使用Richedit大全

.常见问题 a、可以编译,不能执行的 AfxInitRichEdit(); b、升级默认的Riched版本(默认的有一些bug),如 可在InitInstance中添加 LoadLibrary("RICHED20.DLL") 最后注意 FreeLibrary 如果是CRichEditView基类的可用 BOOL CXXXXXXView::PreCreateWindow(CR

dvlinker的技术专栏 1798

C++ 2.0版本富文本RICHEDIT20A的一些总结

最近在修改即时通讯模块相关问题的时候,发现1.0版本富文本控件CRichEditCtrl有一些bug问题,比如选中文字时背景色是黑色;当输入白色文字时,选中后不显示文字等。所以决定使用2.0版本富文本控件,但是远没有刚开始想的那么简单,遇到很多有疑惑的问题,下面就简单的总结一下。 1、使用2.0版本富文本控件的准备工作 如何在程序中使用2.0版本的富

dvlinker的技术专栏 1万+

简单使用RichEdit2.0A

 下载 本文演示程序源代码 9KB通常我们用VC++提供的RichEdit会碰到很苦恼的事情----中文乱码单字节汉字中文乱码一般可以用SetFont解决, S@=-#0业,1T的zHAR61xk$@的软ui理rI!)`z网rX*%而这个单字节汉字就非常的莫名其妙了,一旦出现单字节汉字,你每按一次backspace将只消除半个汉字,景象甚是恼人。 最终我向RichE

c0ffee1982的专栏 1338

MFC RichEdit控件使用方法大全

RichEdit的意思是“富文本编辑控件”,在Edit的基础上添加了很多功能,如对不同字体、字号、文本颜色、背景色、插入Ole对象的支持,Windows系统的写字板就是基于RichEdit的。这篇文章就是介绍RichEdit的相关知识的。 ...

[PE]经典八炮的博客 9686

Richedit 富文本控件的使用

Richedit 富文本控件的使用

dvlinker的技术专栏 517

从写字板到Word:用MFC RichEdit控件打造你自己的富文本编辑器(附完整项目源码)

本文详细介绍了如何利用MFC RichEdit控件从零构建功能完备的富文本编辑器。通过项目实战方式,深入讲解字体格式控制、段落排版、撤销重做等核心功能实现,并分享RTF文件读写、界面优化等高级技巧,帮助开发者快速掌握MFC富文本编辑开发。

weixin_30599769的博客 576

从写字板到Word:用MFC RichEdit控件打造富文本编辑器的实战指南(附完整代码)

本文详细介绍了如何利用MFC框架中的RichEdit控件开发功能强大的富文本编辑器。从控件初始化、文本格式控制到高级段落排版编辑器功能扩展,提供了完整的实战指南代码示例,帮助开发者快速构建媲美商业软件的文本编辑工具。

weixin_30628077的博客 381

不止是加粗变色:用MFC RichEdit控件打造一个简易的富文本编辑器(附完整代码)

本文详细介绍了如何使用MFC RichEdit控件构建功能强大的富文本编辑器,涵盖环境配置、核心功能实现、文件操作、性能优化及调试技巧。通过实战代码示例,展示文本格式控制、段落排版等高级特性,帮助开发者充分发挥RichEdit控件的潜力,提升Windows桌面应用开发效率。

weixin_30553777的博客 400

MFC老项目救星:三步搞定RichEdit控件显示异常与版本升级(VS2019实测)

本文详细解析了MFC项目中RichEdit控件在VS2019环境下的兼容性问题,提供了三步解决方案:初始化函数调用、资源文件修改版本升级技巧。通过实战案例代码示例,帮助开发者快速解决控件显示异常问题,并实现从RichEdit 2.0到5.0的平滑升级。

weixin_30808693的博客 364

告别对话框显示异常:在MFC项目中正确初始化RichEdit控件的保姆级指南

本文详细介绍了在MFC项目中正确初始化RichEdit控件的方法,解决对话框显示异常问题。通过分析RichEdit控件的DLL加载机制,提供基础初始化、多版本兼容处理深度调试技巧,帮助开发者彻底掌握这一常见问题的解决方案。

weixin_30463341的博客 349

支持多平台的带行号RichEdit控件实现

带行号的RichEdit控件是在标准RichEdit编辑控件基础上扩展的功能性UI组件,广泛应用于代码编辑器、日志查看器等需要精确定位文本行的场景。它在保留RichEdit原有富文本编辑能力的同时,通过自定义绘制或子窗口叠加方式,在左侧显示行号栏,实现类似Visual Studio或Notepad++的行号显示效果。该控件的核心价值在于提升文本可读性与定位效率,尤其在处理大文件时,行号为开发者提供了直观的位置参考。

weixin_35592186的博客 1154

windows原生控件RichEdit使用梳理

RichEdit富文本编辑框在实际开发中应用的比较多,现将在平时工作中使用到的做以梳理: HMODULE m_hRichEditDll = NULL; HWND hRichEdit = NULL; 1. 初始化RICHED20.dll BOOL InitRichEditCtrlModule() { m_hRichEditDll = LoadLibrary_api_s(L"RICHED20.dll"); return NULL != m_hRichEditDll; } 2. 创建...

hsy12342611的专栏 2048

MFC RichEdit

MFC RichEditflyfish资源窗体 增加Rich Edit 2.0 Control初始化BOOL CMFCApplicationApp::InitInstance() { //TODO: call AfxInitRichEdit2() to initialize richedit2 library.AfxInitRichEdit2(); }头文件内容//控件绑定变量 CRich

二分掌柜的 1453

Visual Studio 2019+MFC RichEdit避坑指南:如何解决控件不显示、版本升级问题

本文针对Visual Studio 2019中MFC RichEdit控件的常见问题,提供了深度避坑指南。详细解析了控件不显示的根本原因,并给出了从RichEdit 2.0升级到4.1版本的完整实战步骤,包括资源文件修改、初始化代码更新以及升级前后的关键差异对比,帮助开发者高效解决版本兼容性与环境配置难题。

weixin_29304985的博客 308
上一篇: 插叙:百度面试经验总结
下一篇: 视差滚动原理及实现
workthinking
博客等级 码龄10年 4粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值