关于菜单上的右键菜单,征求D5下的实现代码 300分(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
请先参考这个问题:<br>http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=206834<br><br>现在我需要D5下面的实现的完整代码.<br><br>(我先下了,请继续讨论)
 
再呆会儿...<br><br>刚才o*o说到wind98的开始菜单,我也怀疑有现成的API或者Class.<br>不知大家有没有注意过,delphi做的程序,当右键菜单超长,超出屏幕<br>时,会在上下个出现一个菜单的滚动条,可以用来滚动显示菜单,但是<br>这种滚动条看起来很土,和"开始"菜单完全不一样,估计是delphi自己<br>实现的.<br><br>我刚装了一个新浪的"点点通",他的菜单条也可以滚动,而且效果和<br>"开始菜单"一模一样! 看来有办法实现"开始"菜单这种效果的!<br><br>请大家畅所欲言,分不够我还有的是!
 
听一下。
 
哦,D5的作法与D4完全不同,简单多了。PopupList是全局变量呀。<br><br>先将Menus.pas的TrackPopupMenu那句改了,去掉Buttons[FTrackButton]<br><br>在FORM上加一PopupMenu1,随便填几个MenuItem。<br>&nbsp; private<br>&nbsp; &nbsp; &nbsp;DefMenuProc: TFarProc;<br>&nbsp; &nbsp; &nbsp;procedure MenuWndProc(var msg: Tmessage);<br>&nbsp; &nbsp;{ Private declarations }<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>&nbsp; DefMenuProc:=Pointer(GetWindowLong(PopupList.Window,GWL_WNDPROC));<br>&nbsp; SetWindowLong(PopupList.Window,GWL_WNDPROC,LongInt(MakeObjectInstance(MenuWndProc)));<br>end;<br><br>var Item:Integer;<br><br>procedure TForm1.MenuWndProc(var msg:Tmessage);<br>var pop:HMENU; p:TPoint; s:array[0..255]of Char;<br>begin<br>case msg.Msg of<br>&nbsp; &nbsp;WM_MENURBUTTONUP: begin<br>&nbsp; &nbsp; GetCursorPos(p);<br>&nbsp; &nbsp; pop:=CreatePopupMenu;<br>&nbsp; &nbsp; GetMenuString(PopupMenu1.Handle,Item,s,255,MF_BYCOMMAND);<br>&nbsp; &nbsp; AppendMenu(pop,0,100,PChar('Popup From '+String(s)));<br>&nbsp; &nbsp; TrackPopupMenu(pop,1,p.x,p.y,0,PopupList.Window,nil);<br>&nbsp; &nbsp; DestroyMenu(pop);<br>&nbsp; &nbsp;end;<br>&nbsp; &nbsp;WM_MENUSELECT: Item:=LOWORD(msg.wParam);<br>&nbsp; &nbsp;WM_COMMAND: if LOWORD(msg.wParam)=100 then MessageBox(Handle,'','OK!',0);<br>end;<br>with msg do Result:=CallWindowProc(DefMenuProc,PopupList.Window,Msg,WParam,LParam);<br>end;<br><br><br><br>
 
但我仍认为还是应该研究WIN98开始菜单的作法。
 
o*o: 非常感谢! 试验成功了!<br><br>但是我还有几点疑问:<br>1.为什么只能临时创建一个popupmenu? 假如我在form上再放置一个<br>&nbsp; popupmenu2,当menurbuttonup时,我用pop2.Popup(p.x,p.y)为什么不成功?<br><br>2.在替代原有的WndProc时,我以前用的是:<br>&nbsp; SetWindowLong(...,...,longint(@MyWndProc));<br>&nbsp; @MyWndProc和MakeObjectInstance(MenuWndProc)))有什么不同?<br><br>3.在AppendMenu的参数里面的这个100,会不会和原有的pop1的ID重复? <br>
 
听听。cAkk,小声请求一下,分分数的时候给我1分可以吗?这样我找<br>这个问题的解答就容易了。
 
cAkk,让你久等了,我平常休息日是不上网的。呵呵。<br><br>1 弹出TPopupMenu还要将Menus.pas中TrackPopupMenu里的AFlags加上 or TPM_RECURSE<br>&nbsp; 意思是当一个菜单正在Track时,还能够Track另一个菜单。<br>&nbsp; Borland的老师们在封装API时显然忽视了这一点。<br><br>2 MakeObjectInstance是将一个procedure(var msg: TMessage) of object方法安全地转换为指针。<br>&nbsp; @MyWndProc是什么意思?不太明白。<br><br>3 据我观察,TPopupMenu的CommandID都是从很小的值如1开始累加的,设得大一些应无问题。<br>&nbsp; 当然用1中说的弹出一个经过VCL封装的PopupMenu就没问题了。<br><br>再次真情呼唤大侠们找到制作WIN98开始菜单的方法,因为它支持ContextMenu,DragDrop,Hint。<br>而这种普通菜单的办法实在土蹩。<br>
 
多人接受答案了。
 
后退
顶部