|
自定义 CRichEditCtrl 控件
作者:sonystone 下载本文的源代码
二. 然后我们添加鼠标右键消息,在其中添加代码如下: //设置为焦点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 Set
然后在我们需要的地方添加头文件和实现文件,将定义的CRichEditCtrl对象改为用CMyRichEdit来定义,就可以了。还有提醒的就是不要忘记在InitInstance()中调用AfxInitRichEdit() |