如何修改CEdit类自带的Menu,我想让其中一些不可用.

冰霜icefrost 2006-10-25 11:49:15
如何修改CEdit类自带的Menu,我想让其中一些不可用.
...全文
202 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰霜icefrost 2006-10-27
  • 打赏
  • 举报
回复
我已经重写一个类了,只是不知道继承哪个方法,修改哪个函数.
BBirdlyh 2006-10-27
  • 打赏
  • 举报
回复
OnContextMenu
HuWenjin 2006-10-27
  • 打赏
  • 举报
回复
应该直接处理CEdit::OnContextMenu 就可以了
pb520wf 2006-10-26
  • 打赏
  • 举报
回复
是啊,重写类是一个不错的方法,而且更方便。
Y___Y 2006-10-25
  • 打赏
  • 举报
回复
http://www.codeproject.com/editctrl/cmenuedit.asp


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("©")
#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);
}

wxshzf 2006-10-25
  • 打赏
  • 举报
回复
我也有此需求
jamesjinyongming 2006-10-25
  • 打赏
  • 举报
回复
还得重写,继承一下,很简单的
dysxq 2006-10-25
  • 打赏
  • 举报
回复
试试WM_INITMENUPOPUP,如果还不行,可能只能用hook了
冰霜icefrost 2006-10-25
  • 打赏
  • 举报
回复
谢谢,
不过上面的方法是通过重新生成自己的Menu,并没有使用CEdit类的Menu呀.

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧