Mesoscopic Programming

タコさんプログラミング専門

Programming Tips #2 ツリービューコントロールの I_CHILDRENCALLBACK

ツリービューコントロールのアイテム属性で cChildren メンバに I_CHILDRENCALLBACK を設定すると、表示が必要になったときに TVN_GETDISPINFO イベントが発生するわけだが、この発生順序がコントロールのペイントのあとであることがわかった。
TVN_GETDISPINFO イベント処理中でアイテム設定を変更しても自動的に再描画は行われないらしいので、自分で再描画の指示を出す必要があるのだ。
デバッガで中断しつつだとちゃんと表示されるのに、中断しないで実行すると表示が変なのでおかしいなと思ったらどうやらそういうことらしいのだ。

TVN_GETDISPINFO イベント

以下はツリービューコントロールの TVN_GETDISPINFO イベント関数である。

LRESULT TreeView :: OnTvnGetDispInfo()
{
    TVITEM tvItem;

    ZeroMemory( & tvItem, sizeof tvItem );

    tvItem.mask  = TVIF_HANDLE | TVIF_CHILDREN;
    tvItem.hItem = lpnmtvdi->item.hItem;

    if ( CreateChild( lpnmtvdi->item.hItem ) > 0 )
    {
        tvItem.cChildren = 1;
    }

    TreeView_SetItem( hTree, & tvItem );

    InvalidateRect( hTree, NULL, FALSE );

    return 0;
}

アイテムの更新設定をしても自動で再描画は行われないため、InvalidateRect() により明示的に再描画を行わせるとうまく行く。

以上。