我正在使用VCL测试一些特殊形状的窗口。
在(无边框)主窗体上有一个TImage,我用它来制作一个矩形点击透明区域,使用TForm.TransparentColor
和TForm.TransparentColorValue
,如下所示:
imgTrans.Canvas.Brush.Color := self.TransparentColorValue;
imgTrans.Canvas.FillRect(Rect(0, 0, imgTrans.ClientWidth, imgTrans.ClientHeight));
窗口的透明区域工作,除了在窗体调整大小后,客户端对齐的TImage应该调整大小,因此透明区域也应该调整大小,但它没有。
我尝试了几种尝试使透明区域与其父窗体一起调整大小的方法,但失败了,我尝试过的事情:
TransparentColor
属性。我使用xe4并在Win7上测试它。
有什么建议吗?感谢。
答案 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;