Главная страница
    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.47 MB
Время: 0.038 c
3-1164031051
DeadMeat
2006-11-20 16:57
2007.02.18
Совместное использование одной таблицы


15-1169523391
Slider007
2007-01-23 06:36
2007.02.18
С днем рождения ! 23 января


3-1164605686
Kvinta
2006-11-27 08:34
2007.02.18
DBGrid. Запомнить позицию.


2-1169807186
Officeman
2007-01-26 13:26
2007.02.18
Вывод данных с TListView на Принтер


2-1170241340
Radgar
2007-01-31 14:02
2007.02.18
Поворот рисунка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский