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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.042 c
3-1164717372
newby
2006-11-28 15:36
2007.02.18
Максимальное количество полей в Access


1-1166694594
Action
2006-12-21 12:49
2007.02.18
Как сохранить иконку в 32 цветах ?


3-1163080786
Megabyte
2006-11-09 16:59
2007.02.18
Аналог Profiler а(для MSSQL) для Firebird 2.0


3-1164260869
ValexWeb
2006-11-23 08:47
2007.02.18
Как с помощью компоненты TABLE узнать номер текущей отображаемой


8-1150623699
T54
2006-06-18 13:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский