Размер элемента CListBox изменился при изменении размера списка, даже если я укажу размер в методе MeasureItem()?

Я использовал класс, производный от 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;
}

Но размер элемента изменяется в соответствии с изменением размера поля списка. что-то не так с моим подходом?


person user26404    schedule 31.10.2008    source источник


Ответы (2)


Что не упоминается в справке, так это то, что WM_MEASUREITEM вызывается каждый раз при изменении размера элемента управления *_OWNERDRAWFIXED.

Однако я не знаю, насколько официально это поведение и следует ли на него полагаться, но оно было проверено на CodeGuru и несколько сообщений на форуме, найденных в Google.

Если вы не хотите обрабатывать сообщение, просто установите приватный флаг где-нибудь в первом вызове OnMeasureItem() и вернитесь из него, как только проверите, что он установлен в следующий раз.

person macbirdie    schedule 14.07.2009

Если вы посмотрите на запись MSDN для CListBox::MeasureItem вы увидите, что он вызывается только один раз, если не установлен стиль LBS_OWNERDRAWVARIABLE (не LBS_OWNERDRAWFIXED). Если я правильно понимаю, это объясняет поведение, которое вы видите, потому что MeasureItem нужно будет вызывать каждый раз, когда изменяется размер элемента управления.

Кроме того, рассмотрели ли вы вопросы, сделанные в Техническом примечании 14 MFC? : Пользовательские элементы управления?

person Stu Mackellar    schedule 31.10.2008