怎么修改cedit控件的右键菜单

转载 2006年06月21日 00:12:00
 

Introduction

Have you ever wanted to modify the context menu of an edit control? You would start by overriding the OnInitMenuPopup() function only to find that the edit control does not post a WM_INITMENUPOPUP message, so your function is never called. Well, here is a simple CEdit derived class that you can use.

The CMenuEdit class

The CMenuEdit class does its job with just two functions, OnContextMenu() and OnCommand().

The OnContextMenu() function gets called when a user right-clicks on the edit control. In our override, we create a new popup menu that exactly duplicates the default context menu, and we call TrackPopupMenu() on that menu. By doing this, a WM_INITMENUPOPUP message is posted, which can then be handled in a class derived from CMenuEdit.

The OnCommand() function handles commands generated when a user selects an item from the menu. If the command is not generated by our menu, it is passed onto CEdit::OnCommand().

You can either derive your edit class from CMenuEdit or include these two functions in your class.

Updates

September 17, 2001 - Now handles read-only edit controls

The Source Files

The Header file

// MenuEdit.h : header file
// Written by PJ Arends
// pja@telus.net
// http://www3.telus.net/pja/

#if !defined(AFX_MENUEDIT_H__8EA53611_FD2B_11D4_B625_D04FA07D2222__INCLUDED_)
#define AFX_MENUEDIT_H__8EA53611_FD2B_11D4_B625_D04FA07D2222__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif 

class CMenuEdit : public CEdit
{
public:
    CMenuEdit() {};

protected:
    virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
    afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

    DECLARE_MESSAGE_MAP()
};

#endif 

The Source file

// MenuEdit.cpp : implementation file
// Written by PJ Arends
// pja@telus.net
// http://www3.telus.net/pja/

#include "stdafx.h"
#include "MenuEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MES_UNDO        _T("&Undo")
#define MES_CUT         _T("Cu&t")
#define MES_COPY        _T("&Copy")
#define MES_PASTE       _T("&Paste")
#define MES_DELETE      _T("&Delete")
#define MES_SELECTALL   _T("Select &All")
#define ME_SELECTALL    WM_USER + 0x7000

BEGIN_MESSAGE_MAP(CMenuEdit, CEdit)
    ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()

void CMenuEdit::OnContextMenu(CWnd* pWnd, CPoint point)
{
    SetFocus();
    CMenu menu;
    menu.CreatePopupMenu();
    BOOL bReadOnly = GetStyle() & ES_READONLY;
    DWORD flags = CanUndo() && !bReadOnly ? 0 : MF_GRAYED;
    menu.InsertMenu(0, MF_BYPOSITION | flags, EM_UNDO,
        MES_UNDO);

    menu.InsertMenu(1, MF_BYPOSITION | MF_SEPARATOR);

    DWORD sel = GetSel();
    flags = LOWORD(sel) == HIWORD(sel) ? MF_GRAYED : 0;
    menu.InsertMenu(2, MF_BYPOSITION | flags, WM_COPY,
        MES_COPY);

    flags = (flags == MF_GRAYED || bReadOnly) ? MF_GRAYED : 0;
    menu.InsertMenu(2, MF_BYPOSITION | flags, WM_CUT,
        MES_CUT);
    menu.InsertMenu(4, MF_BYPOSITION | flags, WM_CLEAR,
        MES_DELETE);

    flags = IsClipboardFormatAvailable(CF_TEXT) &&
        !bReadOnly ? 0 : MF_GRAYED;
    menu.InsertMenu(4, MF_BYPOSITION | flags, WM_PASTE,
        MES_PASTE);

    menu.InsertMenu(6, MF_BYPOSITION | MF_SEPARATOR);

    int len = GetWindowTextLength();
    flags = (!len || (LOWORD(sel) == 0 && HIWORD(sel) ==
        len)) ? MF_GRAYED : 0;
    menu.InsertMenu(7, MF_BYPOSITION | flags, ME_SELECTALL,
        MES_SELECTALL);

    menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON |
        TPM_RIGHTBUTTON, point.x, point.y, this);
}

BOOL CMenuEdit::OnCommand(WPARAM wParam, LPARAM lParam)
{
    switch (LOWORD(wParam))
    {
    case EM_UNDO:
    case WM_CUT:
    case WM_COPY:
    case WM_CLEAR:
    case WM_PASTE:
        return SendMessage(LOWORD(wParam));
    case ME_SELECTALL:
        return SendMessage (EM_SETSEL, 0, -1);
    default:
        return CEdit::OnCommand(wParam, lParam);
    }
}

屏蔽掉CEdit控键的右键菜单

重载WM_CONTEXTMENU就可以了      void   CMyEdit::OnContextMenu(CWnd*   pWnd,   CPoint   point)        {  ...
  • zqf_office
  • zqf_office
  • 2013年09月08日 23:47
  • 1054

CEdit去掉右键弹出式菜单

  VC中,编辑控件默认点右键的时候会弹出快捷菜单,诸如 复制,粘贴之类的,可是有时候我们想要去掉,从网上搜集的资料 主要是子类化编辑控件,然后处理WM_CONTEXTMENU休息,实际上在此消息内什...
  • jianxin2009
  • jianxin2009
  • 2010年01月25日 13:54
  • 576

CEdit的一切

SetSel(start,end)作用: 定制EDIT的所选择内容.间接地可以用于定位光标位置. 使用例子: EXP1:设置光标 CEdit*      pEdit=(CEdit*)G...
  • Arcsinsin
  • Arcsinsin
  • 2013年07月17日 19:52
  • 17558

CEditView详解

 层次继承关系 CObject CCmdTarget CWnd CView CCtrlView CEditView 1.CEditView ...
  • Andrewniu
  • Andrewniu
  • 2015年11月19日 16:34
  • 2100

优化后的CEdit自定义或屏蔽右键菜单派生类

  • 2017年06月13日 15:28
  • 2KB
  • 下载

自定义MFC CEdit控件的外观

#pragma once /* Title:自定义MFC CEdit控件的外观 目的:自定义MFC CEdit控件的边框颜色,显示内容的左上角坐标。 要改变字体和CEdit控件的大小可以在...
  • lee353086
  • lee353086
  • 2014年10月22日 09:37
  • 2080

VC++动态创建Menu

菜单是Windows的标准界面元素,几乎所有的Windows应用程序中都有它的身影。MFC中的类CMenu对它进行了封装,使其使用起来更加简便。要在程序中使用菜单也很简单,一般分以下几步:第一步先用V...
  • lcalqf
  • lcalqf
  • 2013年03月29日 23:00
  • 932

为CEdit控件设置右键菜单

FARPROC OldEditProc = NULL; LRESULT CALLBACK NewEditProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM l...
  • xiliang_pan
  • xiliang_pan
  • 2011年12月06日 14:29
  • 1161

修改CEdit的字体和颜色

本文转载自:http://blog.sina.com.cn/s/blog_4ac0eb8101010szr.html 更改对话框中控件的外观可以在其所在对话框中,响应WM_CTLCOLOR事件(...
  • Li_Carey
  • Li_Carey
  • 2015年12月21日 20:10
  • 2437

编辑框CEdit的EN_CHANGE通知消息

编辑框控件给其父窗口发送消息来报告多种输入事件。在MFC应用程序中使用ON_EN消息映射宏将这些通知传递给了处理函数。...
  • hou09tian
  • hou09tian
  • 2017年08月02日 21:43
  • 456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎么修改cedit控件的右键菜单
举报原因:
原因补充:

(最多只允许输入30个字)