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

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

ComboBox с цветными линиями вместо текста.


Kolan ©   (2007-02-01 16:13:00) 

Задача. Есть много разноцветных графиков. Нужно чтобы пользователь мог с помощью ComboBox выбрать один из них.
Те надо чтобы в ComboBox'е были цветные линии вместо текста.
Как это сделать?
Понятно что есть OnDrawItem, а что дальше?

procedure TMainForm.MeasurmentComboBoxDrawItem(Control: TWinControl;
 Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
 (Control as TComboBox).Canvas.PenPos := Point(5, 5);
 (Control as TComboBox).Canvas.Pen.Width := 2;
 (Control as TComboBox).Canvas.LineTo((Control as TComboBox).Width - 20, 5);
end;

Потыкался - неочень что-то получается :(

ЗЫ
 А что такое тут Rect.


Kolan   (2007-02-02 12:23:00) [1]

> Кстати, на счёт Canvas.Pen.Width := 2 советую справку по
> Pen проштудировать, там очень интересные уточнения про ширину
> есть.

Note:
The value of Width influences which values of Style are valid.

Это? И что это значит? Style'ом я не пользуюсь...


Kolan   (2007-02-02 12:21:00) [2]

Даа, намудрил я.
Посмотрев исходник комбо бокса сделал вот так:
procedure TMeasurmentManager.MeasurmentComboBoxDrawItem(Control: TWinControl;
 Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
 with (Control as TComboBox) do
 begin
   Canvas.FillRect(Rect);
   if Index >= 0 then
   begin
     Canvas.TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index));
     if Index = FCurrentIndex then
       Canvas.Pen.Width := 3
     else
       Canvas.Pen.Width := 1;
     Canvas.Pen.Color := TColor(FColorList.Items[Index]);
     Canvas.PenPos := Point(Rect.Left + 18, Rect.Top+6);
     Canvas.LineTo(Rect.Right - 12, Rect.Top+6);
   end;
 end;
end;


Плохиш   (2007-02-02 11:06:00) [3]


> Kolan ©   (01.02.07 17:27) [6]
> [4] Kolan ©   (01.02.07 16:52)
> Непонятно, да?
>
> Я допустим цвета идут: красный, синий, зеленый. Я выбрл
> зелёный. И он у меня даже жирным выделился(Canvas.Pen.Width
> := 2). Но на самом прямоугольноке ComboBox'а(НЕ выпадающий
> список) как был красный так и остался красный потому, что
> он первый в списке..
>
> Как сделать чтобысверху был текущий?

Надо сказать требуемому комбобоксу волшебное слово Repaint.
Кстати, на счёт Canvas.Pen.Width := 2советую справку по Pen проштудировать, там очень интересные уточнения про ширину есть.


Kolan   (2007-02-02 10:03:00) [4]

Вот нашел:
odComboBoxEditи соотв State надо анализировать.


Kolan   (2007-02-01 17:27:00) [5]

[4] Kolan ©   (01.02.07 16:52)
Непонятно, да?

Я допустим цвета идут: красный, синий, зеленый. Я выбрл зелёный. И он у меня даже жирным выделился(Canvas.Pen.Width := 2). Но на самом прямоугольноке ComboBox'а(НЕ выпадающий список) как был красный так и остался красный потому, что он первый в списке..

Как сделать чтобысверху был текущий?


Kolan   (2007-02-01 16:52:00) [6]

Вроде рисует.
var
 I: Integer;
 AWidth, AHalfHeight: Integer;
begin
 with (Control as TComboBox) do
 begin
   AWidth := Rect.Right - Rect.Left;
   AHalfHeight := Round((Rect.Bottom - Rect.Top)/2);
   for I := 0 to Items.Count - 1 do
   begin
     Canvas.Pen.Color := TColor(FColorList.Items[I]);
     if I = FCurrentIndex then
       Canvas.Pen.Width := 2
     else
       Canvas.Pen.Width := 1;
     Canvas.PenPos := Point(5, AHalfHeight*(I+1)+AHalfHeight*(I)+I);
     Canvas.LineTo(Width - 20, AHalfHeight*(I+1)+AHalfHeight*(I)+I);
   end;
 end;
end;


Только как нарисовать на самом(не на выпадающем списке) ComboBox'е текущую(те выбраную сейчас) линию.
А то получается всегда выбрана та линия которая первая.
И как избавится от пунктирных прямоугольноков?


Kolan   (2007-02-01 16:52:00) [7]

> Поставь RxLib, там готовый есть.

Ну его.


Ega23   (2007-02-01 16:48:00) [8]

Поставь RxLib, там готовый есть.


Elen   (2007-02-01 16:43:00) [9]


> Kolan

Для комбобокса стиль выставил в csOwnerDrawXX ?


Amoeba   (2007-02-01 16:31:00) [10]

А что мешает как следует проштудировать справку по TComboBox? Очень на многие вопросы даст ответ, если делать это вдумчиво.


Наверх

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