注意:MFC中使用RichEdit控件時需要在RichEditUse.cpp文件中的InitInstance()函數中添加初始化函數AfxInitRichEdit2();
1、RichEdit控件簡單應用
為方便演示本例創建RichContrl基於對話框,生成CRichContrlDlg.h和CRichContrlDlg.cpp兩個文件,在.cpp文件中宏定義:
#define COLOR_BLUE RGB(0, 0, 128) #define COLOR_RED RGB(0xFF, 0, 0) #define COLOR_GREEN RGB(0x2e, 0x8b, 0x57) #define COLOR_WHITE RGB(255, 255, 255) #define COLOR_BLACK RGB(0, 0, 0) #define COLOR_YELLOW RGB(250, 250, 60)
從工具箱中拖拽richedit控件、editcontrl控件、按鈕到對話框中,ID分別為IDC_RICHEDIT_SHOW、IDC_EDIT_INPUT,然后在CRichContrlDlg.h中申明函數void DrawTextToREdit(CString szMessage, UINT uiREditId, COLORREF crTextCr, COLORREF crBackCr, int nFontSize);返回CRichContrlDlg.cpp實現函數DrawTextToREdit()如下:

1 void CRichContrlDlg::DrawTextToREdit(CString szMessage, UINT uiREditId, COLORREF crTextCr, COLORREF crBackCr, int nFontSize) 2 { 3 CRichEditCtrl* pREdit = (CRichEditCtrl*)this->GetDlgItem(uiREditId); 4 CFont font; 5 font.CreateFont( 6 nFontSize, //字體的高度 7 0, //字體的寬度 8 0, //字體的傾斜角 9 0, //字體的傾斜角 10 FW_LIGHT, //字體的粗細 11 FALSE, //字體是否為斜體 12 FALSE, //字體是否為下划線 13 FALSE, //字體是否有刪除線 14 ANSI_CHARSET, //字體使用的字符集 15 OUT_TT_PRECIS, //指定如何選擇合適的字體 16 CLIP_DEFAULT_PRECIS, //用來確定裁剪的精度 17 PROOF_QUALITY, //怎么樣跟選擇的字體相符合 18 FF_MODERN | FIXED_PITCH,//距標志和屬性標志 19 _T("楷體") //字體的名稱 20 ); 21 this->GetDlgItem(uiREditId)->SetFont(&font); 22 pREdit->SetBackgroundColor(FALSE, crBackCr); 23 CHARFORMAT cf; 24 ::memset(&cf, 0, sizeof(cf)); 25 cf.dwMask = CFM_COLOR | CFM_BOLD; 26 cf.dwEffects = CFE_BOLD; 27 cf.crTextColor = crTextCr; 28 pREdit->SetDefaultCharFormat(cf); 29 this->SetDlgItemText(uiREditId, szMessage); 30 }
給按鈕添加事件處理程序,調用DrawTextToREdit()函數:
void CRichContrlDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 CString input_str; this->GetDlgItemText(IDC_EDIT_INPUT, input_str); DrawTextToREdit(input_str, IDC_RICHEDIT_SHOW, COLOR_WHITE, COLOR_GREEN, 120); }
效果截圖:
2、RichEdit控件和Check控件結合使用
新建一個基於對話框的MFC程序,工具箱中拖拽三個復選框控件、richedit控件、按鈕控件到對話框中,並在CRichEditUseDlg.h文件中添加控件變量,如下所示:
public: afx_msg void OnTextColor(); afx_msg void OnBold(); afx_msg void OnItalic(); afx_msg void OnUnderline(); CRichEditCtrl m_RichSample; //RichEdit控件變量 CButton m_ctlBold; //粗體復選框 CButton m_ctlItalic; //斜體復選框 CButton m_ctlUnderline; //下划線復選框
接下來在CRichEditUseDlg.cpp文件中分別給各個控件添加事件處理函數:

1 //按鈕的事件處理函數 2 void CRichEditUseDlg::OnTextColor() 3 { 4 // TODO: 在此添加控件通知處理程序代碼 5 CHARFORMAT cf; 6 memset(&cf, '\0', sizeof(CHARFORMAT)); 7 cf.dwMask = CFM_COLOR; 8 m_RichSample.GetSelectionCharFormat(cf); 9 CColorDialog cc(cf.crTextColor); //彈出顏色選擇對話框 10 if (cc.DoModal() == IDCANCEL) 11 { 12 return; 13 } 14 cf.dwMask = CFM_COLOR; 15 cf.dwEffects &= ~CFE_AUTOCOLOR; 16 cf.crTextColor = cc.GetColor(); 17 m_RichSample.SetSelectionCharFormat(cf); 18 m_RichSample.SetFocus(); 19 } 20 21 //粗體復選框事件處理函數 22 void CRichEditUseDlg::OnBold() 23 { 24 // TODO: 在此添加控件通知處理程序代碼 25 CHARFORMAT cf; //結構體 26 m_RichSample.GetSelectionCharFormat(cf); 27 cf.dwMask |= CFM_BOLD; 28 cf.dwEffects ^= CFE_BOLD; 29 m_RichSample.SetSelectionCharFormat(cf); 30 if (cf.dwEffects & CFE_BOLD) //當前為粗體 31 { 32 m_ctlBold.SetCheck(1); //設置按鈕被選 33 } 34 else //當前不為粗體 35 { 36 m_ctlBold.SetCheck(0); //設置按鈕未被選中 37 } 38 m_RichSample.SetFocus(); 39 } 40 41 //斜體復選框事件處理函數 42 void CRichEditUseDlg::OnItalic() 43 { 44 // TODO: 在此添加控件通知處理程序代碼 45 CHARFORMAT cf; 46 m_RichSample.GetSelectionCharFormat(cf); 47 cf.dwMask |= CFM_ITALIC; 48 cf.dwEffects ^= CFE_ITALIC; 49 m_RichSample.SetSelectionCharFormat(cf); 50 if (cf.dwEffects & CFM_ITALIC) //當前為斜體 51 { 52 m_ctlItalic.SetCheck(1); //設置按鈕被選中 53 } 54 else //當前不為斜體 55 { 56 m_ctlItalic.SetCheck(0); //設置按鈕未被選中 57 } 58 m_RichSample.SetFocus(); 59 } 60 61 //下划線復選框事件處理函數 62 void CRichEditUseDlg::OnUnderline() 63 { 64 // TODO: 在此添加控件通知處理程序代碼 65 CHARFORMAT cf; 66 m_RichSample.GetSelectionCharFormat(cf); 67 cf.dwMask |= CFM_UNDERLINE; 68 cf.dwEffects ^= CFE_UNDERLINE; 69 m_RichSample.SetSelectionCharFormat(cf); 70 if (cf.dwEffects & CFM_UNDERLINE) //當前帶有下划線 71 { 72 m_ctlUnderline.SetCheck(1); //設置按鈕被選中 73 } 74 else //當前不帶有下划線 75 { 76 m_ctlUnderline.SetCheck(0); //設置按鈕未被選中 77 } 78 m_RichSample.SetFocus(); 79 }
效果圖:
3、從文件中讀取內容並存入數組中
添加類TestItem,在該類中申明:
class TestItem { public: TestItem(void); ~TestItem(void); CString m_szIteamName; CString m_szSpec1; CString m_szSpec2; CString m_szSpec3; CString m_szSpec4; CString m_szSpec5; CString m_szSpec6; };
對應的.cpp文件中初始化變量:
#include "pch.h" #include "TestItem.h" TestItem::TestItem(void) { this->m_szIteamName = _T(""); this->m_szSpec1 = _T(""); this->m_szSpec2 = _T(""); this->m_szSpec3 = _T(""); this->m_szSpec4 = _T(""); this->m_szSpec5 = _T(""); this->m_szSpec6 = _T(""); } TestItem::~TestItem(void) { }
在對話框中實現函數:
1 void CThreadTestDlg::InitItem() { 2 //項目名全部暫時清空 3 for (int i = 0;i < 50;i++) { 4 this->m_objTestItem[i].m_szIteamName = _T(""); 5 } 6 CString szCsvPath = _T(".\\temp.log"); 7 CStdioFile file; 8 if (file.Open(szCsvPath, CFile::modeRead | CFile::shareDenyNone)) { 9 int nItemCount = 0; 10 CString sz1LineStr; 11 while (file.ReadString(sz1LineStr)) 12 { 13 CString szItemTmp = _T(""); 14 // 0 15 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 16 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 17 this->m_objTestItem[nItemCount].m_szIteamName = szItemTmp; 18 // 1 19 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 20 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 21 this->m_objTestItem[nItemCount].m_szSpec1 = szItemTmp; 22 // 2 23 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 24 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 25 this->m_objTestItem[nItemCount].m_szSpec2 = szItemTmp; 26 // 3 27 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 28 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 29 this->m_objTestItem[nItemCount].m_szSpec3 = szItemTmp; 30 // 4 31 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 32 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 33 this->m_objTestItem[nItemCount].m_szSpec4 = szItemTmp; 34 // 5 35 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 36 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 37 this->m_objTestItem[nItemCount].m_szSpec5 = szItemTmp; 38 // 6 39 szItemTmp = sz1LineStr.SpanExcluding(_T(",")); 40 sz1LineStr.Delete(0, szItemTmp.GetLength() + 1); 41 this->m_objTestItem[nItemCount].m_szSpec6 = szItemTmp; 42 nItemCount++; 43 } 44 } 45 }