我正在使用BufferedGraphics绘制一些东西,然后我将它绘制到用户控件上.这是代码: Private context As BufferedGraphicsContextPrivate grafx As BufferedGraphics Private Sub PaintDoc_Load(ByVal sender As Object, ByVal e
Private context As BufferedGraphicsContext Private grafx As BufferedGraphics Private Sub PaintDoc_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) Me.UpdateStyles() context = BufferedGraphicsManager.Current context.MaximumBuffer = New Size(Me.Width + 1, Me.Height + 1) grafx = context.Allocate(Me.CreateGraphics, New Rectangle(0, 0, Me.Width, Me.Height)) grafx.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear grafx.Graphics.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality grafx.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality grafx.Graphics.Clear(Color.Transparent) End Sub Private Sub PaintDoc_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove If e.Button = Windows.Forms.MouseButtons.Left Then grafx.Graphics.FillEllipse(New SolidBrush(DrawColorFinal), CInt(e.x - (BrushWidth / 2)), CInt(e.y - (BrushWidth / 2)), BrushWidth, BrushWidth) Me.Invalidate() End If End Sub Private Sub PaintDoc_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint grafx.Render(e.Graphics) End Sub
问题是,grafx不具有透明背景,但是背景为黑色.有什么想法吗?
更新:
感谢Hans Passant解决了问题,这里是支持快速多层图像绘制的最终代码:
Public Class PaintDoc Public backBuffer(1) As Bitmap Public bufferGraphics(1) As Graphics Public layerIndex As Integer = 0 Private Sub PaintDoc_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint, True) Me.UpdateStyles() For i As Integer = 0 To backBuffer.Length - 1 backBuffer(i) = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb) bufferGraphics(i) = Graphics.FromImage(backBuffer(i)) bufferGraphics(i).InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear bufferGraphics(i).PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality bufferGraphics(i).SmoothingMode = Drawing2D.SmoothingMode.HighQuality Next End Sub Private Sub PaintDoc_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove If e.Button = Windows.Forms.MouseButtons.Left Then bufferGraphics(layerIndex).FillEllipse(New SolidBrush(DrawColorFinal), CInt(e.X - (BrushWidth / 2)), CInt(e.Y - (BrushWidth / 2)), BrushWidth, BrushWidth) Me.Invalidate() End If End Sub Private Sub PaintDoc_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint e.Graphics.Clear(Color.Transparent) For i As Integer = 0 To backBuffer.Length - 1 e.Graphics.DrawImage(backBuffer(i), Point.Empty) Next End Sub Private Sub PaintDoc_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize For i As Integer = 0 To backBuffer.Length - 1 Dim newBuffer As Bitmap = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb) If backBuffer(i) IsNot Nothing Then Using gr As Graphics = Graphics.FromImage(newBuffer) gr.DrawImage(backBuffer(i), Point.Empty) End Using backBuffer(i) = Nothing End If backBuffer(i) = newBuffer Next End Sub End Class从BufferedGraphics获得的缓冲区没用,它的像素格式错误.您想要创建自己的缓冲区,可以支持透明度.这需要32bpp格式.使其格式化32bppPArgb以使其尽可能快.重写此代码时需要一些额外的支持来调整表单大小并消除所有闪烁:
Public Class Form1 Private backBuffer As Bitmap Public Sub New() InitializeComponent() Me.DoubleBuffered = True Me.ResizeRedraw = True End Sub Protected Overrides Sub OnResize(ByVal e As System.EventArgs) MyBase.OnResize(e) Dim newBuffer = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb) If backBuffer IsNot Nothing Then Using gr As Graphics = Graphics.FromImage(newBuffer) gr.DrawImage(backBuffer, Point.Empty) End Using backBuffer.Dispose() End If backBuffer = newBuffer End Sub Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs) MyBase.OnMouseMove(e) If e.Button = Windows.Forms.MouseButtons.Left Then Using gr As Graphics = Graphics.FromImage(backBuffer) gr.FillEllipse(New SolidBrush(Color.Blue), CInt(e.X - (100 / 2)), CInt(e.Y - (100 / 2)), 100, 100) End Using Me.Invalidate() End If End Sub Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) e.Graphics.DrawImage(backBuffer, Point.Empty) MyBase.OnPaint(e) End Sub End Class