下記のようにフォームにペイントボックスを貼り付けて作ってみましたが、
フォームのリサイズでちらつきがでてきます。
過去ログを見ると Form1.DoubleBuffered := True;
をすれば直ると書いていたのですが、なおりません。
どうすればよいのでしょうか?
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Bmp := TBitmap.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
end;
procedure TForm1.PaintBoxPaint(Sender: TObject);
begin
Bmp.Width := PaintBox.Width;
Bmp.Height := PaintBox.Height;
Bmp.Canvas.Brush.Color := clBlack;
Bmp.Canvas.CopyMode := cmBlackness ;
Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
Bmp.Canvas.Pen.Color := clWhite;
Bmp.Canvas.MoveTo(100, 100);
Bmp.Canvas.LineTo(200, 200);
Paintbox.Canvas.StretchDraw(Rect(0, 0, PaintBox.Width, PaintBox.Height), Bmp);
end;
try
LockWindowUpdate(Handle)
....//処理
finally
LockwindowUpdate(0)
end;
を利用したらどうですか?
サンプさんありがとうございます。
デスクトップ自体が再描画されるようになり、
ペイントボックスの中身はフォームのデフォルトの色と同じ状態で、
マウスの移動等全てが動作しなくなりました。
最初に示されたコードを試してみましたが、ちらつきません。
DoubleBuffered := True;をコメントアウトするとちらつきが発生しましたが。
環境はどうなっていますか?
私が試したのはWindowsXP Pro SP2, Delphi7Proです。
以下のようなコードはどうでしょう。
procedure TForm1.PaintBoxPaint(Sender: TObject);
var //追加
ps: TPaintStruct; //追加
begin
BeginPaint(Handle, ps); //追加
Bmp.Width := PaintBox.Width;
Bmp.Height := PaintBox.Height;
Bmp.Canvas.Brush.Color := clBlack;
Bmp.Canvas.CopyMode := cmBlackness ;
Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
Bmp.Canvas.Pen.Color := clWhite;
Bmp.Canvas.MoveTo(100, 100);
Bmp.Canvas.LineTo(200, 200);
Paintbox.Canvas.StretchDraw(Rect(0, 0, PaintBox.Width, PaintBox.Height), Bmp);
EndPaint(Handle, ps); //追加
end;
にしのさんありがとうございます。
基本的に DoubleBuffered := True; があってもなかっても
同じ現象です。
にしのさんのコードも試してみたのですが、
どの状態でも変わりがないように思います。
DoubleBuffered が動作していないのでしょうか?
環境はにしのさんと同じ
Delphi7 Pro、Windows XP Pro SP2
です。ちなみに
Pentium(R)4 3.80GHz
3.79GHz、2.00 GB RAM
と、なっております。
ホントの親はダレ?
PaintBox.Parent.DoubleBuffered := True;
ママははさんありがとうございます。
PaintBox.Parent.DoubleBuffered := True;
これで、ちらつきがほとんどなくなりました。
私の場合、パネルの上にPaintBox を貼り付けて使っていたから
にしのさんと結果が違ってきたのですね。
にしのさんはフォームに直接PaintBoxを貼り付けていたので
問題なかったと言うことだと、私は理解したのですが。
私の場合は、Panel.DoubleBuffered := True とすれば
OKだったんですね。
でも、パネルもフォームの上に貼り付けてあるから、
パネルの表示もペイントボックスの表示もちらつかなくなるような
気がするのですが・・・
ツイート | ![]() |