捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
如何屏蔽控件的默认右键菜单
关键字:PopupMenu 屏蔽 右键菜单
来 自:原创
平 台:Win9x,Win2k/NT,WinXP 下载所需:0 火柴
深浅度:中级 完成时间:2004/9/9
发布者:cjsh 发布时间:2004/9/10
编辑器:DELPHI7 语  种:简体中文
分 类:窗体 下载浏览:165/7557
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
无图片
在很多情况下我们也许想把某些控件的默认右键菜单屏蔽掉。

屏蔽控件右键菜单有很多种方法,现在就介绍我知道的其中四种。

在介绍之前,先让我们看一下下面这段代码,这段代码是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;
 
版权所有 2004 cjsh 保留所有权利。欢迎转载,请注明出处:http://www.cnblogs.com/cjsh
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论2条 当前显示最后2条评论
luckhacker 2004/9/11 9:03:43
高人啊
sunleisl 2004/9/13 9:32:00
解决了我一块心病!高!!!
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表