MFC—RichEdit控件有關使用


注意: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  }
View Code

給按鈕添加事件處理程序,調用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 }
View Code

效果圖:

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM