2010-08-29 74 views

回答

4

因爲TImage中是TGraphicControl的後裔和程序漆在 WMPaint(windows WM_PAINT)消息中處理。所以當你在TImage畫布上繪畫(在繪畫過程中)時,窗口會發送WM_PAINT消息並再次調用Paint。

編輯: 一種方式做,這是...

procedure TMyImage.Paint; 
const 
    Text = 'Hi'; 
begin 
    inherited; 
    Windows.ExtTextOut(Canvas.Handle, 5, 5, 0, nil, PChar(Text), Length(Text), nil); 
end; 

因爲Windows.ExtTextOut是API調用,並不會發送WM_PAINT消息像...

canvas.TextOut(5,5,'Hi') 

...內部調用FreeImage程序。

+0

'TextOut'調用'FreeImage'在哪裏? – 2010-08-29 16:05:12

+1

@Rob Kennedy:TCanvas.TextOut調用TCanvas.Changing。 TCanvas.Changing呼叫事件OnChanging。 Event OnChanging被設置爲TBitmap.Changing。 TBitmap.Changing中的第一行調用FreeImage。 – 2010-08-29 18:09:04

2

您應該選擇TGraphicControl(或TCustomControl)作爲您自己的組件的父級以正確覆蓋Paint方法。

+0

沒有必要。即使在重寫Paint程序中,您也可以正確地執行此操作(繪製文本),但這是另一個問題。 – 2010-08-29 09:49:32

3

當您繪製到TImage時,您確實正在繪製它所顯示的底層TPicture對象。如果Picture屬性尚未分配,則該控件將自行分配一個新的TBitmap,以便您可以使用該屬性。但是,當它分配自己的Picture屬性時,會觸發它重新繪製自己。

TImage並非真正按照自己的方式進行設計。你要損壞你的用戶分配的任何圖形,這通常不是人們對TImage的期望。如果你想繪製一個覆蓋圖TImage而不修改包含的圖形,那麼你應該畫到inherited Canvas而不是隻有Canvas。或者,如果您不想顯示用戶的圖形,只想繪製某些東西,那麼舊的TGraphicControl可能是更好的基類。或者你甚至可能根本不需要自定義控件。只需在表單上放置一個TPaintBox,然後將您的繪圖命令放入其OnPaint事件中。

相關問題