S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-03 #1 如何在PopupMenu的Item上,截获MouseDown事件?我的目的想是右键单击菜单后,再弹出一个PopupMenu?
W wuyi Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-04 #2 不用那么复杂。你只要在设计时,在你要弹出另一POPMENU的项目上单击右 键,选择CREATE SUBMENU,然后把你的这些弹出项加入就可以了。
Y yifeng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-04 #3 实在不想用submenu,你可以在item onclick事件里popoup另一个popup menu
M menxin Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-04 #4 我想上面两位的答案可能不会满足SunCheng要求。 1。不是submenu 2. 如用两个popupmenu则第二个弹出后,第一个消失。 你是否想达到98中开始菜单的效果?我试了一下,好象要截取item的消息,太 麻烦+不会。
我想上面两位的答案可能不会满足SunCheng要求。 1。不是submenu 2. 如用两个popupmenu则第二个弹出后,第一个消失。 你是否想达到98中开始菜单的效果?我试了一下,好象要截取item的消息,太 麻烦+不会。
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-04 #5 OnClick事件中无法判断是左键还是右键, 况且对Item的右键单击是不会产生OnClick事件的。
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #6 继承TItem生成自己的item控件, 那里加上rightclick事件. popupmenu的item都在运行时动态生成, 生成的item用自己的控件代替.
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #7 我从TMenuItem中继承下来,生成一个新的控件, 但如何给这个新控件添加事件,我现在只能添加方法。
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #8 事件就是一个内存变量 例如: 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;
事件就是一个内存变量 例如: 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;
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #9 to Another_eYes (1)Item中没有MouseUp事件,无法使用override (2)我写了事件,但使用时,系统告诉我“没有定义” (3)OnRightClick : TRightClick read FOnRightClick write FOnRightClick; 代表什么意思?
to Another_eYes (1)Item中没有MouseUp事件,无法使用override (2)我写了事件,但使用时,系统告诉我“没有定义” (3)OnRightClick : TRightClick read FOnRightClick write FOnRightClick; 代表什么意思?
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #10 抱歉: 1. mouseup是TControl提供的, MenuItem里是没有. 可以用 procedure RightMouseUp(var Message: TMessage); Message WM_RBUTTONUP; 代替 2.写错了, 是TNotifyEvent
抱歉: 1. mouseup是TControl提供的, MenuItem里是没有. 可以用 procedure RightMouseUp(var Message: TMessage); Message WM_RBUTTONUP; 代替 2.写错了, 是TNotifyEvent
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #11 to Another_eYes: 麻烦大虾,能不能写个简单的例子,让我有点感性上的认识?
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #12 to Another_eYes: 若成功,我愿再双手奉上50分。
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-05 #13 类定义如下: 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;
类定义如下: 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;
W whpjyj Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-06 #14 to Another_eYes 在自定义类中,好象无法截获WM_RBUTTONUP消息。
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-07 #15 to Another_eYes: 如whpjyj所说的,我无法捕获MouseDown事件.
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-07 #16 抱歉, 没仔细研究TMenuItem就仓促回答了. 研究原代码之后发觉, 看来只有修改原代码才能达到目的, 通过继承很难解决. 主要修改的类有两个, 一个是TMenuItem, 其中增加OnRightClick事件. 另一个是TPopupList, 修改其中的wndproc过程以接受mouse right click. 具体实现方法正在考虑. 如需要, 可以email索取
抱歉, 没仔细研究TMenuItem就仓促回答了. 研究原代码之后发觉, 看来只有修改原代码才能达到目的, 通过继承很难解决. 主要修改的类有两个, 一个是TMenuItem, 其中增加OnRightClick事件. 另一个是TPopupList, 修改其中的wndproc过程以接受mouse right click. 具体实现方法正在考虑. 如需要, 可以email索取
S SunCheng Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-13 #17 现在的问题变大了,如何在继承时,添加祖先没有的事件?
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-06-13 #18 添加没有的事件不难, 只要原始控件能接受你所需要的消息就行. TPopupMenu不能不能接受除特定消息外的其他消息(其他消息它都调用Defaultwndproc处理了) 所以不能简单通过继承使它能接受到鼠标右键的消息. 本想在TPopupMenu.OnPopup事件里替换 掉它原来的wndproc来解决, 可发觉它的wndproc是在OnPopup之后才生成的. 故只剩修改源码 一途了.
添加没有的事件不难, 只要原始控件能接受你所需要的消息就行. TPopupMenu不能不能接受除特定消息外的其他消息(其他消息它都调用Defaultwndproc处理了) 所以不能简单通过继承使它能接受到鼠标右键的消息. 本想在TPopupMenu.OnPopup事件里替换 掉它原来的wndproc来解决, 可发觉它的wndproc是在OnPopup之后才生成的. 故只剩修改源码 一途了.