我编写了一个事件处理程序方法,并将其附加到Paint
的{{1}}事件(只是主窗口)。此事件会发送一个Form
,其中包含一个名为PaintEventArgs
的属性,该属性是Graphics
的一个实例。
以下是我正在使用的代码:
System.Drawing.Graphics
最后,我只是想更好地了解这里发生的事情,但具体来说我有三个问题:
private void Form1_Paint(object sender, PaintEventArgs e) {
Bitmap bm = new Bitmap("fruit-dealer-full.jpg");
Graphics g1 = this.CreateGraphics();
Graphics g2 = e.Graphics;
// g1.DrawImage(bm, 0, 0, this.Width, this.Height);
// g1.DrawRectangle(
// Pens.White, 10.0f, 10.0f, this.Width - 200, this.Height - 200);
g2.DrawImage(bm, 0, 0, this.Width, this.Height);
g2.DrawRectangle(
Pens.White, 10.0f, 10.0f, this.Width - 200, this.Height - 200);
}
在整个窗口中重绘图像,而g1
只绘制新部分,即使我在绘图前调用g2
?g2.Clear()
个对象,只是在窗口大小增加时重绘图像,而不是在它变小时重绘?Graphics
可以(或不应该)用于绘图,它用于什么?我想,如果表单不需要重绘,它只会阻止你创建一个新的PaintEventArgs.Graphics
实例;我还缺少哪些东西?答案 0 :(得分:3)
你的.NET WinForms孩子真的应该学习Win32 API。拿起一份Petzold吧!
为什么g1会在整个窗口中重绘图像,而g2只绘制新的部分,即使我在绘制之前调用g2.Clear()?
据推测,g2
是从BeginPaint
收到的设备上下文的包装器。我想WinForms会为你包裹PAINTSTRUCT::rcPaint
- 这个变量描述了要绘制的区域。这是预期的行为 - 而不是燃烧CPU周期重新绘制整个窗口每次只有一个像素重叠它,你可以重绘...只有一个像素!
g2.Clear
可能受rcPaint
限制。
g1
可能是窗口的GetDC
- 它可以为您提供整个表面。
为什么使用Graphics对象时,图像只在窗口大小增加时重绘,而不是在缩小时重绘?
底层窗口类可能没有CS_HREDRAW
或CS_VREDRAW
窗口样式。如果没有这些,没有理由要求您在窗口变小时请求重绘窗口的默认行为:Windows知道整个窗口的样子,它可以剪掉不需要的位。这与窗口变大时不同,它不知道在新区域中绘制什么。
如果PaintEventArgs.Graphics可以(或不应该)用于绘图,它用于什么?我想,如果表单不需要重绘,它只会阻止你创建一个新的Graphics实例;我还缺少哪些东西?
它用于绘图。除非您有一些复杂的绘图要求,否则您可以使用PaintEventArgs.Graphics
最小化进入窗口的绘画量。 (如上所述 - 这是CPU周期的巨大节省,它可能是BeginPaint
和EndPaint
的简单包装 - how drawing to the client area is meant to be done。)
答案 1 :(得分:1)