作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在面板上布置了一组 TImage 实例。 TImages 代表图标(见附件截图)。当用户通过单击选择它时,我想在给定的 TImage 实例周围绘制一个红色矩形。不确定如何进行...
编辑:为什么我不使用 TToolbar?原因 1:我不喜欢 TToolbar 的默认“外观和感觉”,我想对其进行更多控制。原因 2:这个控件不是真正的 TToolbar。它应该被视为一种“书签”元素,根据选择的“书签”在备注字段中显示不同的文本。
接受 Remy Lebeau 建议的解决方案如下所示:
最佳答案
我建议使用 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;
关于delphi - 选择时如何在 TImage 周围绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049421/
我是一名优秀的程序员,十分优秀!