Размер элемента CListBox изменился при изменении размера поля списка, даже если я укажу размер в методе MeasureItem ()? - PullRequest
1 голос
/ 31 октября 2008

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

1 голос
/ 14 июля 2009

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

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

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

0 голосов
/ 31 октября 2008

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

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

...