程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC中自定義CRichEditCtrl控件

VC中自定義CRichEditCtrl控件

編輯:vc教程

  在VC中提供了兩種很方便的編輯控件(CEdit 和CRichEditCtrl),一般來說這兩種控件已經滿足了我們大部分的需要,不過只有CEdit控件能響應我們鼠標右鍵消息,通過右鍵我們很容易的操作我們的編輯,而在CRichEditCtrl控件中我們不能得到這樣的操作,同時CRichEditCtrl是能夠包含各種格式的內容,就好像Word一樣能夠寫入各種不同的字體,不過CRichEditCtrl沒有給我們提供這樣的要求,今天我的目的也就是給他添加這樣的擴展操作。

 
 

  本代碼運行效果圖

  一. 首先我們要從CRichEditCtrl類派生一個我們自己的類CMyRichEdit,我們的操作也是在其中完成的。

  二. 然後我們添加鼠標右鍵消息,在其中添加代碼如下:

//設置為焦點
SetFocus();
//創建一個彈出式菜單
CMenu popmenu;
popmenu.CreatePopupMenu();
//添加菜單項目
popmenu.AppendMenu(0, ID_RICH_UNDO, "&Undo");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_CUT, "&Cut");
popmenu.AppendMenu(0, ID_RICH_COPY, "C&opy");
popmenu.AppendMenu(0, ID_RICH_PASTE, "&Paste");
popmenu.AppendMenu(0, ID_RICH_CLEAR, "C&lear");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SELECTALL, "Select &All");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SETFONT, "Select &Font");
//初始化菜單項
UINT nUndo=(CanUndo() ? 0 : MF_GRAYED );
popmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo);
UINT nSel=((GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED) ;
popmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSel);
popmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSel);
popmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nSel);
UINT nPaste=(CanPaste() ? 0 : MF_GRAYED) ;
popmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste);
//顯示菜單
CPoint pt;
GetCursorPos(&pt);
popmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
popmenu.DestroyMenu();

  三. 然後在.h文件中加入如下的ID定義:

#define ID_RICH_UNDO           101
#define ID_RICH_CUT             102
#define ID_RICH_COPY            103
#define ID_RICH_PASTE           104
#define ID_RICH_CLEAR          105
#define ID_RICH_SELECTALL      106
#define ID_RICH_SETFONT        107
  不過這些值還可以通過VC++編譯器中的菜單VIEw->Resource Symbols進行添加。 四. 添加消息相應操作,由於這些ID是我們自己定義的,所以我們只能手動添加:

  1.在頭文件中添加:

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnCopy() { Copy(); }
afx_msg void OnCut() { Cut(); }
afx_msg void OnPaste() { Paste(); }
afx_msg void OnSelectall() { SetSel(0, -1); }
afx_msg void OnUndo() { Undo(); }
afx_msg void OnClear() { Clear(); }
afx_msg void OnSelectfont();//改變字體
  2.在實現文件的消息映射宏中添加如下:

ON_COMMAND(ID_RICH_COPY, OnCopy)
ON_COMMAND(ID_RICH_CUT, OnCut)
ON_COMMAND(ID_RICH_PASTE, OnPaste)
ON_COMMAND(ID_RICH_SELECTALL, OnSelectall)
ON_COMMAND(ID_RICH_UNDO, OnUndo)
ON_COMMAND(ID_RICH_CLEAR, OnClear)
ON_COMMAND(ID_RICH_SETFONT, OnSelectfont)
  3.最後添加字體變換函數:

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);     //為將要輸入的內容設定字體
}
  然後在我們需要的地方添加頭文件和實現文件,將定義的CRichEditCtrl對象改為用CMyRichEdit來定義,就可以了。

  還有提醒的就是不要忘記在InitInstance()中調用AfxInitRichEdit()

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved