![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
> а как бы дописать некоторый текст другим цветом и шрифтом.
Давай попробуем без "как бы". Сформулируй вопрос точнее.
До встречи в "Начинающим".