系统菜单弹出位置(50分)

  • 主题发起人 主题发起人 龙丹
  • 开始时间 开始时间

龙丹

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获取窗口系统菜单的弹出位置
 
现在站内搜索怎么什么都找不到
 
可以说得详细一点吗?
 
就是单击窗口左上角弹出来的那个系统菜单的显示位置。<br><br>一般是在窗口标题栏之下(IE例外,随鼠标),如果窗口没有主菜单,这个位置应该就是<br>ClientOrigin。<br><br>按理用GetTitleBarInfo(Handle,pti);(ClientOrigin.X,pti.rcTitleBar.Bottom)就是<br>这个位置,但GetTitleBarInfo好像有问题,首先是Delphi把函数USER32.DLL中的名字搞错<br>了(WinXP,其它没试),后来,我把名字搞对以后,得到的pti.rcTitleBar.Bottom又不对,<br>无论我把窗口移到哪里,始终是在屏幕上的一个固定位置。<br><br>接下来我准备试一试取主菜单的高度来解决,但需要判断窗口是否存在主菜单。<br><br>不知有没有哪位富翁知道如何直接取得这个位置?<br>
 
用clienttoscreen转换一下坐标,不然就是始终在屏幕上一个固定位置了。
 
大致若鱼:<br>&nbsp; 不是这个问题,因为返回的位置很低,到屏幕的下半部分了。<br><br>问题还没有解决,我暂时用鼠标位置代替。<br><br>继续。。。
 
就是clienttoscreen。<br>得到Point以后再PopUp
 
我这分呀就是送不出去,痛苦
 
我已实现弹出自己菜单的功能。需然我的DEMO所要实现的功能主要是在任务栏上<br>弹出自己的的菜单,但也应该有你想要的功能吧?可以查看下效果:<br>http://www.lkgarden.com/lfpsoft/index.zip<br><br>具体问题在这里:<br>http://delphibbs.com/delphibbs/dispq.asp?lid=803445<br><br>实现方法:<br>定义以下两个函数。<br>&nbsp; &nbsp; procedure PopSysMenu;//弹出菜单函数<br>&nbsp; &nbsp; procedure WMSysKey(var Msg:TWMSYSCOMMAND);message WM_SYSCOMMAND;//处理系统消息<br><br>procedure TFrmMain.PopSysMenu;<br>var<br>&nbsp; P: TPoint;<br>begin<br>&nbsp; P := ClientToScreen(Point(0, 0));//P就是系统菜单的位置。<br>&nbsp; SysMenu.Popup(P.X,p.Y );//弹出菜单,可以是自己定义的菜单<br>end;<br>procedure TFrmMain.WMSysKey(var Msg:TWMSYSCOMMAND);<br>begin<br>&nbsp; if ((Msg.CmdType and $FFF0 = SC_KEYMENU) and (Msg.Key = VK_SPACE)) or<br>&nbsp; &nbsp; &nbsp; &nbsp; (Msg.CmdType and $FFF0 = SC_MOUSEMENU) then //如果是Alt+空格键或者是鼠标<br>&nbsp; &nbsp; begin//按在标题栏上的图标上时,则弹出菜单。<br>&nbsp; &nbsp; &nbsp; PopSysMenu;<br>&nbsp; &nbsp; end<br>&nbsp; else inherited;<br>end;<br>
 
》 P := ClientToScreen(Point(0, 0));//P就是系统菜单的位置。<br>这就是ClientOrigin,窗口中如果有主菜单的话,这个点是位于主菜单之下的,显然不对。<br>其它的,我们实现的方法基本相同。
 
我现在的解决办法是重写CreateNew,计算出窗口标题栏高度记下在FTitleBarHeight中,<br>弹出位置则为(ClientOrigin.X,Top+FTitleBarHeight)。<br><br>不知道有没有什么API直接获得这个位置坐标?<br>
 
如果要想在点击托盘时弹出一菜单,菜单的位置在托盘图标上方,就像其它软件一样<br>如:QQ,WINNAP......怎么才能获得托盘图标的坐标呢?高手指点
 
应该有不少程序员都玩过窗口的系统菜单的呀......
 
UPUPUOPUPOUPUP
 
如果我没理解错的话,这个位置是:<br>Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME)
 
crystal:<br>&nbsp; 你是对的。
 
后退
顶部