7

私のアプリケーションには、いくつかのCListCtrlテーブルがあります。forループのある配列からのデータでそれらを埋め/更新します。ループ内では、値の表示方法を調整する必要があるため、データバインディングはまったく不可能です。

実際の問題は、テーブルが行ごとに再描画されるため、テーブルを埋めるのにかかる時間です。コントロールがいっぱいになっているときにコントロールを非表示にし、ループが完了したときに再び表示できるようにすると、メソッド全体がはるかに高速になります。

今、私はそれが完全に満たされるまでコントロールが再描画するのを止める方法を探しています。または物事をスピードアップする他の方法。

4

2 に答える 2

20

SetRedrawメソッドを調べます。コントロールの入力を開始する前にSetRedraw(FALSE)を呼び出し、終了したらSetRedraw(TRUE)を呼び出します。

また、これにはRAIIを使用することをお勧めします。

class CFreezeRedraw
{
public:
   CFreezeRedraw(CWnd & wnd) : m_Wnd(wnd) { m_Wnd.SetRedraw(FALSE); }
   ~CFreezeRedraw() { m_Wnd.SetRedraw(TRUE); }
private:
   CWnd & m_Wnd;
};

次に、次のように使用します。

CFreezeRedraw freezeRedraw(myListCtrl);
//... populate control ...

freezeRedraw関数が終了する前にスコープ外に出たい場合は、リストコントロールにデータを入力するコードの周りに人工的なブロックを作成できます。

于 2009-07-10T13:31:27.897 に答える
6

多数のレコードがある場合は、仮想リスト スタイル ( LVS_OWNERDATA) を使用する方が適切な場合があります。詳細については、こちらをご覧ください。

于 2009-07-10T14:13:04.227 に答える