`
qzriso
  • 浏览: 236297 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Delphi屏蔽控件的默认右键菜单

阅读更多

在很多情况下我们也许想把某些控件的默认右键菜单屏蔽掉。
屏蔽控件右键菜单有很多种方法,现在就介绍我知道的其中四种。
  在介绍之前,先让我们看一下下面这段代码,这段代码是VCL库中TControl对象的一段代码,
从这段代码我们可以看出右键菜单的弹出事件都写在弹出菜单消息里面。
 
private
  procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU;

procedure TControl.WMContextMenu(var Message: TWMContextMenu);
var
  Pt, Temp: TPoint;
  Handled: Boolean;
  PopupMenu: TPopupMenu;
begin
  if Message.Result <> 0 then Exit;
  if csDesigning in ComponentState then Exit;
 
  Pt := SmallPointToPoint(Message.Pos);
  if Pt.X < 0 then
    Temp := Pt
  else
  begin
    Temp := ScreenToClient(Pt);
    if not PtInRect(ClientRect, Temp) then
    begin
      inherited;
      Exit;
    end;
  end;
 
  Handled := False;
  {* 调用OnContextPopup}
  DoContextPopup(Temp, Handled);
  Message.Result := Ord(Handled);
  if Handled then Exit;
 
  PopupMenu := GetPopupMenu;
  {* 弹出自定义菜单}
  if (PopupMenu <> nil) and PopupMenu.AutoPopup then
  begin
    SendCancelMode(nil);
    PopupMenu.PopupComponent := Self;
    if Pt.X < 0 then
      Pt := ClientToScreen(Point(0,0));
    PopupMenu.Popup(Pt.X, Pt.Y);
    Message.Result := 1;
  end;
 
  if Message.Result = 0 then
    {* 继承Windows右键菜单}
    inherited;
end;
 
下面介绍屏蔽右键菜单的几种常用的方法
第一种:绑定菜单法:
  这种方法最简单,不需要写什么程序。直将某一可视化控件的PopupMenu属性设置为一个没有菜单项的PopupMenu即可。
 
第二种:编写事件法
  这种方法其实也很简单,比如:我们想屏蔽Edit1控件的右键菜单,我们可以在OnContextPopup
事件中实现。
 
代码如下:
procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  Handled := True;
end;
 
  为什么是设置成True呢,从VCL库中的源代码可以看出,当为True时就会跳出执行下面自定义弹
出菜单及默认Windows右键菜单的代码。
  但有时控件并没有提供OnContextPopup事件,比如:TMaskEdit控件,怎么办呢,我们知道TMaskEdit控件和TEdit控件都是TControls控件的派生类,所以我们可以用如下方法实现。
 
代码如下:
private
  procedure NoneContextPopup(Sender: TObject; MousePos: TPoint; var Handled:
      Boolean);
...
procedure TForm1.NoneContextPopup(Sender: TObject; MousePos: TPoint; var
    Handled: Boolean);
begin
  Handled := True;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  TEdit(MaskEdit1).OnContextPopup := NoneContextPopup;
end;
 
第三种:拦截系统消息法:
    有时我们用以上介绍的两种方法是无济于事,这时就可以通过拦截系统消息法,我们通过判断控件的句柄,从而达到屏蔽控件的右键菜单。
 
代码如下:
private
  procedure MouseRightMessage(var Msg: TMsg; var Handled: Boolean);
...
procedure TForm1.MouseRightMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.Message = WM_RBUTTONDOWN) and (Msg.hwnd = Edit1.Handle) then
  begin
    Handled := True;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MouseRightMessage;
end;
 
第四种:拦截控件的右键消息法:
    但有时我们又想把某控件的右键菜单永远隐藏掉,这时我们可以通过以下方法实现。
 
代码如下:
type
  TOSPEdit = class(TEdit)
public
  procedure WMRBUTTONDOWN(Var Msg: TMsg); Message WM_RBUTTONDOWN;
end;
 
procedure TOSPEdit.WMRBUTTONDOWN(Var Msg: TMsg);
begin
  //
end;

分享到:
评论

相关推荐

    Delphi 5编程实例与技巧

    4.1.2 鼠标右键弹出式菜单 99 4.1.3 使用菜单模板 99 4.2 工具栏 100 4.2.1 ToolBar 100 4.2.2 CoolBar 100 4.2.3 ControlBar 101 4.3 状态栏 101 4.4 方法与技巧 106 4.4.1 动态创建菜单 106 4.4.2 为菜单动态定义...

    DELPHI 5编程实例与技巧

    4.1.2 鼠标右键弹出式菜单 99 4.1.3 使用菜单模板 99 4.2 工具栏 100 4.2.1 ToolBar 100 4.2.2 CoolBar 100 4.2.3 ControlBar 101 4.3 状态栏 101 4.4 方法与技巧 106 4.4.1 动态创建菜单 106 4.4.2 为菜单动态定义...

    delphi 开发经验技巧宝典源码

    0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用帮助文件 12 第2章 语言基础 17 2.1 基础语言 18 0021 如何对代码进行注释 18 0022 Exit语句的使用 18 ...

    delphi 开发经验技巧宝典源码06

    0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用帮助文件 12 第2章 语言基础 17 2.1 基础语言 18 0021 如何对代码进行注释 18 0022 Exit语句的使用 18 ...

    易语言程序免安装版下载

    “在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall方式调用;各参数声明要与其定义一致。  请参考易语言安装目录内的例程:samples\静态编译\调用LIB和OBJ 1. 静态编译方面的改进和...

    vc++ 应用源码包_1

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_2

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_3

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_6

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_5

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    网管教程 从入门到精通软件篇.txt

    DCU:Delphi编译单元文件 DCX:Microsoft Visual FoxPro数据库容器;基于PCX的传真图像;宏 DIR:MacromediaDirector文件 DLL:动态链接库 DOC:FrameMaker或FrameBuilder文档;Word Star文档、Word Perfect...

Global site tag (gtag.js) - Google Analytics