您可以大大简化它。创建两个弹出菜单(标题行和列各一个。TListView.PopupMenu
在 IDE 中分配列弹出菜单。
将此用于 ListView 的事件处理程序:
procedure TForm1.ListView1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
var
HeaderRect: TRect;
HeaderHeight: Integer;
Header: HWnd;
begin
ListView1.PopupMenu := ColumnMenu; // Default to ColumnMenu
Header := ListView_GetHeader(ListView1.Handle);
GetWindowRect(Header, HeaderRect);
HeaderHeight := HeaderRect.Bottom - HeaderRect.Top;
if MousePos.Y < HeaderHeight then
ListView1.PopupMenu := HeaderMenu;
end;
它与@Sertac 的方法略有不同,不调用ClientToScreen
和PtInRect
- 因为我们知道该点在 ListView 的范围内,所以对点击高度的简单测试足以知道我们是否在标题或列区域。它还确保始终至少有一个弹出菜单分配给ListView
。