2

私のプログラムには、TPanel上からスライドしてボタンと画像が表示されるカスタムがあります。うまくスライドしますが、隠そうとするととても遅いです。私はいくつかの方法を試しましたが、すべて同じ結果です。以下に気付いた場合、私は末尾の四角形を再描画できると考えて再描画を試みましたが、この呼び出しは、私が試した他のすべての方法と同様にフォーム全体を再描画します。スクロールも使ってみました。私はそれを間違って呼んでいますか、それともパネルが上に移動するときに更新が必要なフォーム部分を更新するためのより良い方法がありますか?

while z>mypanels[panel].Fstarttop do
begin
   if z-x<mypanels[panel].Fstarttop then z:=mypanels[panel].Fstarttop else z:=z-x;
   updaterect:=Rect(mypanels[panel].left,z+mypanels[panel].height,mypanels[panel].left+mypanels[panel].width,mypanels[panel].top+mypanels[panel].height);
   mypanels[panel].top:=z;
   //mypanels[panel].Repaint;
   //Application.ProcessMessages;  
   //mypanels[panel].ScrollBy(0,-x);
   //InvalidateRect(form1.Handle,@updaterect,FALSE);
   //Application.ProcessMessages;
   //RedrawWindow(form1.Handle,@updaterect, 0, RDW_UPDATENOW);
   //form1.refresh;
end;
4

3 に答える 3

3

パネルの移動にはそれほど時間はかかりません。また、パネルの親を更新するには、への呼び出しでForm.Update問題ありません。フォームの一部のみを強制的に再描画するには、すでに行ったように、を呼び出すInvalidateRect必要があります(ただし、背景をクリアしてみてください)。

遅延および/または汚れの考えられる理由は次のとおりです。

  • あなたはでいくつかの広範な独自の描画を行いますForm.OnPaint
  • Anchors、、および/AlignまたはConstraintsパネルおよび/またはフォームが矛盾しているか、連鎖反応を引き起こします(この場合、試しDisableAlignてみてくださいEnableAlign)、
  • フォームはパネルの直接の親ではありません。
  • パネルは他のコントロールの上にあります、
  • updaterect変数は、前の長方形ではなく新しい長方形です。
  • コードや呼び出しルーチンに何か他のものがありますか?
  • 上記の任意の組み合わせ。
于 2012-09-28T05:28:03.033 に答える
1

WindowsUpdateリージョンを使用する別のアプローチ。Tpanelを「ハンドル」プロパティとして使用します。invalidateRectで使用できます。

通常、vclは再描画します:
-パネルの背景
-無効化された長方形のコントロールのみ

于 2012-09-28T03:29:18.720 に答える
0

親TFormのDoubleBufferedプロパティをTrueに設定してみてください。これにより、再描画の実行コストが削減され、クローズアップアニメーションのジッターが減少する可能性があります。

于 2012-09-28T01:46:14.150 に答える