Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.18;
Скачать: CL | DM;

Вниз

ComboBox с цветными линиями вместо текста.   Найти похожие ветки 

 
Kolan ©   (2007-02-01 16:13) [0]

Задача. Есть много разноцветных графиков. Нужно чтобы пользователь мог с помощью 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.


 
Amoeba ©   (2007-02-01 16:31) [1]

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


 
Elen ©   (2007-02-01 16:43) [2]


> Kolan

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


 
Ega23 ©   (2007-02-01 16:48) [3]

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


 
Kolan ©   (2007-02-01 16:52) [4]

Вроде рисует.
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) [5]

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

Ну его.


 
Kolan ©   (2007-02-01 17:27) [6]

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

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

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


 
Kolan ©   (2007-02-02 10:03) [7]

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


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


> 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 12:21) [9]

Даа, намудрил я.
Посмотрев исходник комбо бокса сделал вот так:
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;


 
Kolan ©   (2007-02-02 12:23) [10]

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

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

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



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

Текущий архив: 2007.02.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
15-1169863411
Hero
2007-01-27 05:03
2007.02.18
Народ возникла идея, нужно запустить музыку с моего компа в поток


1-1166712459
Чапаев
2006-12-21 17:47
2007.02.18
Constant expression violates subrange bounds


15-1169733670
vasIzmax
2007-01-25 17:01
2007.02.18
Тест по ТАСО


15-1170099470
hmmm
2007-01-29 22:37
2007.02.18
помогите перевести фразу с eng.


1-1166783436
STIK
2006-12-22 13:30
2007.02.18
Сохранение компоненты.