CRichEditVCtrl(一)生成右键菜单

本文介绍了如何在基于对话框的程序中为CRichEditCtrl控件添加右键菜单功能。通过创建CRichEditCtrl的子类,并处理WM_RBUTTONUP消息,实现了包括撤销、复制、剪切等操作的菜单项。此外,还详细说明了菜单项的禁用状态设置以及字体选择对话框的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于对话框的程序,怎样自定义自己的右键菜单呢?

我们知道对于(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联系到了一起。至此,完成。

特此声明:

本文源出自:

自定义CRichEditCtrl控件

http://www.vckbase.com/document/viewdoc/?id=328

本人只是根据自己的心得稍加整理。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值