`
saybody
  • 浏览: 903760 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

更简单的编辑框菜单定制方法

阅读更多

更简单的编辑框菜单定制方法

Paul DiLascia的方法

在使用MFC时,我们有时需要定制编辑框(CEdit或其派生类)的右键菜单。我们可以通过重载OnContextMenu函数装载自己的菜单,并添加每个菜单项的COMMAND和UPDATE_COMMAND_UI函数。但在缺省情况下,UPDATE_COMMAND_UI函数不会被调用,导致菜单状态不能正确显示。

如果我们在网上搜索解决这个问题的方法,通常会找到一篇叫作《定制编辑框的上下文菜单》的译文(未注明原作者)。这篇文章的原文应该是Paul DiLascia的一篇问答集:FileType Icon Detector App, Custom Context Menus, Unreferenced Variables and String Conversions 。Paul DiLascia的程序一般都会这样开头:

// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.

DiLascia解决这个问题的方法是通过子类化(Subclassing)插入处理WM_INITMENUPOPUP的代码。按照DiLascia提供的方案,我们要在工程中增加以下文件:

  • Subclass.cpp、Subclass.h提供了可以子类化CWnd类及其派生类的通用类CSubclassWnd
  • MenuInit.cpp、MenuInit.h从CSubclassWnd类派生出CPopupMenuInitHandler类,处理WM_INITMENUPOPUP消息,调用每个菜单项的UPDATE_COMMAND_UI函数。
  • EditMenu.cpp、EditMenu.h从CPopupMenuInitHandler类派生出CEditMenuHandler类,处理WM_CONTEXTMENU消息,增加定制菜单。

然后,我们只要执行以下步骤:

  • 创建CEdit类的派生类。
  • 重载PreSubclassWindow函数,通过CEditMenuHandler的Install函数实现子类化,同时传入菜单资源枚举值。
  • 定制菜单资源,映射、增加菜单项的处理函数。可以委托CEditMenuHandler处理常用EDIT命令,例如剪切、复制、粘贴等。

可以只使用Subclass.cpp、Subclass.h、MenuInit.cpp、MenuInit.h这四个文件。重载PreSubclassWindow函数时,调用CPopupMenuInitHandler的Install函数实现子类化。例如:

void CMyEdit::PreSubclassWindow()
{
CEdit::PreSubclassWindow();
m_popupInit.Install(this);
}

这时需要在CEdit的派生类里自己处理WM_CONTEXTMENU消息创建菜单,例如:

void CMyEdit::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu editMenu;
VERIFY(editMenu.LoadMenu(IDR_EDITMENU));
CMenu* pSubMenu = editMenu.GetSubMenu(0);
pSubMenu->TrackPopupMenu(0,point.x,point.y,CWnd::FromHandle(m_hWnd));
}

更简单的方法

其实,我们要解决的问题只是定制菜单的UPDATE_COMMAND_UI函数没有被调用,这与对话框菜单的UPDATE_COMMAND_UI函数没有被调用是相同的问题。

MFC的CFrameWnd类在WM_INITMENUPOPUP的处理函数OnInitMenuPopup中调用每个菜单项的UPDATE_COMMAND_UI函数,所以单文档和多文档程序的菜单都可以正确更新。CDialog、CEdit都没有重载OnInitMenuPopup函数,直接使用了基类CWnd的OnInitMenuPopup函数,没有这个功能。

微软提供过解决对话框菜单项问题的方法:You cannot change the state of a menu item from its command user-interface handler if the menu is attached to a dialog box in Visual C++:就是将CFrameWnd::OnInitMenuPopup的处理代码复制到CDialog类的派生类。

在“编辑框菜单定制问题”上,我们可以依葫芦画瓢,在CEdit的派生类里复制这段代码。这样,我们定制的编辑器菜单就可以收到UI更新的通知了。

不过,这种方法对于在CBCGPDockingControlBar中创建的编辑框无效。这时还是要使用Paul DiLascia的方法。

范例程序

我写了一个范例程序EditMenu,感兴趣的朋友可以从我的个人主页(http://www.fmddlmyy.cn)下载:EditMenu源代码

将这个工程中的MyEdit.cpp和MyEdit.h稍加修改(例如去掉不需要的菜单项)就可以用到其它工程中。其实这两个文件就是我从一个正在写的小程序(CodeView)中复制过来的。CMyEdit有一个DisableInput接口,调用这个接口后,编辑框就是只读的,但不会变灰(灰了不好看)。实现只读,除了屏蔽键盘输入,还要屏蔽右键菜单的粘贴、剪切。

分享到:
评论

相关推荐

    定制编辑框的上下文菜单

    本文将深入探讨如何在不同的编程语言和框架中定制编辑框的上下文菜单,以提升用户体验。 1. **Windows API**:在Windows平台上,可以通过使用WinAPI函数来定制编辑框的上下文菜单。首先,你需要创建一个菜单资源,...

    易语言禁止编辑框右键菜单

    在易语言中,我们经常会遇到需要对用户界面进行定制的情况,比如禁用某些控件的默认功能,比如编辑框的右键菜单。在Windows应用程序中,编辑框的右键菜单通常包含复制、粘贴等操作,但在某些情况下,我们可能希望...

    商业编程-源码-定制编辑框的上下文菜单.zip

    本资源"商业编程-源码-定制编辑框的上下文菜单.zip"提供了一个关于如何在编程中定制编辑框上下文菜单的具体源码示例。上下文菜单(Context Menu)通常在用户右键点击时出现,为用户提供与当前操作相关的快捷操作,极...

    VS2005 源码 含菜单 按钮 编辑框等

    【标题】:“VS2005 源码 含菜单 按钮 编辑框等”指的是一份包含Visual Studio 2005(VS2005)开发环境下的源代码,该源代码中使用了MFC(Microsoft Foundation Classes)库,涵盖了菜单、按钮和编辑框等基本UI元素...

    添加excel菜单/定制excel菜单

    在实际应用中,用户可能需要根据个人或团队的需求定制更复杂的菜单结构和功能,如子菜单、分组、自定义快捷键等。熟练掌握这些技巧,可以极大地提升Excel的使用体验,提高办公效率。 在提供的压缩包文件“excel菜单...

    易语言禁止编辑框里的文本被复制源码

    这两个函数的返回值为1表示阻止默认的操作,这样就阻止了用户通过鼠标右键菜单或键盘快捷键复制编辑框内的文本。 需要注意的是,这种方法并不能完全防止技术熟练的用户通过其他方式获取文本,如使用调试工具或者...

    易语言编辑框模拟时间框源码.rar

    在易语言中,编辑框和时间框是两种常见的控件,它们在用户界面设计中扮演着重要的角色。 编辑框(Edit Box)是用于用户输入文本的界面元素,常见于各种应用程序,如登录界面的用户名和密码输入框、设置窗口中的备注...

    UE5中定制关卡编辑器菜单栏的深度指南

    通过以上方法,可以在UE5中定制关卡编辑器的菜单栏。这些代码示例提供了一个基本的框架,你可以根据具体需求进行修改和扩展。在开发大型项目时,合理定制菜单栏可以显著提高开发效率和团队协作的便利性。不断实践和...

    改变编辑框的字体,非常简单,不可不看

    标题“改变编辑框的字体,非常简单,不可不看”以及描述“改变编辑框的字体,方法非常简单,不可不看,谢谢!!”都指向了一个关键知识点:如何调整编辑框的字体样式。 在不同的操作系统和编程环境下,改变编辑框...

    基于Web菜单框架

    例如,Bootstrap的导航条组件可以快速创建水平或垂直菜单,而jQuery UI的draggable和droppable功能则可以实现拖放式菜单编辑。 为了实现这些功能,【菜单框架】可能包含以下文件: - HTML模板文件:定义菜单的基本...

    VC带下拉菜单和编辑框的列表

    在VC++编程环境中,开发一个带有下拉菜单和编辑框的列表控件是常见的需求,尤其是在构建用户界面时。这个“VC带下拉菜单和编辑框的列表”资源可能是一个示例项目或库,用于帮助开发者实现这样的功能。在本文中,我们...

    C#简单的折叠菜单

    在C#编程中,创建一个简单的折叠菜单是常见的任务,尤其在开发Windows桌面应用程序时。折叠菜单,也称为级联菜单或下拉菜单,能够帮助用户以更有序、节省空间的方式浏览和选择功能。本教程将详细介绍如何在C#中实现...

    一个MFC的编辑框控件

    在这个项目中,我们讨论的是一个定制化的编辑框控件,具有自定义的边框颜色、背景色和字体颜色功能,这对于初学者来说是一个很好的学习实例。 首先,了解MFC中的CWnd类是所有窗口控件的基础,编辑框控件(CEdit)...

    定制编辑框的上下文菜单VC源代码

    你可以在编辑框中输入要查找的串,然后在编辑框上点右键,在弹出的上下文菜单中选择一个搜索引擎,然后按回车启动浏览器。 关键字:context,menu,editbox,WM_INITMENUPOPUP,编辑框,上下文,菜单

    易语言自制超级编辑框源码

    4. **界面设计**:超级编辑框可能具有定制的界面,如自定义的滚动条、高亮显示、右键菜单等。源码中可能会涉及如何使用易语言的图形用户界面(GUI)组件来实现这些效果。 5. **性能优化**:对于处理大量文本的编辑...

    下拉编辑框

    在IT界,"下拉编辑框"是一种常见的用户界面组件,它结合了下拉列表和文本输入框的功能,为用户提供了一种便捷的方式来选择或输入数据。这种组件在各种应用程序和网页设计中广泛应用,特别是在需要限制用户输入或者...

    漂亮的编辑框控件VC源码

    本资源提供的"漂亮的编辑框控件VC源码"是一个定制化的编辑框控件,它提供了更多的外观和交互上的自定义可能性,使得编辑框不仅具有基本的文本输入功能,还能根据用户需求调整显示效果,从而提升用户体验。...

    屏蔽易语言编辑框右键源码

    在易语言编程中,"屏蔽易语言编辑框右键源码"这个主题涉及到的是如何禁用编辑框(通常是文本输入区域)的右键菜单,即防止用户通过鼠标右键点击来触发默认的上下文菜单。这在某些情况下是必要的,比如为了保持界面的...

    IPbox_ec_IP地址编辑框2.0

    对于IP地址编辑框,可能涉及到的API函数有CreateWindowEx、SetWindowLong等,它们用于创建并定制编辑框控件的特性,使其能够正确显示和处理IP地址格式。 其次,创建IP编辑框的过程涉及到窗口类的注册、窗口实例的...

    易语言屏蔽编辑框右键

    以下是一个简单的示例代码片段,展示了如何在易语言中屏蔽编辑框的右键菜单: ```易语言 .事件 鼠标按下 (编辑框1, 鼠标信息) 如果 鼠标信息.按钮 = 2 (鼠标右键) .返回 假 (阻止默认事件,防止右键菜单弹出)...

Global site tag (gtag.js) - Google Analytics