![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MeasureItem [D5, Win2k]
_aero_ © (2002-05-02 15:51:00)возникла проблема по поиску ничего не нашел, хотя проблема наверняка часто встречается.
хочу отображать текст в listbox в несколько строчек для этого говорю, что он ownerdravvariable и делаю обработчик события onmeasureitem, но это событие отрабатывает один раз и только при создании формы или изменении Items, и не отрабатывает при изменении размеров listbox
Вопрос: как правильно сделать изменение высоты айтема при изменении размеров контрола.
_aero_ (2002-05-03 03:55:00) [1]к сожалению, не помогло, дело в том что изменение Rect ни к чему не приводит - следующая строчка все затирает, помогло следующее обходное решение
procedure TForm1.FormResize(Sender: TObject);
begin
lb.Items.BeginUpdate;
lb.Items.SetText(lb.Items.GetText);
lb.Items.EndUpdate;
end;
таким образом при обновлении всех айтемов повторно вызывается onMeasureItem,
упрощенные обработчики на отрисовку и измерение ниже
procedure TForm1.lbMeasureItem(Control: TWinControl;
Index: Integer; var NewHeight: Integer);
begin
with (Control as TListBox) do
NewHeight := (Canvas.TextWidth(Items[Index]) div ClientWidth + 1) * ItemHeight;
end;
procedure TForm1.lbDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
with (Control as TListBox) do
DrawText( Canvas.Handle, PChar(Items[Index]), -1, Rect, DT_WORDBREAK);
end;
_aero_ (2002-05-02 19:56:00) [2]спасибо, попробую
Song (2002-05-02 18:39:00) [3]Надо делать на onDrawItem, а текст выводить через TextOut() или удобней через DrawText()
Для изменения размера строчки соответственно меняйте Rect