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,因为通常这些动作都会响应松开按钮,