2012-12-19 17 views
1

我將一個圖像繪製到一個paintbox的函數被調用到2個位置,如果從一個TPagecontrol調用pagechange,它可以正常工作,但是如果從form.formresize(...。)調用,則圖像是塗上油漆,但是之後立即將油漆箱重新塗漆成完全白色。不要有什麼從序列中的這個malefinction來自任何想法---重繪一個Paintbox不起作用

procedure TForm.FormResize(Sender: TObject); 
begin 
    // frist image shown and then re painted white ??? 
    PaintImage2PaintBox(……….); 
end; 


procedure TForm.pgc_mainmenuChange(Sender: TObject); 
begin 
    // works fine as expected after pagecontrol tab change 

     PaintImage2PaintBox(……….); 
end;; 

procedure PaintImage2PaintBox(……….); 
begin 
     /// draw into a PaintBox 
end; 

回答

7

你自己不能調用paint箱OnPaint事件處理程序。當你這樣做時,油漆盒畫布沒有準備好。爲了強制油漆箱重新繪製,您需要調用InvalidateRepaint方法。就像這樣:

PaintBox1.Invalidate; 

PaintBox1.Repaint; 

調用Invalidate導致異步重繪。該控件被標記爲dirty,並且當消息隊列下一個空時,WM_PAINT消息被合成並且控件將被重新繪製。

調用Repaint強制進行同步塗料循環。也就是說,油漆將被執行,然後Repaint函數將返回。

除非您有強制同步重塗的特殊原因,否則我建議您致電Invalidate

@Sertac在評論中建議您的繪畫代碼不在OnPaint處理程序中。如果那樣的話那是一個更大的問題。您必須將所有繪畫代碼放入附加到油漆盒OnPaint事件的事件處理程序中。

+2

我甚至不認爲繪圖代碼在OnPaint中.. –