【问题标题】:How set Panel position always above of hole region?如何设置面板位置始终高于孔区域?
【发布时间】:2021-05-30 12:20:25
【问题描述】:

我有一个代码可以使用鼠标在Form 中创建一个洞。

var
 FormRegion, HoleRegion: HRGN;
begin
  FormRegion := CreateRectRgn(0, 0, Form1.Width, Form1.Height);
  HoleRegion := CreateRectRgn(X1, Y1, X2, Y2);

  CombineRgn(FormRegion, FormRegion, HoleRegion, RGN_DIFF);
  SetWindowRgn(Form1.Handle, FormRegion, True);
end;

现在我希望将一个Panel(已经具有固定高度)始终放在孔区域上方(并且具有相同的孔宽度)来模拟标题栏,如下所示:

如何制作?

【问题讨论】:

  • 跟踪最小 Y 坐标和最小和最大 X 坐标?
  • 无法回答:您没有提供足够的代码。显示一个我们可以理解和玩的minimal reproducible example
  • @Andreas Rejbrand,尝试过:SetWindowPos(Form1.Panel1.Handle, HWND_TOPMOST, X1, Y1, X2, Y2, 0); 但没用。但我认为SetWindowPos 是正确的方法,因为它具有正确的偏移量。
  • 但是您还没有指定当组合窗口的非透明部分与面板的高度不同时应该发生什么。面板是否应该调整大小?不透明部分是否应该调整大小?还是应该发生其他事情?或者不应该发生任何具体的事情(无论发生什么,发生,那又怎样?)。
  • 您需要适当地设置面板的顶部、左侧和宽度,并且面板对齐必须设置为无。这只是简单的数学运算(左:= X1,上:= Y1-PanelHeight 等)。

标签: delphi delphi-10.3-rio tpanel


【解决方案1】:

你没有仔细阅读我的额外信息请求,所以我让你随意调整。

无论如何,我相信您的实际问题是关于面板与透明区域的对齐方式。您可能没有考虑到表单窗口的区域计算包括边框,因此您有一个向右和向下的偏移量。

由于计算的区域包括表单的边框,因此您需要一个变量ClientOffset: TPoint 来保存左边框的宽度和上边框的高度(包括表单的标题栏)。

var
  ClientOffset: TPoint; 

要计算ClientOffset,您可以使用预定义的ClientOrigin 以及LeftTop 属性的形式。

ClientOffset.X := Form36.ClientOrigin.X - Form36.Left; // Left border width
ClientOffset.Y := Form36.ClientOrigin.Y - Form36.Top;  // Top border height (incl. title bar)

然后,从面板LeftTop 属性中减去ClientOffset,或者将ClientOffset 添加到HoleRegions 坐标。如果您使用鼠标(可能是表单客户端坐标)来定义“洞”区域,则后者更正确

【讨论】:

  • 请阅读@Dsm 评论。正是我需要的,但我不知道如何计算 width(面板)。等待建议。
  • 您已声明HoleRegion := CreateRectRgn(X1, Y1, X2, Y2);。我猜那个区域的宽度是X2 - X1,不是吗?因此,面板的宽度应该相同。
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多