ListViewの描画問題

ListViewでサムネイル表示をするために、LVS_ICONで
カスタムドローを使っているけど、これには問題があることに気づいた。


例えばitemが3000個ある場合、スクロールさせて3000個目を表示したとする。
すると、再描画の度に、0-2999までのNM_CUSTOMDRAWが発生する。
というもの。


LVS_ICONだとitemの位置が指定できるため、このような実装になっているのだろう。
だけど、itemの位置は固定で使用するので、表示されないitemのメッセージは
来て欲しくない。
LVS_LIST、LVS_REPORTなどは、表示されないitemのメッセージはこないのに...。
ちなみに、エクスプローラを調べてみたら、やはり大量にNM_CUSTOMDRAWが発生している。


いろいろ試しているうちに、LVS_OWNERDATAを使えば解決するが、
グルーピングができないなど、制限事項も多い。


ゆくゆくは、コントロールを作り込むのも手かもしれない。
もしくはListBoxをベースにするとか。
鶴亀メールは速度の面からListViewからListBoxに変えたくらいだし。

忘れないうちに、グルーピングのメモ。

SendMessage(hwnd, LVM_ENABLEGROUPVIEW, TRUE, 0);

LVGROUP lg = {sizeof(LVGROUP)};
lg.mask = LVGF_HEADER|LVGF_GROUPID|LVGF_ALIGN;
lg.pszHeader = L"グループ";
lg.cchHeader = 4;
lg.iGroupId = 1;
lg.stateMask = LVGS_NORMAL;
lg.state = LVGS_NORMAL;
lg.uAlign = LVGA_HEADER_LEFT;

SendMessage(hwnd, LVM_INSERTGROUP, 0, (LPARAM)&lg);

LVITEM lvi = {LVIF_TEXT|LVIF_GROUPID};
lvi.iItem = 0;
lvi.iSubItem = 0;
lvi.pszText = _T("テキスト");
lvi.iGroupId = 1;

SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM)&lvi);