2015-10-14 45 views
1

我正在使用VCL測試一些特殊形狀的窗口。德爾福 - 在窗體大小調整後重新構建點擊透明區域

在(邊界以內)主要形式有,我用了一種利用TForm.TransparentColorTForm.TransparentColorValue,這樣做的長方形的點擊透明區域的TImage:

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

窗口的透明區域起作用,除了在窗體大小調整之後,客戶端對齊的TImage應該調整大小,因此透明區域也應該調整大小,但不是。

我試過多種方法試圖使透明區域與其父形式一起調整,但失敗了,東西我想:

  • 形式的調整後,正在重置父窗體的TransparentColor財產。
  • 表單調整大小後,手動調整TImage的尺寸。

我使用xe4並在Win7上測試它。

任何建議?謝謝。

+1

如果你正在繪製整個圖像的顏色相同,那麼跳過圖像並設置[表單的背景顏色](http://docwiki.embarcadero.com/Libraries /en/Vcl.Forms.TForm.Color)? –

+0

@RobKennedy,由於我只想將窗體的一部分設置爲透明,我認爲使用TransparentColorValue填充整個窗體也會使窗體上的控件變得透明。但顯然我錯了:)嘗試了你的方法,它的工作,非常感謝你! –

+0

該行爲由每個子控件的'ParentColor'屬性控制。 –

回答

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; 
+0

你太棒了! @Dalija :) –

+0

謝謝:)你也可以用'TPaintBox'而不是'TImage' –

+1

或者你可以跳過'TPaintBox'並使用Form自己的'OnPaint'事件。 –