gpt4 book ai didi

delphi - 如何在 TPaintBox 下方的 TGraphicControl 上使用 FindVCLWindow?

转载 作者:行者123 更新时间:2023-12-01 19:44:26 32 4
gpt4 key购买 nike

我正在尝试在 TGraphicControl 组件(例如 TLabel 和 TImage)上使用 FindVCLWindow ,以便我可以在标签或状态栏中返回它们的名称,但我面临一些问题。

问题1

第一个问题是 FindVCLWindow 仅适用于 TWinControl 而不适用于 TGraphicControl 的后代,所以我尝试弄乱以下内容似乎有效:

function FindVCLGraphicWindow(const Pos: TPoint): TGraphicControl;
var
Window: TWinControl;
Ctrl: TControl;
begin
Result := nil;
Window := FindVCLWindow(Pos);

if Window <> nil then
begin
Ctrl := Window.ControlAtPos(Window.ScreenToClient(Pos), True, True, True);
if Ctrl is TGraphicControl then
begin
Result := TGraphicControl(Ctrl);
end;
end;
end;

我猜这是一个问题,因为它似乎有效,但也许有更好的解决方案?

问题2

我遇到的最大问题是,我需要上述函数来处理的标签和图像位于 TPaintBox 下方,因此标签或图像组件似乎无法接收或响应鼠标移动。换句话说,除非标签或图像位于顶部(即 BringToFront),否则该功能不起作用。

我记得不久前从我在这里发布的另一个问题中了解到,通过将 TPaintbox 设置为 Enabled := False 将允许底层控件接收鼠标消息等。

但是,使用上述函数总是返回 nil/false,因为它“看不到”painbox 下方的图形控件。

所以我的主要问题是,如何在 TPaintBox 后面的 TGraphicControl 上使用像 FindVCLWindow 这样的函数?

例如,如果以下控件位于面板内:

Image1.SendToBack;
Image2.SendToBack;
Label1.SendToBack;
Label2.SendToBack;
PaintBox1.BringToFront;

只有当它们不在油漆箱后面时,上述方法才有效。

不能将图像和标签放在颜料盒上方,它们必须位于颜料盒后面,但这样做不会响应上述功能。

那么我该如何让它工作呢?该函数似乎只能看到颜料盒,而看不到底层图像和标签?

最佳答案

TWinControl.ControlAtPos的第二个参数指定是否允许禁用的控件。您将其设置为True,因此它将返回禁用的PaintBox。设置它False,你的函数将返回PaintBox后面的标签和图像:

function FindVCLGraphicWindow(const Pos: TPoint): TGraphicControl;
var
Window: TWinControl;
Ctrl: TControl;
begin
Result := nil;
Window := FindVCLWindow(Pos);
if Window <> nil then
begin
Ctrl := Window.ControlAtPos(Window.ScreenToClient(Pos), False, True, True);
if Ctrl is TGraphicControl then
begin
Result := TGraphicControl(Ctrl);
end;
end;
end;

关于delphi - 如何在 TPaintBox 下方的 TGraphicControl 上使用 FindVCLWindow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27626505/

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