精华内容
下载资源
问答
  • MFC RichEdit控件

    2016-08-04 14:50:09
    mfc中使用工具栏里的RichEdit 控件时,应该在程序初始话时加入AfxInitRichEdit,或者 AfxInitRichEdit2  否则的话 程序会起不来.也没有任何错误信息. 这俩函数 是加载 Riched20.dll(Riched32.dll )的. ...
    在mfc中使用工具栏里的RichEdit 控件时,应该在程序初始话时加入AfxInitRichEdit,或者 AfxInitRichEdit2 
    否则的话 程序会起不来.也没有任何错误信息.
    这俩函数 是加载 Riched20.dll(Riched32.dll )的.

    1.设置edit只读属性

        方法一:
                    m_edit1.SetReadOnly(TRUE);
        方法二:
                    ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);


    2.判断edit中光标状态并得到选中内容(richedit同样适用)

            int nStart, nEnd;
            CString strTemp;

            m_edit1.GetSel(nStart, nEnd);
            if(nStart == nEnd)
            {
                strTemp.Format(_T("光标在%d"), nStart);
                AfxMessageBox(strTemp);
            }
            else
            {
                //得到edit选中的内容     
                m_edit1.GetWindowText(strTemp);
                strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
                AfxMessageBox(strTemp); 
            }
        注:GetSel后,如果nStart和nEnd,表明光标处于某个位置(直观来看就是光标在闪动);
                 如果nStart和nEnd不相等,表明用户在edit中选中了一段内容。


    3.在edit最后添加字符串

            CString str;
            m_edit1.SetSel(-1, -1);
            m_edit1.ReplaceSel(str);


    4.随输入自动滚动到最后一行(richedit同样适用)

        方法一:(摘自msdn)
            // The pointer to my edit.
            extern CEdit* pmyEdit;
            int nFirstVisible = pmyEdit->GetFirstVisibleLine();

            // Scroll the edit control so that the first visible line
            // is the first line of text.
            if (nFirstVisible > 0)
            {
                pmyEdit->LineScroll(-nFirstVisible, 0);
            }
        方法二:
            m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);


    5.如何限制edit输入指定字符

       可以从CEdit派生一个类,添加WM_CHAR消息映射。下面一个例子实现了限定输入16进制字符的功能。

       void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
       { 
            if ( (nChar >= '0' && nChar <= '9') || 
                 (nChar >= 'a' && nChar <= 'f') || 
             (nChar >= 'A' && nChar <= 'F') || 
                  nChar == VK_BACK || 
                  nChar == VK_DELETE)    //msdn的virtual key
           { 
                CEdit::OnChar(nChar, nRepCnt, nFlags); 
            }    
       }


    6.如何使用richedit

        添加AfxInitRichEdit();
           CxxxApp::InitInstance()
            {
                 AfxInitRichEdit();
              .............
           }

       AfxInitRichEdit()功能:装载 RichEdit 1.0 Control (RICHED32.DLL).


    7.如何使用richedit2.0 or richedit3.0

        使用原因:由于RichEdit2.0A自动为宽字符(WideChar),所以它可以解决中文乱码以及一些汉字问题

        方法一:(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.
        方法二:以对话框为例:
           (1)    增加一全局变量 HMODULE hMod;
           (2)    在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
                在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
           (3)    在对话框上放一个richedit,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to "RichEdit20a".
           (4)    在对话框头文件添加 CRichEditCtrl m_richedit;
                在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);


    8.改变richedit指定区域的颜色及字体

            CHARFORMAT cf;
            ZeroMemory(&cf, sizeof(CHARFORMAT));
            cf.cbSize = sizeof(CHARFORMAT);
            cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
                                CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
            cf.dwEffects = 0;
            cf.yHeight = 12*12;//文字高度
            cf.crTextColor = RGB(200, 100, 255); //文字颜色
            strcpy(cf.szFaceName ,_T("隶书"));//设置字体
         
            m_richedit1.SetSel(1, 5); //设置处理区域
            m_richedit1.SetSelectionCharFormat(cf);


    9.设置行间距(只适用于richedit2.0)

            PARAFORMAT2 pf;
            pf2.cbSize = sizeof(PARAFORMAT2);
            pf2.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
            pf2.dyLineSpacing = 200;
            pf2.bLineSpacingRule = 4;
            m_richedit.SetParaFormat(pf2);


    10.richedit插入位图

    Q220844:How to insert a bitmap into an RTF document using the RichEdit control in Visual C++ 6.0
    http://support.microsoft.com/default.aspx?scid=kb;en-us;220844
    http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
    http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/


    11.richedit插入gif动画

    http://www.codeproject.com/richedit/AnimatedEmoticon.asp


    12.richedit嵌入ole对象

    http://support.microsoft.com/kb/141549/en-us


    13.使richedit选中内容只读

    http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/


    14.打印richedit

    http://www.protext.com/MFC/RichEdit3.htm


    15.richeidt用于聊天消息窗口

    http://www.vckbase.com/document/viewdoc/?id=1087
    http://www.codeproject.com/richedit/chatrichedit.asp
    http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/


    16.解决richedit的EN_SETFOCUS和EN_KILLFOCUS无响应的问题

    http://support.microsoft.com/kb/181664/en-us


    17.richedit拼写检查

    http://www.codeproject.com/com/AutoSpellCheck.asp


    18.改变edit背景色

    Q117778:How to change the background color of an MFC edit control
    http://support.microsoft.com/kb/117778/en-us


    19.当edit控件的父窗口属性是带标题栏WS_CAPTION和子窗口WS_CHILD时,不能设置焦点SetFocus

    Q230587:PRB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window
    http://support.microsoft.com/kb/230587/en-us


    20. 在Edit中回车时,会退出对话框 

    选中Edit的风格Want Return。

    MSDN的解释如下:
    ES_WANTRETURN    Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiple-line edit control in a dialog box. Without this style, pressing the ENTER key has the same effect as pressing the dialog box's default pushbutton. This style has no effect on a single-line edit control.


    21. 动态创建的edit没有边框的问题

        m_edit.Create(....);
        m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);


    22. 一个能显示RTF,ole(包括gif, wmv,excel ,ppt)的例子

    http://www.codeproject.com/richedit/COleRichEditCtrl.asp

    转自

    http://blog.csdn.net/lixiaosan/archive/2006/04/06/652795.aspx

    Environment: VC6 SP4, 2000.

    Follow these 10 easy steps to build the OutLookRichEdit control:

    1. Insert a rich edit control into the dialog.
    2. Call AfxInitRichEdit() in the InitInstance of the App class or in InitDialog.
    3. If it does not exist, copy OutLookRichEdit.cpp and OutLookRichEdit.h to the project directory.
    4. Click the menu choice Project-Add to Project-Files and select the above-copied files to add the wrapper class to your project.
    5. Import the hand cursor into the resource and rename it "IDC_LINK".
    6. Use Classwizard to add a member variable of the rich edit control (CRichEditCtrl).
    7. Include the OutLookRichEdit.h file in the dialog's header file and change the declaration of rich edit member variable, as in
      CRichEditCtrl    m_ctrlText1;
      to
      COutLookRichEdit m_ctrlText1;
    8. In InitDialog(), add the following code.
      m_ctrlText1.SetRawHyperText(_T("Click <%$here$#100#%>
                                      to see the about box."));

      At this level, if you build the project and run it, you can see the rich edit control with linked text, but nothing would happen if you clicked on the link.

      To Show a dialog while the link is clicked, you have to add some more code in the dialog class. Before that, have a closer look at the preceding code and hypertext syntax. The link text is enclosed between the "$" symbols and the corresponding dialog's resource value 100 (About Box), enclosed in "#" symbols.

      You can find the #define values of dialogs in the resource.h file.

    9. Use ClassWizard to map OnNotify of the dialog and write the corresponding implementation code in .cpp file, like:
      BOOL CDEMODlg::OnNotify(WPARAM wParam,
                              LPARAM lParam,
                              LRESULT* pResult)
      {
        NMHDR* pNmHdr = (NMHDR*) lParam;
        if(IDC_RICHEDIT1 == pNmHdr->idFrom){
          switch(pNmHdr->code)
          {
            case IDD_ABOUTBOX:
              CAboutDlg oDlg;
              oDlg.DoModal ();
              break;
          }
        }
        return CDialog::OnNotify(wParam, lParam, pResult);
      }
    10. Now, build and run the project. It is recommended that you set the read-only attribute to the rich edit control.

    Downloads

    Download demo project - 23 Kb
    Download source - 6 Kb

    在RichEdit中插入Bitmap

    COleDataSource src;
    STGMEDIUM sm;
    sm.tymed=TYMED_GDI;
    sm.hBitmap=hbmp;
    sm.pUnkForRelease=NULL;
    src.CacheData(CF_BITMAP, &sm);
    LPDATAOBJECT lpDataObject =
    (LPDATAOBJECT)src.GetInterface(&IID_IDataObject);
    pRichEditOle->ImportDataObject(lpDataObject, 0, NULL);
    lpDataObject->Release();

    字体设置代码

    最后添加字体变换函数: 
    CHARFORMAT cf; 
    LOGFONT lf; 
    memset(&cf, 0, sizeof(CHARFORMAT)); 
    memset(&lf, 0, sizeof(LOGFONT)); 

    //判断是否选择了内容 
    BOOL bSelect = (GetSelectionType() != SEL_EMPTY) ? TRUE : FALSE; 
    if (bSelect) 

                 GetSelectionCharFormat(cf); 

    else 

                 GetDefaultCharFormat(cf); 


    //得到相关字体属性 
    BOOL bIsBold = cf.dwEffects & CFE_BOLD; 
    BOOL bIsItalic = cf.dwEffects & CFE_ITALIC; 
    BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE; 
    BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT; 

    //设置属性 
    lf.lfCharSet = cf.bCharSet; 
    lf.lfHeight = cf.yHeight/15; 
    lf.lfPitchAndFamily = cf.bPitchAndFamily; 
    lf.lfItalic = bIsItalic; 
    lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL); 
    lf.lfUnderline = bIsUnderline; 
    lf.lfStrikeOut = bIsStrickout; 
    sprintf(lf.lfFaceName, cf.szFaceName); 
                 

    CFontDialog dlg(&lf); 
    dlg.m_cf.rgbColors = cf.crTextColor; 
    if (dlg.DoModal() == IDOK) 

                 dlg.GetCharFormat(cf);//获得所选字体的属性 
                 if (bSelect) 
                             SetSelectionCharFormat(cf);     //为选定的内容设定所选字体 
                 else 
                             SetWordCharFormat(cf);         //为将要输入的内容设定字体 
    }

    在RichEdit中实现超链接

    在RichEdit中实现超链接
    责任编辑:admin   在CBuilder上制作 更新日期:2005-8-6
     
    首先在Form上放置一个RichEdit。

    在窗体的构造函数中添加以下代码:
    __fastcall TMainForm::TMainForm(TComponent* Owner)
             : TForm(Owner)
    {
         unsigned mask = SendMessage(RichEdit1->Handle, EM_GETEVENTMASK, 0, 0);
         SendMessage(RichEdit1->Handle, EM_SETEVENTMASK, 0, mask | ENM_LINK);
         SendMessage(RichEdit1->Handle, EM_AUTOURLDETECT, true, 0);   //自动检测URL

         RichEdit1->Text = "欢迎访问C++ Builder\n"
                           "网址: http://www.ccrun.com\n"
                           "偶的信箱:\n"
                           "mailto::info@ccrun.com \n"
                           "嘿嘿\n";
    }

    重载窗体的WndProc

    1。在.h中添加:

        protected:
           virtual void __fastcall WndProc(Messages::TMessage &Message);

    2。在.cpp中添加:
    //---------------------------------------------------------------------------
    void __fastcall TMainForm::WndProc(Messages::TMessage &Message)
    {
         if (Message.Msg == WM_NOTIFY)
         {
             if (((LPNMHDR)Message.LParam)->code == EN_LINK)
             {
                 ENLINK* p = (ENLINK *)Message.LParam;
                 if (p->msg == WM_LBUTTONDOWN)
                 {
                     SendMessage(RichEdit1->Handle, EM_EXSETSEL, 0, (LPARAM)&(p->chrg));
                     ShellExecute(Handle, "open", RichEdit1->SelText.c_str(), 0, 0, SW_SHOWNORMAL);
                 }
             }
         }
         TForm::WndProc(Message);
    }
    展开全文
  • RichEdit的意思是“富文本编辑控件”,在Edit的基础上添加了很多功能,如对不同字体、字号、文本颜色、背景色、插入Ole对象的支持,Windows系统的写字板就是基于RichEdit的。这篇文章就是介绍RichEdit的相关知识的。...

    RichEdit简介

    RichEdit的意思是“富文本编辑控件”,在Edit的基础上添加了很多功能,如对不同字体、字号、文本颜色、背景色、插入Ole对象的支持,Windows系统的写字板就是基于RichEdit的。我也基于RichEdit做了一个模仿写字板的程序,具体介绍点击此处查看,完整代码点击此处下载
    注:关于MFC的程序,还是MSDN最详细,这里只是介绍常用功能,所以每一节我都会给出MSDN的链接,大家可以去查阅。

    在基于对话框的程序里使用RichEdit

    MFC的工具箱里提供了RichEdit控件,我们可以直接拖放到对话框里。如图所示:
    RichEdit控件
    我们把一个RichEdit放进对话框里,编译运行程序,发现对话框无法正常显示。我们要在CXXXApp(XXX是工程名)类的InitInstance函数中加入一句:

    AfxInitRichEdit2();
    

    这样,对话框就可以正常显示了。
    Visual Studio 2019默认的RichEdit版本是2.0,而现在RichEdit已经出了很多新版本,如RichEdit 4.1。使用RichEdit 4.1的方法如下:
    打开解决方案资源管理器,找到XXX.rc文件(XXX是工程名),右击,点击“查看代码”。
    查看代码
    在里面我们可以找到一句

    CONTROL         "",IDC_XXX,"RichEdit20W",WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x3144,0,35,345,175
    

    把其中的"RichEdit20W"改为"RichEdit50W",然后InitInstance中的AfxInitRichEdit2();改为AfxInitRichEdit5();,就OK了。
    注:修改为RichEdit 4.1后,MFC会识别不了,所以无法修改属性,建议在修改之前把RichEdit的属性修改好。

    RichEdit之基本函数

    RichEdit的功能被封装在CRichEditCtrl类里。我们可以为控件添加一个变量,或者通过GetDlgItem获取句柄。
    点击此处跳转到MSDN的相关介绍
    CRichEditCtrl类的常用函数如下:

    获取/设置属性函数

    注:以下函数除标*的外,均有与其对应的Set函数,功能也相对应,还有一些函数是派生过来的,如GetWindowText等,此处不再赘述。

    GetSelectionCharFormat

    DWORD GetSelectionCharFormat(CHARFORMAT2W& cf) const;
    

    获取选定内容的字体格式。
    cf:用来接收字体格式。

    GetDefaultCharFormat

    DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const;
    

    获取默认的字体格式。
    cf:用来接收字体格式。

    GetSel

    void GetSel(CHARRANGE& cr) const;
    
    void GetSel(
        long& nStartChar,
        long& nEndChar) const;
    

    获取用户选定的范围。
    cr:用来接收范围。
    nStartChar:用来接收选定内容的开始坐标。
    nEndChar:用来接收选定内容的结束坐标。

    GetSelText *

    CString GetSelText() const;
    

    用来获取选定内容。

    GetParaFormat

    DWORD GetParaFormat(PARAFORMAT2& pf) const;
    

    获取选定内容的段落属性。
    pf:用来接收字体格式。

    GetEventMask

    long GetEventMask() const;
    

    获取RichEdit的事件掩码。
    事件掩码说明了RichEdit把哪些消息通知给父窗口。该函数并不常用,常用的是SetEventMask。至于具体应该设置哪些属性,你添加一些消息处理事件时VS自动生成的注释会告诉你。如添加OnEnMsgfilterXXX函数时,VS会提示:

    	// TODO:  控件将不发送此通知,除非您重写
    	// CDialogEx::OnInitDialog() 函数,以将 EM_SETEVENTMASK 消息发送
    	// 到该控件,同时将 ENM_KEYEVENTS 或 ENM_MOUSEEVENTS 标志
    	//“或”运算到 lParam 掩码中。
    

    这时,我们就需要使用SetEventMask函数设置属性。

    设置/获取缩放比例

    MFC没有把该功能封装成函数,但可以通过SendMessageW设置。格式如下:

    RichEdit.SendMessageW(EM_SETZOOM,N,D);//设置缩放比例
    RichEdit.SendMessageW(EM_GETZOOM,&N,&D);//获取缩放比例
    

    N:缩放比例的分子。
    D:缩放比例的分母。

    撤销/恢复函数

    CanUndo

    BOOL CanUndo() const;
    

    获取是否可以撤销。

    CanRedo

    BOOL CanRedo() const;
    

    获取是否可以恢复。

    EmptyUndoBuffer

    void EmptyUndoBuffer();
    

    清除撤销缓冲区,使RichEdit无法撤销。
    注意:使用SetWindowText函数时,会自动清除撤销缓冲区。

    Undo

    BOOL Undo();
    

    撤销一次操作。

    Redo

    BOOL Redo();
    

    恢复上一次撤销的操作。

    复制/粘贴函数

    Copy

    void Copy();
    

    把选定内容复制到剪贴板。

    CanPaste

    BOOL CanPaste(UINT nFormat = 0) const;
    

    获取是否能粘贴。
    nFormat:想粘贴的剪贴板格式。0为不指定。

    Paste

    void Paste();
    

    将剪贴板内容粘贴到RichEdit光标处。

    PasteSpecial

    void PasteSpecial(
        UINT nClipFormat,
        DWORD dvAspect = 0,
        HMETAFILE hMF = 0);
    

    粘贴为特殊格式。
    nClipFormat:想粘贴的剪贴板格式。
    其余两个参数不常用,一般为默认值。

    流输入/输出

    StreamIn/StreamOut

    long StreamIn(
        int nFormat,
        EDITSTREAM& es);
    long StreamOut(
        int nFormat,
        EDITSTREAM& es);
    

    将RichEdit中的内容输出到流中,或从流中输入到RichEdit。
    nFormat:StreamIn只能是SF_TEXT(纯文本)或SF_RTF(RTF格式),(StreamOut还有其它设置,但不常用)指定输入或输出的格式。
    这些值中的任意一个都可以与 SFF_SELECTION结合使用 。 如果指定了SFF_SELECTION ,StreamOut 则将当前选定内容输出到输出流中。 如果未指定, StreamOut 则输出整个RichEdit的内容。
    es:指定输入/输出流。dwCookie参数一般设为CFile对象,pfnCallback是回调函数。详见此处

    查找/替换

    FindText

    long FindText(
        DWORD dwFlags,
        FINDTEXTEX* pFindText) const;
    

    查找指定文本。
    dwFlags:点击此处了解详情
    pFindText:点击此处了解详情

    RichEdit之字体设置

    要注意,这里的字体不仅仅指我们平常说的字体,还包括字号、文本颜色、背景颜色、加粗、斜体等信息。这些信息被封装到CHARFORMAT2W结构体里,通过相关函数设置。下面,我们来介绍一下这个结构体。点击此处跳转到MSDN的相关介绍

    typedef struct _charformat2w {
      UINT     cbSize;
      DWORD    dwMask;
      DWORD    dwEffects;
      LONG     yHeight;
      LONG     yOffset;
      COLORREF crTextColor;
      BYTE     bCharSet;
      BYTE     bPitchAndFamily;
      WCHAR    szFaceName[LF_FACESIZE];
      WORD     wWeight;
      SHORT    sSpacing;
      COLORREF crBackColor;
      LCID     lcid;
      union {
        DWORD dwReserved;
        DWORD dwCookie;
      };
      DWORD    dwReserved;
      SHORT    sStyle;
      WORD     wKerning;
      BYTE     bUnderlineType;
      BYTE     bAnimation;
      BYTE     bRevAuthor;
      BYTE     bUnderlineColor;
    } CHARFORMAT2W;
    

    cbSize:这个成员是结构体的大小,一般为sizeof(CHARFORMAT2W)
    dwMask:这个成员相当于电闸,控制哪些成员是有效的。所有的标识符都由CFM开头,可以分为两类,一类是控制dwEffects的哪些值是有效的,一类是指定哪些成员是有效的。下面列举几个常用的例子。
    控制成员变量的值:

    意义
    CFM_BACKCOLOR背景颜色crBackColor有效
    CFM_COLOR字体颜色crTextColor有效
    CFM_FACE字体szFaceName有效
    CFM_SIZE文字大小yHeight有效
    CFM_UNDERLINETYPE下划线类型bUnderlineType有效

    控制dwEffects的值和dwEffects的值基本相同,只是一个前缀是CFM一个是CFE而已。如果你想使用dwEffects的某个格式,如CFE_BOLD,你还需要在dwMask中也设上CFM_BOLD。
    dwEffects:字符的特殊效果。具体可用的值如下表(机器翻译,可能有错误的地方)。

    意义
    CFE_ALLCAPS字符都是大写字母。该值不影响控件显示文本的方式。此值仅适用于 Microsoft Rich Edit 3.0 之前的版本。
    CFE_AUTOBACKCOLOR背景颜色是GetSysColor( COLOR_WINDOW )的返回值。如果设置了此标志,则忽略crBackColor成员。
    CFE_AUTOCOLOR文本颜色是GetSysColor ( COLOR_WINDOWTEXT )的返回值。如果设置了此标志,则忽略crTextColor成员。
    CFE_BOLD字符是加粗的。
    CFE_DISABLED字符显示的阴影偏移了 3/4 点或一个像素,以较大者为准。
    CFE_EXTENDED字符是脚本中不太常见的成员。支持脚本的字体应该检查它是否具有此类字符的字形。
    CFE_FONTBOUND字体由 Rich Edit 控件选择,因为活动字体不支持字符。这个过程称为字体绑定。
    CFE_HIDDEN对于 Microsoft Rich Edit 3.0 及更高版本,不显示字符。
    CFE_IMPRINT字符显示为压印字符。该值不影响控件显示文本的方式。
    CFE_ITALIC字符为斜体。
    CFE_LINK当鼠标指针悬停在具有CFE_LINK效果的文本上时, Rich Edit 可以在收到鼠标消息时发送EN_LINK通知代码。
    CFE_LINKPROTECTED字符是友好名称链接的一部分。
    CFE_MATH字符是数学公式。
    CFE_MATHNOBUILDUP角色不参与数学构建。例如,当应用于 / 时,/ 将不会用于构建分数。
    CFE_MATHORDINARY字符在数学区域内显示为普通文本。
    CFE_OUTLINE字符显示为轮廓字符。该值不影响控件显示文本的方式。
    CFE_PROTECTED字符受到保护;尝试修改它们将导致EN_PROTECTED通知代码。
    CFE_REVISED字符被标记为修订。
    CFE_SHADOW字符显示为阴影字符。该值不影响控件显示文本的方式。
    CFE_SMALLCAPS字符为小写字母。该值不影响控件显示文本的方式。
    CFE_STRIKEOUT字符有删除线。
    CFE_SUBSCRIPT字符是下标。CFE_SUPERSCRIPT和CFE_SUBSCRIPT值是互斥的。对于这两个值,控件会自动计算偏移量和较小的字体大小。或者,您可以使用yHeight和yOffset成员显式指定下标和上标字符的字体大小和偏移量。
    CFE_SUPERSCRIPT字符是上标。
    CFE_UNDERLINE字符有下划线。

    yHeight:指定字符高度,以twip为单位(1/1440 英寸,或 1/20 打印机点)。
    yOffset:字符距基线的偏移量,以twip为单位。如果该成员的值为正,则该字符为上标;如果值为负,则该字符为下标。
    crTextColor:文字颜色。要生成COLORREF,请使用RGB宏。
    bCharSet:字符集值。它可以是为LOGFONT结构的lfCharSet成员指定的值之一。
    bPitchAndFamily:指定字体间距。该成员与LOGFONT结构的lfPitchAndFamily成员相同。
    szFaceName:指定字体名称。
    crBackColor:背景颜色。
    bUnderlineType:
    指定下划线类型。具体参阅MSDN。
    bUnderlineColor:下划线颜色。具体参阅MSDN。

    根据这些知识,我们就可以修改RichEdit的字体了。
    示例:

    CHARFORMAT2W cf;
    	ZeroMemory(&cf, sizeof(CHARFORMAT2W));
    	wcscpy_s(cf.szFaceName, L"宋体");
    	cf.dwMask = CFM_BACKCOLOR | CFM_CHARSET | CFM_COLOR | CFM_SUPERSCRIPT | CFM_SUBSCRIPT |
    		CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_BOLD |
    		CFM_LINK | CFM_UNDERLINETYPE;
    	cf.yHeight = 300;
    	cf.crBackColor = RGB(255, 255, 0);
    	cf.dwEffects=CFE_BOLD|CFE_STRIKEOUT|CFE_ITALIC;
    	int l = RichEdit.GetWindowTextLengthW();
    	RichEdit.SetSel(0, l);
    	RichEdit.SetSelectionCharFormat(cf);
    	RichEdit.SetSel(l, l);
    

    RichEdit之段落格式设置

    回想一下Word,里面除了字体功能经常用以外,还有一个常用的功能——段落功能。在RichEdit中,段落信息被封装到了PARAFORMAT2结构体里。点击此处跳转到MSDN的相关介绍

    typedef struct _paraformat2 {
      UINT  cbSize;
      DWORD dwMask;
      WORD  wNumbering;
      union {
        WORD wReserved;
        WORD wEffects;
      };
      LONG  dxStartIndent;
      LONG  dxRightIndent;
      LONG  dxOffset;
      WORD  wAlignment;
      SHORT cTabCount;
      LONG  rgxTabs[MAX_TAB_STOPS];
      LONG  dySpaceBefore;
      LONG  dySpaceAfter;
      LONG  dyLineSpacing;
      SHORT sStyle;
      BYTE  bLineSpacingRule;
      BYTE  bOutlineLevel;
      WORD  wShadingWeight;
      WORD  wShadingStyle;
      WORD  wNumberingStart;
      WORD  wNumberingStyle;
      WORD  wNumberingTab;
      WORD  wBorderSpace;
      WORD  wBorderWidth;
      WORD  wBorders;
    } PARAFORMAT2;
    

    dwMask:同CHARFORMAT2W中的dwMask,指定哪些成员有效,下面列举几个常用值。

    意义
    PFM_ALIGNMENT对齐方式wAlignment成员有效
    PFM_LINESPACING行间距dyLineSpacing和行间距类型bLineSpacingRule成员有效
    PFM_SPACEAFTER/PFM_SPACEBEFORE段前/段后空白dySpaceAfter/Before成员有效

    控制dwEffects的值和dwEffects的值基本相同,只是一个前缀是PFM一个是PFE而已。如果你想使用dwEffects的某个格式你还需要在dwMask中也设上相应格式。
    wAlignment:段落对齐方式。此成员可以是以下值之一。

    意义
    PFA_LEFT左对齐
    PFA_RIGHT右对齐
    PFA_CENTER居中
    PFA_JUSTIFY两端对齐
    5分散对齐

    dySpaceBefore/dySpaceAfter:段落上/下方间距。
    dyLineSpacing:指定行间距的值。该值的意义取决于bLineSpacingRule。
    bLineSpacingRule:行间距的类型,可以是以下值之一。

    意义
    0单倍行距。 忽略dyLineSpacing成员。
    11.5倍行距。 忽略dyLineSpacing成员。
    22倍行距。忽略 dyLineSpacing成员。
    3最小值。当dyLineSpacing大于最小行距时,使用dyLineSpacing指定的行距,否则使用最小行距。单位:twip
    4固定值。严格使用dyLineSpacing指定的行距。单位:twip
    5dyLineSpacing / 20 (注意:它们是20倍关系)的值 是从一行到下一行的间距(以行为单位)。因此,将dyLineSpacing设置 为 20 会生成单倍行距的文本,40 是双倍行距,60 是三倍行距,依此类推。

    其它成员参见MSDN。

    后记

    我最近用这些知识做了一个模仿Word的小程序,附上链接:
    介绍
    代码下载

    展开全文
  • 1,建立空文档失败  把 AfxInitRichEdit(); 放在InitInstance()的最前面  2 跟该RichEdit 控件绑定一个CRichEditCtrl变量(如:m_REOut)  m_REOut.SetWindowTe

    http://zhanyonhu.blog.163.com/blog/static/1618604420086542132610/

    1,建立空文档失败

         把 AfxInitRichEdit();  放在InitInstance()的最前面 

    2 跟该RichEdit 控件绑定一个CRichEditCtrl变量(如:m_REOut)

      m_REOut.SetWindowText 后只能输入一行 并多行内容显示不出来

      属性->multiline 打勾

    展开全文
  • 我想做个写信的东西,用的RichEdit控件,怎么完成控件上面的那些"粗体、斜体、下划线、添加图片、连接等等"功能。[img=https://img-bbs.csdn.net/upload/201703/31/1490940577_859644.jpg][/img]
  • 添加RichEdit控件,并在程序起始的地方初始化 AfxInitRichEdit2(),如果没有该步骤,会闪一下退出。 BOOL CMOSHENApp::InitInstance() { AfxInitRichEdit2(); //RichEdit 2.0控件,必须在CWinApp函数初始化调用 ...

    使用前的工作

    添加RichEdit控件,并在程序起始的地方初始化 AfxInitRichEdit2(),如果没有该步骤,会闪一下退出。

    BOOL CMOSHENApp::InitInstance()
    {
       AfxInitRichEdit2(); //RichEdit 2.0控件,必须在CWinApp函数初始化调用
       return TRUE;
    }
    

    在这里插入图片描述

    //对话框类头文件增加:
    CRichEditCtrl m_richedit;

    给颜色按钮添加下述代码

    //.h
    afx_msg void OnBnClickedBtncolor();
    
    //RichEidt2.0 字体设置颜色
    void CUserManual::OnBnClickedBtncolor()
    {
        // TODO: 在此添加控件通知处理程序代码
       CHARFORMAT cf = { 0 };
       cf.cbSize = sizeof(CHARFORMAT);
       m_richedit.GetSelectionCharFormat(cf);
    
       CColorDialog colorDialog(cf.crTextColor);
       if (colorDialog.DoModal() == IDOK)
       {
        cf.crTextColor = colorDialog.GetColor();
        cf.dwMask = CFM_COLOR;
        cf.dwEffects = 0;
        m_richedit.SetSelectionCharFormat(cf);
       }
    }
    

    在这里插入图片描述

    给字体按钮增加代码

    //.h
    afx_msg void OnBnClickedBtnfont();
    
    //.cpp
    //RichEidt2.0 字体设置字体
    void CUserManual::OnBnClickedBtnfont()
    {
     // TODO: 在此添加控件通知处理程序代码
      CHARFORMAT cf = { 0 };
      cf.cbSize = sizeof(CHARFORMAT);
      m_richedit.GetSelectionCharFormat(cf);
    
      CFontDialog fontDialog(cf);
    
      if (fontDialog.DoModal() == IDOK)
      {
          fontDialog.GetCharFormat(cf);
          m_richedit.SetSelectionCharFormat(cf);
      }
    }
    
    

    在这里插入图片描述

    上面的例子都是在后期进行更改,那么如何在我编码的时候直接在RichEdit控件中改变字体的格式呢?
    下述几个例子可以作为参考:

    Example:加粗

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);//RichEdit
    CHARFORMAT cf;								             //定义字体格式结构体变量
    cf.cbSize = sizeof(cf);
    cf.dwEffects = CFE_BOLD;              //设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
    cf.dwMask    = CFM_BOLD;
    m_pRichEdit->SetDefaultCharFormat(cf);				    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example:字体大小

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);//RichEdit
    CHARFORMAT cf;						      //定义字体格式结构体变量
    cf.cbSize = sizeof(cf);
    cf.yHeight = 300;                         //字体的大小(并非我们常见的字号概念)
    cf.dwMask = CFM_SIZE;
    m_pRichEdit->SetDefaultCharFormat(cf);    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example: 设置斜体

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);//RichEdit
    CHARFORMAT cf;						      //定义字体格式结构体变量
    cf.cbSize = sizeof(cf);
    cf.dwEffects = CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
    cf.dwMask    = CFM_ITALIC;
    m_pRichEdit->SetDefaultCharFormat(cf);    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example:下划线

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);//RichEdit
    CHARFORMAT cf;						      //定义字体格式结构体变量
    cf.cbSize = sizeof(cf);
    cf.dwMask|=CFM_UNDERLINE;
    cf.dwEffects|=CFE_UNDERLINE;//设置下划线,取消用cf.dwEffects&=~CFE_UNDERLINE;
    m_pRichEdit->SetDefaultCharFormat(cf);    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example:设置颜色

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);//RichEdit
    CHARFORMAT cf;						      //定义字体格式结构体变量
    cf.cbSize = sizeof(cf);
    cf.dwMask|=CFM_COLOR;
    cf.crTextColor = RGB(255,0,0);//设置颜色
    m_pRichEdit->SetDefaultCharFormat(cf);    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example:设置字体

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);//RichEdit
    CHARFORMAT cf;						      //定义字体格式结构体变量
    cf.cbSize = sizeof(cf);
    cf.dwMask|=CFM_FACE;
    _tcscpy(cf.szFaceName ,_T("隶书"));//设置字体
    m_pRichEdit->SetDefaultCharFormat(cf);    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example:设置行间距

    BOOL CUserManual::OnInitDialog()
    {
    CRichEditCtrl* m_pRichEdit;
    m_pRichEdit = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);
    PARAFORMAT2   pf;  
    memset(&pf,   0,   sizeof(pf));  
    pf.cbSize   =   sizeof(PARAFORMAT2);  
    pf.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
    pf.dyLineSpacing = 800;
    pf.bLineSpacingRule = 1;
    m_pRichEdit->SetParaFormat(pf); //控件变量 
    m_pRichEdit->SetDefaultCharFormat(cf);    //设置控件默认的字体格式
    
    return TRUE;
    }
    

    在这里插入图片描述

    Example:增加按钮,选择某一段重新设置格式

    long   nStart   =   0;       
    long   nEnd     =  m_pRichEdit->GetTextLength();   
    m_pRichEdit->SetSel(nStart,nEnd);    
    m_pRichEdit->SetSelectionCharFormat(cf);
    

    具体作用没有测试,应该是可以实现增加一个按钮,选择一段文字,点击按钮,然后该段文字编程该按钮预设定的格式。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,772
精华内容 708
关键字:

mfcrichedit控件