如何给TItem添加OnMouseDown事件?急!!!(100分)

  • 主题发起人 主题发起人 SunCheng
  • 开始时间 开始时间
S

SunCheng

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在PopupMenu的Item上,截获MouseDown事件?我的目的想是右键单击菜单后,再弹出一个PopupMenu?
 
不用那么复杂。你只要在设计时,在你要弹出另一POPMENU的项目上单击右
键,选择CREATE SUBMENU,然后把你的这些弹出项加入就可以了。
 
实在不想用submenu,你可以在item onclick事件里popoup另一个popup menu
 
我想上面两位的答案可能不会满足SunCheng要求。
1。不是submenu
2. 如用两个popupmenu则第二个弹出后,第一个消失。
你是否想达到98中开始菜单的效果?我试了一下,好象要截取item的消息,太
麻烦+不会。:(
 
OnClick事件中无法判断是左键还是右键,
况且对Item的右键单击是不会产生OnClick事件的。
 
继承TItem生成自己的item控件, 那里加上rightclick事件.
popupmenu的item都在运行时动态生成, 生成的item用自己的控件代替.
 
我从TMenuItem中继承下来,生成一个新的控件,
但如何给这个新控件添加事件,我现在只能添加方法。
 
事件就是一个内存变量
例如:
type
TYourItem = class(TItem)
private
FOnRightClick : TNotifyEvent;
....
protected
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
published
OnRightClick : TRightClick read FOnRightClick write FOnRightClick;
....
end;

implimentation

procedure TYourItem.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer)
begin
if button = mbRight then
OnrightClick(self);
inherited MouseUp(Button, Shift, x, y);
end;
 
to Another_eYes
(1)Item中没有MouseUp事件,无法使用override
(2)我写了事件,但使用时,系统告诉我“没有定义”
(3)OnRightClick : TRightClick read FOnRightClick write FOnRightClick;
代表什么意思?
 
抱歉:
1. mouseup是TControl提供的, MenuItem里是没有.
可以用 procedure RightMouseUp(var Message: TMessage); Message WM_RBUTTONUP; 代替
2.写错了, 是TNotifyEvent
 
to Another_eYes:
麻烦大虾,能不能写个简单的例子,让我有点感性上的认识?
 
to Another_eYes:
若成功,我愿再双手奉上50分。
 
类定义如下:
type
TSelfMenuItem = class(TMenuItem)
private
FRightClick : TNotifyEvent;
procedure WMRMouseUp(var Message: TMessage); Message WM_RBUTTONUP;
published
OnRightClick : TNotifyEvent read FRightClick write FRightClick;
end;

implimentation

procedure TSelfMenuItem.WMRMouseUp(var Message: TMessage);
begin
inherited;
if Assigned(OnRightClick) then
OnRightClick(self);
end;

end.

动态popupmenu的item时只要用TSelfMenuItem代替即可.

procedure TForm1.Button1Click(Sender: TObject);
var
item: TSelfMenuItem;
pt : TPoint;
begin
item := TSelfMenuItem.create(Form1);
with item do
begin
caption := 'Test Item';
....
OnRightClick := RightClickItem;
end;
popupmenu1.items.add(item);
pt := ClientToScreen(point(5, 5));
popupmenu1.popup(pt.x, pt.y);
end;

procedure TForm1.RightClickItem(Sender: TObject);
begin
// some codes for right click on the menu item
end;
 
to Another_eYes
在自定义类中,好象无法截获WM_RBUTTONUP消息。
 
to Another_eYes:
如whpjyj所说的,我无法捕获MouseDown事件.
 
抱歉, 没仔细研究TMenuItem就仓促回答了.
研究原代码之后发觉, 看来只有修改原代码才能达到目的, 通过继承很难解决.
主要修改的类有两个, 一个是TMenuItem, 其中增加OnRightClick事件.
另一个是TPopupList, 修改其中的wndproc过程以接受mouse right click.
具体实现方法正在考虑. 如需要, 可以email索取
 
现在的问题变大了,如何在继承时,添加祖先没有的事件?
 
添加没有的事件不难, 只要原始控件能接受你所需要的消息就行.
TPopupMenu不能不能接受除特定消息外的其他消息(其他消息它都调用Defaultwndproc处理了)
所以不能简单通过继承使它能接受到鼠标右键的消息. 本想在TPopupMenu.OnPopup事件里替换
掉它原来的wndproc来解决, 可发觉它的wndproc是在OnPopup之后才生成的. 故只剩修改源码
一途了.
 
多人接受答案了。
 

Similar threads

回复
0
查看
815
不得闲
D
回复
0
查看
837
DelphiTeacher的专栏
D
D
回复
0
查看
843
DelphiTeacher的专栏
D
D
回复
0
查看
677
DelphiTeacher的专栏
D
S
回复
0
查看
690
SUNSTONE的Delphi笔记
S
后退
顶部