我有一个带ViewStyle = vsReport的ListView和两个弹出菜单:
>列弹出菜单,我想在用户右键单击标题栏时打开它
>项目弹出菜单,必须在用户右键单击任何列表项/子项或项目下方的空白时打开.
显示菜单的最正确方法是什么?我应该处理哪些事件?
问题是当我设置ListView.PopupMenu属性时,右键单击ListView的客户端矩形中的任何点后出现弹出菜单.
当我处理ListView.OnColumnRightClick事件时,如果仅在单击列标题后触发,则排除标题栏的可用空间(在列的右侧).
事件LisView.onmouseup只有在右键单击项目下方的空白后才会触发.
解决方法
您不必使用listview的PopupMenu属性,保持未设置状态,并且可以将处理程序附加到OnContextPopup事件,并根据位置启动您想要的任何弹出菜单.例:
procedure TForm1.ListViewContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
var
HeaderRect: TRect;
Pos: TPoint;
begin
GetwindowRect(ListView_GetHeader(ListView.Handle),HeaderRect);
Pos := ListView.ClientToScreen(MousePos);
if PtInRect(HeaderRect,Pos) then
PopupMenuColumns.Popup(Pos.X,Pos.Y)
else
PopupMenuItems.Popup(Pos.X,Pos.Y);
end;