0

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在孔区域(并且孔的宽度相同)上方放置一个(已经具有固定高度)来模拟标题栏,如下所示:

在此处输入图像描述

怎么可以制作?

4

1 回答 1

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)

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

于 2021-05-30T21:00:00.063 回答