Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Canvas && ListBox   Найти похожие ветки 

 
markers ©   (2006-03-01 02:10) [0]

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


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


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


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


 
Джо ©   (2006-03-01 02:50) [2]

> 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:51) [3]

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


 
markers ©   (2006-03-01 10:16) [4]

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

Ну всё в обшем этот вопрос решён, так:
 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 используют), которые допустим имеют чёрный цвет. А мне нужно надписать допустим слово новинка красным цеветом.")


 
markers ©   (2006-03-01 10:24) [5]

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


 
Джо ©   (2006-03-01 11:43) [6]

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

Font.Color := clRed;


 
Amoeba ©   (2006-03-01 12:09) [7]


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

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


 
markers ©   (2006-03-01 15:51) [8]

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.051 c
2-1142886213
makvell
2006-03-20 23:23
2006.04.02
isql


3-1139307056
kblc
2006-02-07 13:10
2006.04.02
Password on DB MS Access


1-1141204858
BFG9k
2006-03-01 12:20
2006.04.02
Правильное использование WriteBuffer/ReadBuffer в IndyTCPClient


15-1141835083
tesseract
2006-03-08 19:24
2006.04.02
сказёвые радости


3-1138969011
GLFox
2006-02-03 15:16
2006.04.02
Firebird+модем





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский