Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Canvas && ListBox


markers ©   (2006-03-01 02:10:00) 

Здраствуйте!
Предомною встыла задача, "выделить", некоторые элементы ListBox, но не просто выделить, а как бы дописать некоторый текст другим цветом и шрифтом. Как мне это реальзовать?
Если использовать TextRect, то предыдущий текст стираеться.....
Заранее спасибо!


markers   (2006-03-01 15:51:00) [1]

Всем спасибо! Сам справился :)


Amoeba   (2006-03-01 12:09:00) [2]


> markers ©   (01.03.06 10:24) [5]
> А то я хотел бы находить размер самого длинного Item`а и
> вставлять эту полученную цифру.

Как это делается, подробно и с полным кодом описано у Тейксейры и Пачеко.


Джо   (2006-03-01 11:43:00) [3]

> А мне нужно надписать допустим слово новинка красным цеветом.")

Font.Color := clRed;


markers   (2006-03-01 10:24:00) [4]

Вот нашёл.
SendMessage(CategoryList.Handle, LB_SETHORIZONTALEXTENT, 400, Longint(0));
Это сообщение обязатиельно при создании формы писать?
А то я хотел бы находить размер самого длинного Item`а и вставлять эту полученную цифру.


markers   (2006-03-01 10:16:00) [5]

Так немного разобрался.

Ну всё в обшем этот вопрос решён, так:
 with (Control as TListBox).Canvas do
  begin
   if odd(Index-1) then Brush.Color:=$FFFFFF
   else Brush.Color:=$F5F5F5;
   if (odSelected in State) or (odFocused in State) or (odComboBoxEdit in State) Then
    begin
     Brush.Color:=clNavy;
     Brush.Style:=bsSolid;
     Font.Color:=clWhite;
    end
   else Font.Color:=(Control as TListBox).Font.Color;
   FillRect(Rect);
   TextOut(Rect.Left+2,Rect.Top+1,CategoryList.Items.Strings[index]);
   if Index = 5 Then
    begin
     TextRect(Rect,Rect.Left+2,Rect.Top+1,CategoryList.Items.Strings[index]);
     Font.Color:=clRed;
     TextOut (Rect.Left+TextWidth(CategoryList.Items.Strings[index])+5, Rect.Top+2, 'Новинка!');
    end
   else
  end;


Теперь есть другой вопрос, как сделать горизантальную прокрутку в ListBox? Где-то видел, но не помню.

Я всегда выводил текст TextRect, Плохо это или хорошо? Хотя впинцепи сейчас понял, что это плохо если Итем длинный.

("Нет, к сожалению я неправильно объяснил. Поясняю.
Есть Items в ListBox (Они кстати тоже OwerDraw используют), которые допустим имеют чёрный цвет. А мне нужно надписать допустим слово новинка красным цеветом.")


Джо   (2006-03-01 02:51:00) [6]

Немного подкорректируй пример, писал половину в редакторе, половину здесь, есть мелкие очевидные огрехи...


Джо   (2006-03-01 02:50:00) [7]

> markers ©   (01.03.06 02:10)

Установить Style := lbOwnerDrawFixed. В обработчике OnDrawItem самому занимать отрисовкой элементов. Схема простая:


// Обработчик OnDrawItem
// Вызывается каждый раз, когда необходимо отрисовать очередной item
//   в Index - номер строки Листбокса
//   в Rect - область, занимаемая конкретной строкой в пределах ListBox'а
procedure TMainFrm.ListBox1DrawItem(Control: TWinControl;
 Index: Integer; Rect: Windows.TRect; State: TOwnerDrawState);
var
begin
 with TListBox(Control).Canvas do
 begin
   // устанавливаем цвет заднего фона
   // и цвет текста строки
   if odSelected in State then
   begin
     Brush.Style := bsSolid;
     Brush.Color := clHighlight;
     Font.Color := clHighlightText;
   end
   else
   begin
     Brush.Style := bsSolid;
     Brush.Color := clWindow;
     Font.Color := clWindowText;
   end;
   // выполняем заливку
   FillRect (Rect);

   // ну, а тут пишем, что нужно,
   // например, просто выводим исходную строку
   TextOut (Rect.Left, Rect.Top, ListBox1.Items[Index]);
......


Германн   (2006-03-01 02:30:00) [8]


>  а как бы дописать некоторый текст другим цветом и шрифтом.


Давай попробуем без "как бы". Сформулируй вопрос точнее.
До встречи в "Начинающим".


Наверх

Титульная страница Поиск, карта сайта Написать письмо