ちらつきをなくす方法

解決


Snake  2007-04-17 23:19:03  No: 25826

下記のようにフォームにペイントボックスを貼り付けて作ってみましたが、
フォームのリサイズでちらつきがでてきます。
過去ログを見ると  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;


サンプ  2007-04-18 01:39:36  No: 25827

try
 LockWindowUpdate(Handle)
....//処理
finally
 LockwindowUpdate(0)
end;

を利用したらどうですか?


Snake  2007-04-18 03:32:13  No: 25828

サンプさんありがとうございます。

デスクトップ自体が再描画されるようになり、
ペイントボックスの中身はフォームのデフォルトの色と同じ状態で、
マウスの移動等全てが動作しなくなりました。


にしの  2007-04-18 04:20:07  No: 25829

最初に示されたコードを試してみましたが、ちらつきません。
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;


Snake  2007-04-18 06:29:47  No: 25830

にしのさんありがとうございます。
基本的に  DoubleBuffered := True;  があってもなかっても
同じ現象です。
にしのさんのコードも試してみたのですが、
どの状態でも変わりがないように思います。
DoubleBuffered  が動作していないのでしょうか?

環境はにしのさんと同じ
Delphi7 Pro、Windows XP Pro SP2
です。ちなみに 
Pentium(R)4 3.80GHz
3.79GHz、2.00 GB RAM
と、なっております。


ママはは  2007-04-18 08:47:56  No: 25831

ホントの親はダレ?
PaintBox.Parent.DoubleBuffered := True;


Snake  2007-04-18 17:46:00  No: 25832

ママははさんありがとうございます。

PaintBox.Parent.DoubleBuffered := True;
これで、ちらつきがほとんどなくなりました。

私の場合、パネルの上にPaintBox を貼り付けて使っていたから
にしのさんと結果が違ってきたのですね。
にしのさんはフォームに直接PaintBoxを貼り付けていたので
問題なかったと言うことだと、私は理解したのですが。
私の場合は、Panel.DoubleBuffered := True とすれば
OKだったんですね。
でも、パネルもフォームの上に貼り付けてあるから、
パネルの表示もペイントボックスの表示もちらつかなくなるような
気がするのですが・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加