Delphi - 在调整表单大小后重新构建点击透明区域

时间:2015-10-14 12:50:12

标签: delphi winapi delphi-xe4

我正在使用VCL测试一些特殊形状的窗口。

在(无边框)主窗体上有一个TImage,我用它来制作一个矩形点击透明区域,使用TForm.TransparentColorTForm.TransparentColorValue,如下所示:

imgTrans.Canvas.Brush.Color := self.TransparentColorValue; imgTrans.Canvas.FillRect(Rect(0, 0, imgTrans.ClientWidth, imgTrans.ClientHeight));

窗口的透明区域工作,除了在窗体调整大小后,客户端对齐的TImage应该调整大小,因此透明区域也应该调整大小,但它没有。

我尝试了几种尝试使透明区域与其父窗体一起调整大小的方法,但失败了,我尝试过的事情:

  • 在调整表单大小后,重新设置父表单的TransparentColor属性。
  • 在调整表单大小后,手动调整TImage的尺寸。

我使用xe4并在Win7上测试它。

有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:1)

TImage.Canvas属性直接链接到基础位图图像。当您调整TImage控件的大小时,实际上并没有调整其位图的大小。

imgTrans.Picture.Bitmap.Width := imgTrans.Width;
imgTrans.Picture.Bitmap.Height := imgTrans.Height;

我还会使用imgTrans.Picture.Bitmap.Canvas代替imgTrans.Canvas来更清楚地了解您的代码正在做什么。

imgTrans.Picture.Bitmap.Canvas.Brush.Color := TransparentColorValue;
imgTrans.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, imgTrans.Width, imgTrans.Height));

另一种更简单的方法是使用TPaintBox控件而不是TImage。如果重新对齐TPaintBox,则会调用其绘制方法并自动绘制适当的区域。这样你也可以避免让TImage Bitmap一直坐在记忆中。

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Brush.Color := TransparentColorValue;
  PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height));
end;