gpt4 book ai didi

delphi - Delphi中如何获取光标下的Control?

转载 作者:行者123 更新时间:2023-12-03 15:45:32 25 4
gpt4 key购买 nike

我需要与问题"How to get cursor position on a control?"相反的信息问道。

给定当前光标位置,如何找到表单(在我的应用程序中)和光标当前所在的控件?我需要它的句柄,以便我可以使用 Windows.SetFocus(Handle)。

作为引用,我使用的是 Delphi 2009。

最佳答案

我在建议的解决方案中遇到了一些问题(Delphi XE6/Windows 8.1/x64):

  • FindVCLWindow 不搜索禁用的控件 (Enabled=False)。
  • 如果控件被禁用,TWinControl.ControlAtPos 不会搜索控件间接(例如,如果 Button.Enabled=True,但 Button.Parent.Enabled=False)。

就我而言,这是一个问题,因为我需要找到鼠标光标下的任何可见控件,所以我必须使用我自己的函数FindControlAtPos实现:

function FindSubcontrolAtPos(AControl: TControl; AScreenPos, AClientPos: TPoint): TControl;
var
i: Integer;
C: TControl;
begin
Result := nil;
C := AControl;
if (C=nil) or not C.Visible or not TRect.Create(C.Left, C.Top, C.Left+C.Width, C.Top+C.Height).Contains(AClientPos) then
Exit;
Result := AControl;
if AControl is TWinControl then
for i := 0 to TWinControl(AControl).ControlCount-1 do
begin
C := FindSubcontrolAtPos(TWinControl(AControl).Controls[i], AScreenPos, AControl.ScreenToClient(AScreenPos));
if C<>nil then
Result := C;
end;
end;

function FindControlAtPos(AScreenPos: TPoint): TControl;
var
i: Integer;
f,m: TForm;
p: TPoint;
r: TRect;
begin
Result := nil;
for i := Screen.FormCount-1 downto 0 do
begin
f := Screen.Forms[i];
if f.Visible and (f.Parent=nil) and (f.FormStyle<>fsMDIChild) and
TRect.Create(f.Left, f.Top, f.Left+f.Width, f.Top+f.Height).Contains(AScreenPos)
then
Result := f;
end;
Result := FindSubcontrolAtPos(Result, AScreenPos, AScreenPos);
if (Result is TForm) and (TForm(Result).ClientHandle<>0) then
begin
WinAPI.Windows.GetWindowRect(TForm(Result).ClientHandle, r);
p := TPoint.Create(AScreenPos.X-r.Left, AScreenPos.Y-r.Top);
m := nil;
for i := TForm(Result).MDIChildCount-1 downto 0 do
begin
f := TForm(Result).MDIChildren[i];
if TRect.Create(f.Left, f.Top, f.Left+f.Width, f.Top+f.Height).Contains(p) then
m := f;
end;
if m<>nil then
Result := FindSubcontrolAtPos(m, AScreenPos, p);
end;
end;

关于delphi - Delphi中如何获取光标下的Control?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com