窗口底部放了一溜按钮,点按钮弹出该按钮对应的菜单,TPopupMenu.Popup()但是现在有个问题,菜单弹出后会遮住这一溜按钮,再选其他按钮非得把弹出的菜单关掉才可以,很不方便另外,由于菜单项数目有多有少,弹出位置又靠近屏幕下面,菜单的弹出忽上忽下,感觉很不爽解决办法:有两个方法
1、定位菜单弹出点,让菜单弹出后,整个菜单在按钮上面或者下面
2、控制菜单弹出方向,让菜单总是从弹出点向上弹出但是这两种方法怎么实现呢?1的问题,实现必须要知道弹出菜单的高度,才能准确定位弹出点。(在网上搜,这个问题一直没有人能够很好解决)2的问题,根本就不知道如何控制和是否能控制菜单弹出方向(这个问题好像还没有人提出过)
1、定位菜单弹出点,让菜单弹出后,整个菜单在按钮上面或者下面
2、控制菜单弹出方向,让菜单总是从弹出点向上弹出但是这两种方法怎么实现呢?1的问题,实现必须要知道弹出菜单的高度,才能准确定位弹出点。(在网上搜,这个问题一直没有人能够很好解决)2的问题,根本就不知道如何控制和是否能控制菜单弹出方向(这个问题好像还没有人提出过)
解决方案 »
- 问一个delphi语句中的意思
- 遍历文件
- f1book中的match的用法
- 关于用sql语句更新Access表问题
- 问一个有关DELPHI平时很少用得着,但感觉不难的问题,很急,在线等!!!
- 200分求Ehlib,带中国财务金额线,最好是2.5版本以上,支持D6
- 十万火急!!!请告知字符串加密解密的pascal源代码(不要xor算法),一定给分!!!
- 给Wally_wu
- 请问各位,建立菜单时,如何屏蔽系统默认的快捷键?
- 有没有什么好的数据库转换工具?最好是能够详细到每一个字段的!!!
- C/S模式中,用SQL Server还是Socket传输快?
- 请教大家,在TDataSet使用filter中有没有类似group by的功能?
procedure TYBKForm.SpeedButton8Click(Sender: TObject);
var
P:TPoint;
begin
P.X:=0;
P.Y:=SpeedButton8.Height;
P:=SpeedButton8.ClientToScreen(p);
PopupMenu1.Popup(P.X,P.Y);
end;
trackpopupmenu(popupmenu1.items.handle, tpm_bottomalign, p.x, p.y,
0, popuplist.window, nil);
函数原型:BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT”prcRect);
参数
hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。
uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用下列标志位之一来确定函数如何垂直放置快捷菜单:
TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。
TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。
TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)
用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。
PrcRect:未用。
返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。若想获得更多的错误信息,清调用GetLastError
函数:
备注:Windows CE不支持参数uFlags取下列值:TPM_NONOTIFY;TPM_LEFTBUTTON;TPM_RIGHTBUTTON。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。
谢谢,高手啊使用这个api来解决弹出方向是可以的,试过,很符合目的,但是在delphi中popup菜单,如果把ownerdraw设为True后,弹出的就不对了,是一个空白条,而我的菜单使用了xpmenu的自绘功能。所以还不能直接调用api来实现,或者我只能舍去自绘功能。
在delphi里,设置popupmenu的OwnerDraw为True后,然后用此api弹出菜单,结果出来窄窄的一竖条空白的。不过现在已经解决了,我改了menus单元中的弹出过程,可以把自绘的菜单也能按方向弹出了,谢谢!结贴!!
如果你自绘了,出现白条的几率很高,特别是加了图片去自绘,
trackpopupmenu 这个API不建议你去用,弹出到什么位置,你自己去算很麻烦的,特别是二级菜单在电脑俩边显示的时候,如果那边显示不完整,系统会自己帮他调整到另外一边
菜单的问题我弄很久了,现在只有这个白条没搞定,