【发布时间】:2014-12-23 19:07:15
【问题描述】:
我正在尝试在 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,因为它“看不到”疼痛盒下方的图形控件。
所以我的主要问题是,如何在 TPaintBox 后面的 TGraphicControl 上使用像 FindVCLWindow 这样的函数?
例如,如果以下控件位于面板内:
Image1.SendToBack;
Image2.SendToBack;
Label1.SendToBack;
Label2.SendToBack;
PaintBox1.BringToFront;
上面的方法只有在它们不在画框后面时才有效。
不能将图像和标签放在颜料盒上方,它们必须位于颜料盒后面,但这样做不会响应上述功能。
那么我该如何让它工作呢?该函数似乎只能看到画框,而不是底层图像和标签?
【问题讨论】:
-
如果你把一堆win控件放在一起,这对FindVCLWindow也是有效的,不是吗?迭代所有控件并选择您喜欢的控件。
-
@SertacAkyuz 我想我知道你在说什么,但我需要
FindVCLGraphicWindow忽略颜料盒,而是在它下面查看。是的,我知道您可以使用 for 循环来迭代父项内的所有控件,但我需要直接位于鼠标光标下方的控件,并且 FindVCLWindow 我认为这将非常适合我的需求,只是它无法获取图像和标签下的标签油漆盒。我将继续尝试一个新项目...
标签: delphi