Размер элемента 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: Пользовательские элементы управления?