我有這個問題,當我從這個類開發自己的組件:TImage
我用這個代碼:當我使用Canvas時,爲什麼重寫Paint程序會一次又一次地調用它自己?
procedure Paint;override;
begin
inherited
canvas.TextOut(5,5,'Hi')
end;
在此先感謝
我有這個問題,當我從這個類開發自己的組件:TImage
我用這個代碼:當我使用Canvas時,爲什麼重寫Paint程序會一次又一次地調用它自己?
procedure Paint;override;
begin
inherited
canvas.TextOut(5,5,'Hi')
end;
在此先感謝
因爲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程序。
您應該選擇TGraphicControl(或TCustomControl)作爲您自己的組件的父級以正確覆蓋Paint方法。
沒有必要。即使在重寫Paint程序中,您也可以正確地執行此操作(繪製文本),但這是另一個問題。 – 2010-08-29 09:49:32
當您繪製到TImage
時,您確實正在繪製它所顯示的底層TPicture
對象。如果Picture
屬性尚未分配,則該控件將自行分配一個新的TBitmap
,以便您可以使用該屬性。但是,當它分配自己的Picture
屬性時,會觸發它重新繪製自己。
TImage
並非真正按照自己的方式進行設計。你要損壞你的用戶分配的任何圖形,這通常不是人們對TImage
的期望。如果你想繪製一個覆蓋圖爲TImage
而不修改包含的圖形,那麼你應該畫到inherited Canvas
而不是隻有Canvas
。或者,如果您不想顯示用戶的圖形,只想繪製某些東西,那麼舊的TGraphicControl
可能是更好的基類。或者你甚至可能根本不需要自定義控件。只需在表單上放置一個TPaintBox
,然後將您的繪圖命令放入其OnPaint
事件中。
'TextOut'調用'FreeImage'在哪裏? – 2010-08-29 16:05:12
@Rob Kennedy:TCanvas.TextOut調用TCanvas.Changing。 TCanvas.Changing呼叫事件OnChanging。 Event OnChanging被設置爲TBitmap.Changing。 TBitmap.Changing中的第一行調用FreeImage。 – 2010-08-29 18:09:04