作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在维护一些包含以下内容的代码:
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/
我尝试在 WM_CREATE 消息中设置我的首选设备上下文属性,然后在 WM_PAINT 消息中使用它。我的方法是分别在WM_CREATE和WM_PAINT消息中使用SaveDC和RestoreDC函
我是一名优秀的程序员,十分优秀!