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