Форум: "Начинающим";
Текущий архив: 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