2016-08-20 9 views
0

パネルにレイアウトされたTImageインスタンスがあります。 TImagesはアイコンを表します(添付のスクリーンショットを参照)。私は、ユーザーがそれをクリックして選択すると、特定のTImageインスタンスの周りに赤い矩形を描きたいと思います。続行する方法がわからない...選択時にTImageの周囲に矩形を描画する方法

編集:なぜ私はTToolbarを使用しませんか?理由1:TToolbarのデフォルトの「ルックアンドフィール」が気に入らず、もっとコントロールしたいと思っています。理由2:このコントロールは本当にTToolbarではありません。むしろ、ブックマークが選択されていることに応じてメモフィールドに異なるテキストを表示する一種の「ブックマーク」要素と考えるべきです。レミールボーの提案を使用して

enter image description here

受け入れ解決策を以下に示します。

enter image description here

+0

それぞれをwincontrolに入れます。パネルにはクリックイベントがあります。パネルにパディングと色を付けます。 –

+0

もし私があなただったら、私はカスタムコントロールを使っています。 –

+1

さらに、平坦なツールボタンなどを使用してください。ツールバーのように見えます。 –

答えて

7

は、私が代わりにTImageTPaintBoxを使用してお勧めします。適切なTGraphicクラス(TBitmapTIconTPNGImageなど)にイメージをロードしてから、TPaintBoxOnPaintイベントにイメージを描画します。これはすべて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

TImageにTBitmap以外のグラフィックを使用すると、(TMyImage.Paint'の)TImage Canvasを修正しようとすると動作しません: '画像にビットマップが含まれている場合のみ変更できます.''キャンバスを継承した 'TImage'祖先、つまり' TGraphicControl.Canvas' – kobik

+0

@kobik良い点です。私の例を更新しました。 –

-1

私はTRectangleを使用することをお勧めします。 Fillプロパティを使用してビットマップ(ビットマップ、jpgなど)を追加し、境界線のStrokeプロパティを設定することができます。

また、丸い枠線のxRadiusプロパティとyRadiusプロパティを設定できます。

関連する問題