delphi - RestoreDC之后我需要调用TCanvas.Refresh吗?

标签 delphi

我正在维护一些包含以下内容的代码:


    Canvas.Refresh;
    SavedDC := SaveDC(Canvas.Handle);
    try
      // Paint Stuff to the Canvas
    finally
      RestoreDC(Canvas.Handle, SavedDC);
      Canvas.Refresh;
    end;

我了解到 TCanvas.Refresh 与组件刷新完全不同。它不会导致任何绘画,它只是 invalidates the Font, Pen, and Brush of the canvas .

我不明白为什么你会在保存 DC 之前调用 .Refresh ,然后在恢复 DC 后调用 .Refresh 。这似乎违背了 SaveDC/RestoreDC 调用的目的。

这些调用的更合理顺序似乎是:


  SaveDC(Canvas.Handle)
  Canvas.Refresh
  try
     // Do my painting
  finally
    RestoreDC(Canvas.Handle, SavedDC);
  end;

由于我从未见过或使用过 TCanvas.Refresh 方法,因此我想检查并确保我正确理解了这一点。

最佳答案

这里有一个解释 - http://edn.embarcadero.com/article/27786

在 RestoreDC 之后调用 Refresh 可保证 TCanvas 状态和底层设备上下文之间的同步。

不确定在现代 Windows 版本中是否有必要在 SaveDC 之前调用 Refresh,但这没有什么问题。

我建议保留代码不变。

关于delphi - RestoreDC之后我需要调用TCanvas.Refresh吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4627434/

相关文章:

delphi - TStringList.LoadFromFile Unicode

delphi - 如何设置 TDBGrid 排序中的字符顺序?

sql-server - 根据ADO提供程序格式化日期

delphi - 如何使用JPEG给表单提供静态背景图片并对其进行放置控制?

delphi 5 应用程序在 win7 x64 的面板上显示错误

delphi - 为什么 Treeview.Clear 在父窗体边框样式更改上失败?

delphi - 在 Delphi 项目中更改多个窗体上的属性的快速方法?

Delphi/Indy10 如何在不下载内容的情况下检查 https URL 是否有效

Delphi 返回 TList 时出错

linux - 如何在Delphi中实时读取cygwin程序的命令行输出?