2016-08-20 3 views
0

У меня есть набор экземпляров TImage, выложенных на панели. TImages представляют значки (см. Прилагаемый скриншот). Я хотел бы нарисовать красный прямоугольник вокруг заданного экземпляра TImage, когда пользователь выбирает его, нажимая на него. Не знаю, как продолжить ...Как нарисовать прямоугольник вокруг TImage, когда он выбран

Редактировать: почему я не использую TToolbar? Причина 1: Мне не нравится по умолчанию «внешний вид» TToolbar, и я хочу иметь больше контроля над ним. Причина 2: Этот элемент управления не является TToolbar. Его скорее следует рассматривать как своего рода элемент «закладки», который отображает другой текст в поле memo, в зависимости от выбранной «закладки».

enter image description here

Принятое решение с использованием предложения Remy Лебо является показано ниже:

enter image description here

+0

Поместите каждый на wincontrol, например. панель, которая имеет событие click. Отдайте прокладку и цвет панели. –

+0

Если бы я был вами, я бы использовал для этого специальный пользовательский элемент управления. –

+1

Еще лучше, используйте плоские кнопки или аналогичные ... Похож на панель инструментов. –

ответ

7

Я хотел бы предложить использовать TPaintBox вместо TImage. Загрузите изображение в соответствующий класс TGraphic (TBitmap, TIcon, TPNGImage и т. Д.), А затем нарисуйте его на TPaintBox в своем OnPaint событии. Это все TImage действительно делает (он содержит TGraphic, который нарисован на его Canvas при окрашивании). Затем вы можете нарисовать красный прямоугольник поверх изображения. Например:

procedure TMyForm.PaintBox1Click(Sender: TObject); 
begin 
    PaintBox1.Tag := 1; 
    PaintBox1.Invalidate; 
    PaintBox2.Tag := 0; 
    PaintBox2.Invalidate; 
end; 

procedure TMyForm.PaintBox2Click(Sender: TObject); 
begin 
    PaintBox1.Tag := 0; 
    PaintBox1.Invalidate; 
    PaintBox2.Tag := 1; 
    PaintBox2.Invalidate; 
end; 

procedure TMyForm.PaintBox1Paint(Sender: TObject); 
begin 
    PaintBox1.Canvas.Draw(MyImage1, 0, 0); 
    if PaintBox1.Tag = 1 then 
    begin 
    PaintBox1.Canvas.Brush.Style := bsClear; 
    PaintBox1.Canvas.Pen.Color := clRed; 
    PaintBox1.Canvas.Rectangle(PaintBox1.ClientRect); 
    end; 
end; 

procedure TMyForm.PaintBox2Paint(Sender: TObject); 
begin 
    PaintBox2.Canvas.Draw(MyImage2, 0, 0); 
    if PaintBox2.Tag = 1 then 
    begin 
    PaintBox2.Canvas.Brush.Style := bsClear; 
    PaintBox2.Canvas.Pen.Color := clRed; 
    PaintBox2.Canvas.Rectangle(PaintBox2.ClientRect); 
    end; 
end; 

В качестве альтернативы, вы можете получить новый класс из TImage и переопределить его виртуальный метод Paint() нарисовать прямоугольник после рисования по умолчанию. Например:

type 
    TMyImage = class(TImage) 
    private 
    FShowRectangle: Boolean; 
    procedure SetShowRectangle(Value: Boolean); 
    protected 
    procedure Paint; override; 
    public 
    property ShowRectangle: Boolean read FShowRectangle write SetShowRectangle; 
    end; 

procedure TMyImage.SetShowRectangle(Value: Boolean); 
begin 
    if FShowRectangle <> Value then 
    begin 
    FShowRectangle := Value; 
    Invalidate; 
    end; 
end; 

type 
    TGraphicControlAccess = class(TGraphicControl) 
    end; 

procedure TMyImage.Paint; 
begin 
    inherited; 
    if FShowRectangle then 
    begin 
    with TGraphicControlAccess(Self).Canvas do 
    begin 
     Brush.Style := bsClear; 
     Pen.Color := clRed; 
     Rectangle(ClientRect); 
    end; 
    end; 
end; 

procedure TMyForm.MyImage1Click(Sender: TObject); 
begin 
    MyImage1.ShowRectangle := true; 
    MyImage2.ShowRectangle := false; 
end; 

procedure TMyForm.MyImage2Click(Sender: TObject); 
begin 
    MyImage1.ShowRectangle := false; 
    MyImage2.ShowRectangle := true; 
end; 
+0

Спасибо! Это сработало! – BigONotation

+0

Если вы используете графику, отличную от TBitmap для TImage, попытка изменить TImage Canvas (в 'TMyImage.Paint') не будет работать и будет повышаться:« Могу только модифицировать изображение, если оно содержит растровое изображение ». Вам нужно изменить' унаследованный холст' предка 'TImage', т. е.' TGraphicControl.Canvas' – kobik

+0

@kobik хорошая точка. Я обновил свой пример. –

-1

Я бы рекомендовал использовать TRectangle. Вы можете добавить растровое изображение (растровое изображение, jpg и т. Д.) С помощью свойства Fill и установить свойство Stroke для границы.

Вы также можете установить свойства xRadius и yRadius для закругленных границ.

Смежные вопросы