1 秒に 2 回更新/更新されるカスタム プログレス バーがフォーム上にあり、ちらつきます。
TMyProgressBar = class(TCustomControl)
といくつかのイベントTCustomControl
が必要だったので、 からコントロールを継承しました。コントロール (最大 64 項目) は動的に作成され、ScrollBox に配置されます。進行状況が更新されたら、最初に を呼び出します。Handle
TWinControl
InvalidateRect
すべての描画作業 (四角形のセットなど - hereDrawText
から着想を得たもの) は、メモリ DC で実行され、コントロールの DC で実行されます。とにかくちらつきます。コンポーネントが消えて再び現れるようです。私見は、背景の消去が原因です。BitBlt
このちらつきのない描画アドバイスWM_ERASEBKGND
では、次の方法で処理するように書かれています。
type
TMyProgressBar = class(TCustomControl)
procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;
procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
Message.Result := 1;
end;
しかし、別のコンポーネントでは、TMS ( TAdvProgressBar
)によって、同じメッセージに対してResult
が設定されます。0
現在、Windows のドキュメントには次のように記載されています。
背景を消去する場合、アプリケーションはゼロ以外を返す必要があります。それ以外の場合は、ゼロを返す必要があります。
両方のバリアント (結果 = 0、1) をテストしましたが、驚いたことに、どちらもちらつきを回避しました。
では、Delphi コードに何を入れればよいでしょうか。正しい方法は何ですか?