基于对话框的程序,怎样自定义自己的右键菜单呢?
我们知道对于(Edit box)控件来说,它默认的有自己的右键菜单,而对于我们自己定义的(Rich Edit)控件控件来说,却没有右键功能。CRichEditVCtrl的主要功能用于实现设置字体、设置字体颜色、设置字号等都提供了完善的支持。这些内容后面再做总结。今天我们主要来谈谈,用CRichEditVCtrl来实现右键功能的添加。
一:首先新添一个以CRichEditVCtrl为基类的子类(如CRichEditVCtrEX),添加WM_RBUTTONUP消息映射处理.
#include "RichEditCtrlEx.h"头文件中添加自定义的消息响应函数原型的声明,如:
protected:
//{{AFX_MSG(CRichEditCtrlEx)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnRButtonUp(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(); // 字体
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
相关代码解释:
上述由于是自定义的消息响应函数原型,因而我们直接利用CRichEditVCtrl的相关函数实现对消息响应的实现代码如Copy(), Cut()等当然也可以写在源文件中,只是没这个必要。set(0, -1) // 选择此CRichEditCtrl对象中的索引文本,可以用一个为0的开始索引和一个为-1的结束索引来调用SetSel
二:在源文件RichEditCtrlEx.cpp中有,在开头出添加自定义
#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
①在AFX_MSG_MAP中添加消息映射宏,如:
BEGIN_MESSAGE_MAP(CRichEditCtrlEx, CRichEditCtrl)
//{{AFX_MSG_MAP(CRichEditCtrlEx)
ON_WM_CREATE()
ON_WM_RBUTTONUP()
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)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
②在添加消息响应的实现代码,如:
// 生成右键菜单
void CRichEditCtrlEx::OnRButtonUp(UINT nFlags, CPoint point)
{
//设置为焦点
SetFocus();
//创建一个弹出式菜单
CMenu popmenu;
popmenu.CreatePopupMenu();
//添加菜单项目
popmenu.AppendMenu(0, ID_RICH_UNDO, "撤销(&U)");
popmenu.AppendMenu(0, MF_SEPARATOR); // 项之间的分割线
popmenu.AppendMenu(0, ID_RICH_CUT, "剪切(&X)");
popmenu.AppendMenu(0, ID_RICH_COPY, "复制(&C)");
popmenu.AppendMenu(0, ID_RICH_PASTE, "粘贴(&P)");
popmenu.AppendMenu(0, ID_RICH_CLEAR, "清空(&T)");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SELECTALL, "全选(&A)");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SETFONT, "字体(&F)");
//初始化菜单项
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();
CRichEditCtrl::OnRButtonDown(nFlags, point);
}
void CRichEditCtrlEx::OnSelectfont()
{
// TODO: Add your command handler code here
CHARFORMAT cf;
LOGFONT lf;
memset(&cf, 0, sizeof(CHARFORMAT));
memset(&lf, 0, sizeof(LOGFONT));
//判断是否选择了内容
BOOL m_bSelect = (GetSelectionType() != SEL_EMPTY) ? TRUE : FALSE;
if (m_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 (m_bSelect)
SetSelectionCharFormat(cf); //为选定的内容设定所选字体
else
SetWordCharFormat(cf); //为将要输入的内容设定字体
}
}
接下来的一步就是我们给对应的的Rich Edit编辑框添加变量m_RichEditCtrlEX,类型为Control,基类为CRichEditVCtrl, 返回到C~Dlg.cpp中找到相关如下代码,我们做这样的改动,如下:
// Dialog Data
//{{AFX_DATA(CChatDlg)
enum { IDD = IDD_CHAT_DIALOG };
CRichEditCtrl m_RichEditCtrl; // 删除这个定义
CButton m_Isbold;
//}}AFX_DATA
CRichEditCtrlEx m_RichEditCtrl; // 添加这个定义
注意:
再在C~Dlg的头文件中添加#include "RichEditCtrlEx.h"
在InitInstance()函数中添加AfxInitRichEdit();
这样我们就将自己定义的CRichEditCtrlEx与相关的C~Dlg.cppl联系到了一起。至此,完成。
特此声明:
本文源出自:
http://www.vckbase.com/document/viewdoc/?id=328