怎样使菜单项具有弹出菜单?(100分)

  • 主题发起人 主题发起人 LoveDelphi
  • 开始时间 开始时间
还是不行, 你能不能些一段完整代码出来?
 
怎么不行?
改过TrackPopupMenu一句后,在TPopupList.WndProc下面加上

WM_MENURBUTTONUP:
messagebox(0,'右键消息','',1);

我就改了这两个地方呀。
我用的是D4。你是不是要把LIB中的Menus.dcu替换掉。
 
我用的是D5.

我应该在哪个事件里setwindowlong,在哪个事件里恢复OldWndPorc ?
 
cAkk兄,抱歉,刚才出去喝酒去了,5瓶呀,晕得糊的。

D4中TPopupList不是全局变量,也用不着SetWindowLong。

还是讨论一下WIN98的开始菜单吧,它是在窗口上放一CoolBar,
再放一PageControl,再放一ToolBar,那些MenuItem其实就是
一个个ToolButton。

WIN98SE又加了一个DesktopMenu,也是这样。
这种用ToolBar作的“多功能菜单”(区别与普通菜单)表明了
菜单发展的新趋向。而普通菜单加右键过时了吧。

这种菜单自己作起来比较麻烦,我一直试图找到一个API或COM接口,未遂。
 
那么这个方法不能实现右键菜单了???

>>也用不着SetWindowLong。
那怎么才能替换原来的WndProc ?

这个问题我已经添加300分,问题在这里:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=209455
 
to o*o:我不同意你的説法,IE5里的收藏菜单的收藏夹菜単项,
也和开始菜単一样,按右键也能弹出一个PopUp菜単。
 
IE收藏夹菜単就是开始菜单的一项。
 
转载 o*o 给 cAkk的解答:

来自:o*o

哦,D5的作法与D4完全不同,简单多了。PopupList是全局变量呀。

先将Menus.pas的TrackPopupMenu那句改了,去掉Buttons[FTrackButton]

在FORM上加一PopupMenu1,随便填几个MenuItem。
private
DefMenuProc: TFarProc;
procedure MenuWndProc(var msg: Tmessage);
{ Private declarations }

procedure TForm1.FormCreate(Sender: TObject);
begin
DefMenuProc:=Pointer(GetWindowLong(PopupList.Window,GWL_WNDPROC));
SetWindowLong(PopupList.Window,GWL_WNDPROC,LongInt(MakeObjectInstance(MenuWndProc)));
end;

var Item:Integer;

procedure TForm1.MenuWndProc(var msg:Tmessage);
var pop:HMENU; p:TPoint; s:array[0..255]of Char;
begin
case msg.Msg of
WM_MENURBUTTONUP: begin
GetCursorPos(p);
pop:=CreatePopupMenu;
GetMenuString(PopupMenu1.Handle,Item,s,255,MF_BYCOMMAND);
AppendMenu(pop,0,100,PChar('Popup From '+String(s)));
TrackPopupMenu(pop,1,p.x,p.y,0,PopupList.Window,nil);
DestroyMenu(pop);
end;
WM_MENUSELECT: Item:=LOWORD(msg.wParam);
WM_COMMAND: if LOWORD(msg.wParam)=100 then MessageBox(Handle,'','OK!',0);
end;
with msg do Result:=CallWindowProc(DefMenuProc,PopupList.Window,Msg,WParam,LParam);
end;

cAkk,让你久等了,我平常休息日是不上网的。呵呵。

1 弹出TPopupMenu还要将Menus.pas中TrackPopupMenu里的AFlags加上 or TPM_RECURSE
意思是当一个菜单正在Track时,还能够Track另一个菜单。
Borland的老师们在封装API时显然忽视了这一点。

2 MakeObjectInstance是将一个procedure(var msg: TMessage) of object方法安全地转换为指针。
@MyWndProc是什么意思?不太明白。

3 据我观察,TPopupMenu的CommandID都是从很小的值如1开始累加的,设得大一些应无问题。
当然用1中说的弹出一个经过VCL封装的PopupMenu就没问题了。

再次真情呼唤大侠们找到制作WIN98开始菜单的方法,因为它支持ContextMenu,DragDrop,Hint。
而这种普通菜单的办法实在土蹩。
 
期待高手出现
 
这种强行要对普通菜单做出右键的办法是偶玩剩下的。确实土。
偶是N年以前玩FOXPROW时做出来的。支持右键菜单,支持即时添加/修改/删除菜单项
当时也只有个WIN95,它不支持右键菜单。
偶虽然实现出来了,但最终也没太多使用那个东东,连FOXPROW也最终被我遗忘了。
等你实现出来也就觉得它没什么好玩了。实现不了时才好玩。。。。
不知谁说过:FOXPROW可以做任何事。
 
wint,你在说些什么呀?:-)
 
???
简单地说,这类功能即使实现出来也没什么大用处。
除了WINDOWS中个别地方用到以外,能在哪里用呢?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
816
SUNSTONE的Delphi笔记
S
S
回复
0
查看
735
SUNSTONE的Delphi笔记
S
D
回复
0
查看
825
DelphiTeacher的专栏
D
D
回复
0
查看
831
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部