1

から派生したクラスを使用しCListBox、次のように作成しました。

style:WS_CHILD|WS_VISIBLE |LBS_OWNERDRAWFIXED | WS_VSCROLL | WS_HSCROLL

ListBox のアイテムは、リスト ボックスのサイズに影響されず、固定サイズであることが期待されます。そこで、以下のように項目のサイズを指定する MeasureItem() メソッドをオーバーライドします。

void CMyListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
    lpMIS->itemHeight = ALBUM_ITEM_HEIGHT;
    lpMIS->itemWidth = ALBUM_ITEM_WIDTH;
}

ただし、リスト ボックスのサイズ変更に応じて項目のサイズが変更されます。私のアプローチに何か問題がありますか?

4

2 に答える 2

1

リファレンスで言及されていないのは、コントロールのサイズが変更されるたびにWM_MEASUREITEM呼び出されることです。*_OWNERDRAWFIXED

ただし、この動作がどの程度公式であり、信頼できるかどうかはわかりませんが、CodeGuruで検証されており、Google に関するいくつかのフォーラム投稿が見つかりました。

メッセージを処理したくない場合は、最初のOnMeasureItem()呼び出しのどこかにプライベート フラグを設定し、次に設定されていることを確認したらすぐに戻ります。

于 2009-07-14T14:46:18.567 に答える
0

If you look at the MSDN entry for CListBox::MeasureItem you'll see that it's only called once unless the LBS_OWNERDRAWVARIABLE (not LBS_OWNERDRAWFIXED) style is set. If I understand correctly then this would explain the behaviour you're seeing because MeasureItem would need to be called each time the control's size changes.

Also, have you considered the points made in MFC Technical Note 14 : Custom Controls?

于 2008-10-31T11:19:36.473 に答える