Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > OnMeasureItem в TListBox


Автор: Alix 6.5.2005, 09:38
При рисовании со стилем lbOwnerDrawVariable по хелпу должны происходить два события - измерение высоты элемента и сразу после этого - его прорисовка. В моем проете ширина формы и соотв. ListBox'a может менятся, => изменится высота некоторых элементов (переносы есть). И следовательно их высоту следует заново замерить, чтобы корректно отображать.
Но на деле, измерение высоты происходит только при первой прорисовке итем'a! И заставляя ListBox перерисовываться с помощью Repaint, Refresh и Invalidate вызвать новое измерение высоты не удалось... Что делать?

Автор: Rennigth 6.5.2005, 09:41
так и непонял о чем ты но попробуй вызвать Resize

Автор: Alix 6.5.2005, 10:44
Чего тут неясного? Вот. Ширина ListBox'a достаточна, чтобы вместить текст.
http://zavalenka.narod.ru/right.PNG
А теперь, ширина уменьшилась и долдно было произойти повторное измерение высоты элементов. Но их высоты не изменились!.. И теперь в событии OnDrawItem происходит некорректное рисование...
http://zavalenka.narod.ru/wrong.PNG
Нужно как-то заставить ListBox еще раз измерить высоту... Но как?

Автор: s-mike 6.5.2005, 11:07
Цитата(Alix @ 6.5.2005, 10:44)
Нужно как-то заставить ListBox еще раз измерить высоту... Но как?

Код

var
  I, H: Integer;
begin
  for I := 0 to ListBox.Items.Count - 1 do
  begin
    H := 0;
    ListBoxMeasureItem(ListBox, I, H);
    ListBox.Perform(LB_SETITEMHEIGHT, I, H);
  end;


Автор: Alix 6.5.2005, 12:52
Спасибо smile Хотя я почти подошел к ответу... Я использовал Perform и CN_MeasureItem =) Та еще запара... (структуру заполнять...)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)