【问题标题】:Delphi - TPaintBox - ResizeDelphi - TPaintBox - 调整大小
【发布时间】:2023-03-23 01:14:01
【问题描述】:

我在调整 TPaintBox 大小并在其上绘图时遇到问题:

在我的表单(名为 FMain)上,我放置了一个 TPaintBox(名为 DisplayImage),我正在尝试在调整表单大小时调整它的大小。

为此,我为 FMain 编写了一个 OnResize() 方法(我确认它被正确调用),在该方法中我尝试调整 DisplayImage 的大小:

procedure TFMain.FormResize(Sender: TObject);
begin
   DisplayImage.Width := FMain.ClientWidth;
   DisplayImage.Height := FMain.ClientHeight;

   DisplayImage.Canvas.Brush.Color := clGreen;
   DisplayImage.Canvas.Brush.Style := bsSolid;
   DisplayImage.Canvas.Rectangle(0, 0, DisplayImage.Width, DisplayImage.Height);
end;

恕我直言,最后一个代码应该在整个图像上绘制一个完整的绿色矩形,使其有效地始终为绿色。相反,我得到一个灰色图像(就像 Delphi 的标准 bg-color 一样),并且在调整大小期间每隔一秒绿色图像就会闪烁。

我错过了什么,调整大小后是否需要更新一些隐藏组件?

提前谢谢你,

暴雪

【问题讨论】:

    标签: delphi resize onresize paintbox


    【解决方案1】:

    首先,而不是做

    DisplayImage.Width := FMain.ClientWidth;
    DisplayImage.Height := FMain.ClientHeight;
    

    在每次调整大小时,只需设置油漆框的Align := alClient

    其次,要绘制到paint box,使用paint box的OnPaint事件:

    procedure TFMain.DisplayImagePaint(Sender: TObject);
    begin
       DisplayImage.Canvas.Brush.Color := clGreen;
       DisplayImage.Canvas.Brush.Style := bsSolid;
       DisplayImage.Canvas.Rectangle(0, 0, DisplayImage.Width, DisplayImage.Height)
    end;
    

    【讨论】:

    • 谢谢,工作就像一个魅力 :) 但是它应该可以在画布上绘图,或者 OnPaint 事件是否会覆盖我的绘图?
    • 正在在画布上绘图。您不需要需要这样做OnPaint(即使这是一个非常好的主意)——您可以在Button1Click 或类似的东西上这样做。然而,表格调整大小是一个相当微妙的时间来进行绘画。可能有 WM_ERASEBKGND 或类似名称会撤消您的绘画。
    • @ThE - (除了 Andreas 的评论)这样想:每当 PaintBox 需要绘画时都会调用 OnPaint,但如果您不使用 OnPaint 绘画,您的绘画将被删除 f.i.当您将另一个窗口放在表单前面时。文档中有一个示例显示了差异:docwiki.embarcadero.com/CodeSamples/en/OnPaint_%28Delphi%29
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多