如何为编辑框添加右键菜单

wyjun1985 2009-01-04 03:15:30
在编辑框上右击时弹出的是系统的默认菜单,我像在这个菜单里再添加两个选项,如何才能实现呢?
...全文
201 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wap21 2009-01-05
  • 打赏
  • 举报
回复
帮顶
success000 2009-01-05
  • 打赏
  • 举报
回复
帮顶
用户 昵称 2009-01-05
  • 打赏
  • 举报
回复
俺常采用4楼的方法。
Tinary3v0 2009-01-05
  • 打赏
  • 举报
回复
在Edit父窗口的PreTranslateMessage里面去处理:
BOOL C**Dlg::PreTranslateMessage(MSG* pMsg) 
{
if( WM_RBUTTONDOWN == pMsg->message ) //截获右键消息
{
int iID;
HWND hd=(HWND)::GetFocus(); //取得当前焦点窗口句柄
iID=::GetDlgCtrlID(hd); //得到当前焦点窗口的ID

if( iID == IDC_EDIT1 ) //判断当前窗口是不是要加菜单的Edit窗口
{
CEdit * EditWnd = ( CEdit* ) GetDlgItem( iID ); //取得Edit的窗口指针

CMenu *pMenu;

CPoint pt;
GetCursorPos( &pt );
pMenu=new CMenu;

pMenu->LoadMenu( IDR_MYEDITMENU ); //加载菜单资源
CMenu *pMenuPop=pMenu->GetSubMenu(0); //一般弹出菜单是资源菜单的第一项
pMenuPop->TrackPopupMenu( TPM_LEFTALIGN, pt.x, pt.y, this );
delete pMenu;
}
}
return CDialog::PreTranslateMessage(pMsg);
}

当然用二楼的方法 自己重写一个Edit也行。
wyjun1985 2009-01-04
  • 打赏
  • 举报
回复
谢谢楼上的回答,不过我没看懂什么意思?是初学者,能否说的详细点。谢谢啦!
luckyboy1979 2009-01-04
  • 打赏
  • 举报
回复
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);
}
}
这样时更换了菜单。

16,472

社区成员

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

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

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