プロが教えるわが家の防犯対策術!

ターボdeliphiのPaintBoxです
procedure TForm1.Button1Click(Sender: TObject);
begin
PaintBox1.Invalidate;
PaintBox1.Canvas.MoveTo(0,0);
PaintBox1.Canvas.lineTo(100,100);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
PaintBox1.Canvas.MoveTo(0,0);
PaintBox1.Canvas.lineTo(100,100);
end;

procedure TForm1.PaintBox1Paint(~~~~~

ボタン1でlineTo(100,100)は描画されず、ボタン2では描画されます。
つまりPaintBox1.Invalidateで再描画させている微妙なタイミングのせいでしょうか?
再描画が終了してからlineTo(100,100)を描画したいのですが、それを知るコマンド?関数?はありますか?

A 回答 (1件)

# Deliphiは使ってませんが …


Invalidateは一般的な実装なら WinAPIのInvalidateRectを呼び出すと思います
このInvalidateRectは指定された矩形領域を無効とマーキングするだけでこのAPIで消去されるわけではないのです

したがって 1つのプロシージャの中で
Invalidate
グラフィック描画メソッド

または
グラフィック描画メソッド
Invalidate

どちらも結果は同じになると思います
ペイントイベントに何も記述がないならせっかく描画してもこのフォームのペイントイベントで上書きされてしまって結果 何も描画されていないような状態になるでしょう

何かのイベントでInvalidateを使うのであれば Paintイベントで描画されることを期待していると考えたほうがいいですよ
メモリーDC(裏画面)を使って描画しておきPaintイベントでメモリーDCから実画面へ転送するなんて使い方をします
    • good
    • 0
この回答へのお礼

とても参考になりました。
事情があってInvalidateを使ってましたが、やっぱりRepaintでやります。

ありがとうございました。

お礼日時:2007/08/08 01:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!