>>关于POPUMENU弹出式菜单的高度???(20分)

  • 主题发起人 主题发起人 wiseinfo
  • 开始时间 开始时间
W

wiseinfo

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了个按钮控件,能够选定弹出式菜单!!
可以指定菜单弹出的LEFT,RIGHT,BOTTOM,还想搞定TOP,但是没有办法知道准确的POPUMENU弹出
菜单具体的高度,用大约的值当系统设置了菜单字体换了之后就不准了!!

有没有办法??? 获得菜单当前字体或直接的当前高度??

 
在单元中加入
type
mypopupmemu=class(Tpopupmemo);

mypopupmemu(菜单名).height;
 
不行吧!
type
mypopupmemu=class(Tpopupmemo);
是Tpopupmemo 还是TpopupmeNU,在那个单元??
 
type
popupmenu1=class(tpopupmenu);

procedure create;
begin
popupmenu1.height:=123;
end;
 
tpopupmenu 没有HEIGHT 吧!!!
popheight:=0 ;
for i:=0 to fpopupmenu.Items.Count-1 do
begin
SITEM:=i;
GetMenuITEMRect(Handle,FPOPUPMENU.Handle,SITEM,S) ;
popheight:=popheight+(S.Bottom-S.Top)
end;
FPopupMenu.Popup(q.X - 1, q.Y - popheight );
我的办法基本上可以了!!!但是好象效率不高!!!
有没有更好的方法???更直接的!!!
 
洼葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺
 
在menus单元中有这个过程
procedure TMenuItem.MeasureItem(ACanvas: TCanvas; var Width, Height: Integer);
中有这个过程,或许对你有帮助
procedure GetMenuSize;
 
看不懂!!还是用死方法吧!!反正DELPHI快,!!

菜单项也不多!
 
上面不显示菜单时用GetMenuITEMRect(Handle,FPOPUPMENU.Handle,SITEM,S) ;
应该是得不到信息的。

procedure TForm1.Button3Click(Sender: TObject);
var
r:TRect;
begin
PopupMenu1.popup(200,200);
GetMenuItemRect(handle,PopupMenu1.handle,1,r);
showmessage('MenuItem Height:'+inttostr(r.bottom-r.top));
end;

当然对于普通菜单,获得一个菜单项的高度,就不难得到整个菜单的高度
如果那样行的话,你只要获得第一项的 top和最后一项的bottom

另外,WM_MEASUREITEM或许有用!
 
你只要获得第一项的 top和最后一项的bottom
有道理!!!

不过 GetMenuItemRect(handle,PopupMenu1.handle,1,r);第一次会有问题!!1
会出现TOP=HEIGHT ,我现在做了个全局的变量,把一个MENUITEM的HEIGHT存在这变量里面!!
系统运行时,我先从主界里的菜单里面确定这个值!!
再在弹出菜单里的不是每一次弹出更新这个值,比较好了!!
任何时间改变菜单字体都可以了!


 
不错的想法!!
 
感谢参与!!!

 
后退
顶部