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

标签 delphi

我正在尝试在 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/

相关文章:

delphi - 由于 '%CLASSGROUP TPersistent' ,为什么工具选项板中可用于数据模块的组件比可用于表单的组件少?

multithreading - Delphi-线程中的消息泵未接收到WM_COPYDATA消息

delphi - OleVariant 变量的初始值

multithreading - 处理 TThread.Execute 中的异常以使其不可中断

delphi - 我可以直接将记录添加为字符串列表中的对象吗?

delphi - 有没有办法让我的响应立即在 TIdHTTPServer.OnCommandGet 事件中发送?

delphi - 如何检测在 A TTabControl 中单击了不同的选项卡?

sql-server - 无法在多个数据库上使用 Delphi 4 中的 Crystal Reports 2008 报表

mysql - Delphi - 将 DateTime Null 保存到 DB (ADO/MySQL)

windows - Windows 中的历史夏令时