2

レポートモードの仮想リストビューコントロールがあり、そのアイテムはNM_CUSTOMDRAW通知を処理して手動で描画します。私が抱えている問題は、私のパフォーマンスが列の数に比例して低下することです。コードをデバッグすることで、クライアントウィンドウにも表示されないアイテムに対してOnCustomDrawとOnGetDispInfoが呼び出されることに気付きました。

1.000行と100列のリストビューがあり、そのうち10行と5列のみが表示されている場合、この10行の各要素に対してOnCustomDrawとOnGetDispInfoが呼び出されることに気付きました。Listviewは、表示されていない95列すべての通知を送信します。

誰かがこのような問題に遭遇しましたか?

4

2 に答える 2

1

ListView はそのまま実装されます。次の最適化だけが頭に浮かびました。

コントロールのサブクラス化を介して、表示される列のリストを追跡します。リスト ビューのサブクラス プロシージャでは、おそらく次のメッセージを処理する必要があります (何かを忘れた場合は、さらに多くのメッセージを処理する必要があります)。

  • WM_CREATE
  • WM_SIZE
  • WM_HSCROLL
  • WM_NOTIFY (((NMHDR*)lParam)->hwndFrom が埋め込みヘッダー コントロールからの場合。LVM_GETHEADER のドキュメントを参照してください)

これらのメッセージのいずれかが来るたびに、元の proc に処理させてから、現在表示されている列のリストを更新します (HDM_GETITEMRECT を参照)。

ダイアログ/ウィンドウ プロシージャで NM_CUSTOMDRAW を処理するときは、表示されている列のリストを参照し、表示されている場合にのみペイントします。

于 2012-05-18T12:26:30.647 に答える
0

私は確かにこれに関する専門家ではありませんがLVN_ODCACHEHINT Notification Code、MSDN を参照する必要があるかもしれません。

于 2012-05-18T13:09:32.873 に答える