Delphi 如何通过右键单击选择TTabControl中的选项卡

Delphi 如何通过右键单击选择TTabControl中的选项卡,delphi,Delphi,我有一个与我的TTabControl关联的弹出菜单。我希望能够选择选项卡并在一次右键单击中调用下拉列表。我记得的其他控件都有一个右键选择属性。您可以使用tpopumenus的OnPopup事件处理程序: procedure TForm1.PopupMenu1Popup(Sender: TObject); var TabIndex : integer; Pt : TPoint; begin Pt := TabControl1.ScreenToClient(TPopupMenu(Send

我有一个与我的
TTabControl
关联的弹出菜单。我希望能够选择选项卡并在一次右键单击中调用下拉列表。我记得的其他控件都有一个右键选择属性。

您可以使用
tpopumenus的
OnPopup
事件处理程序:

procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
  TabIndex : integer;
  Pt : TPoint;
begin
  Pt := TabControl1.ScreenToClient(TPopupMenu(Sender).PopupPoint);
  TabIndex := TabControl1.IndexOfTabAt(Pt.X, Pt.Y);
  if(TabIndex <> -1) then
  begin
    TabControl1.TabIndex := TabIndex;
  end;
end;
过程TForm1.popupmenu1popp(发送方:TObject);
变量
TabIndex:整数;
Pt:TPoint;
开始
Pt:=TabControl1.ScreenToClient(TPopupMenu(Sender.pouppoint));
TabIndex:=TabControl1.IndexOfTabAt(Pt.X,Pt.Y);
如果(TabIndex-1),则
开始
TabControl1.TabIndex:=TabIndex;
结束;
结束;

您可以执行以下操作:

type
  TTabControl = class(Vcl.ComCtrls.TTabControl)
  private
    FRightClickSelect: Boolean;
    procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property RightClickSelect: Boolean read FRightClickSelect write FRightClickSelect default False;
  end;

implementation

uses
  Winapi.CommCtrl;

{ TTabControl }

constructor TTabControl.Create(AOwner: TComponent);
begin
  inherited;
  FRightClickSelect := False;
end;

procedure TTabControl.CNNotify(var Msg: TWMNotify);
var
  Index: Integer;
  HitInfo: TTCHitTestInfo;
begin
  if FRightClickSelect and (Msg.NMHdr.code = NM_RCLICK) then
  begin
    HitInfo.pt := ScreenToClient(Mouse.CursorPos);
    Index := SendMessage(Handle, TCM_HITTEST, 0, LPARAM(@HitInfo));
    if (Index <> -1) and (HitInfo.flags <> TCHT_NOWHERE) then
      TabIndex := Index;
  end;
  inherited;
end;
类型
TTabControl=类(Vcl.ComCtrls.TTabControl)
私有的
单击选择:布尔值;
程序CNNotify(var消息:TWMNotify);消息CN_通知;
公众的
构造函数创建(AOwner:TComponent);推翻
出版
属性权限ClickSelect:布尔读取权限ClickSelect写入权限ClickSelect默认值False;
结束;
实施
使用
Winapi.CommCtrl;
{TTabControl}
构造函数TTabControl.Create(所有者:TComponent);
开始
继承;
FrifhtClickSelect:=False;
结束;
程序TTabControl.CNNotify(var Msg:TWMNotify);
变量
索引:整数;
HitInfo:TTCHitTestInfo;
开始
如果单击选择并(Msg.NMHdr.code=NM\u RCLICK),则
开始
HitInfo.pt:=ScreenToClient(Mouse.CursorPos);
索引:=SendMessage(句柄,TCM_HITTEST,0,LPARAM(@HitInfo));
如果(索引-1)和(HitInfo.flags TCHT_NOWHERE),则
TabIndex:=索引;
结束;
继承;
结束;

OnClick
事件响应左侧按钮,但是
OnMouseDown
onmousedup
为您提供了有关所用按钮的更多上下文。我会使用OnMouseUp,因为通常这些动作都会响应松开按钮,