Размер элемента 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;
}

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам