【问题标题】:How to draw on the entire area of a resized TImage in Delphi?如何在 Delphi 中绘制调整大小的图像的整个区域?
【发布时间】:2009-10-20 08:50:53
【问题描述】:

我已将我在 Delphi 2009 中使用 TImage.Canvas 绘制的问题缩小到以下可重现的情况:

给定:一个表格,上面有一个TImageTLabelTButtonTImage 锚定到所有四个边缘,因此调整表单大小将调整TImage 的大小。我想要做的是在调整大小后利用Image1 的最大可用区域。所以在我的测试用例中,我的 Button 的 OnClick 处理程序中有以下代码:


procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:= IntToStr (Image1.Width)+' x '+IntToStr(Image1.Height);
  Image1.Canvas.Pen.Color:= 0;
  Image1.Canvas.Rectangle(0,0,Image1.Width, Image1.Height);
end;
您会看到,如果调整了表单的大小,Image1.Width.Height 会按预期更改,但是如果调整后的表单大于原始矩形,则绘制的矩形将是不完整的,仅在以前存在的同一区域上绘图。

如何让它使用整个调整大小的区域?

对于它的价值,在我最初的问题中,我使用了Image1.Stretch,它允许我在调整大小时使用更多的区域,但会导致我的绘图被扭曲(不希望出现)。如果我也使用Image1.Proportional,那就更好了,但我仍然无法使用可用的全部区域。 Image1.AutoSize 似乎也没有做任何对我有用的事情。

任何帮助表示赞赏。

【问题讨论】:

  • 如果你想要一些可以绘画的东西,TImage 是错误的选择。 TImage 用于显示图形。如果您希望它看起来不同,请更改底层图形,然后刷新图像。如果您想直接在控件上绘制,请改用 TPaintBox。
  • @Rob - 感谢您指出这一点。实际上我两者都做,绘画和展示,在这种特定情况下,TImage 是更方便的选择。

标签: delphi timage


【解决方案1】:

在表单中添加 OnResize 事件:

procedure TForm1.FormResize(Sender: TObject);
begin
  Image1.Picture.Bitmap.Width := Image1.Width;
  Image1.Picture.Bitmap.Height := Image1.Height;
end;

另外,如果您使用组件进行绘图,而不是显示来自文件等的图像,请考虑使用 TPaintBox 而不是 TImage。

【讨论】:

  • 谢谢,成功了。回覆。 TPaintBox 建议 - 在真正的应用程序中,除了绘图之外,我还必须使用它做其他几件事,所以 TImage 更适合我。
【解决方案2】:

也许您还必须调整 Image1.Picture.Width/Height 或 Image1.Picture.Bitmap.Width/Height。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2016-05-06
    • 2019-05-27
    • 2014-11-04
    • 2012-08-20
    相关资源
    最近更新 更多