加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

VB.Net BufferedGraphics透明背景

发布时间:2020-12-17 07:18:37 所属栏目:百科 来源:网络整理
导读:我正在使用BufferedGraphics绘制一些东西,然后我将它绘制到用户控件上.这是代码: Private context As BufferedGraphicsContextPrivate grafx As BufferedGraphics Private Sub PaintDoc_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles
我正在使用BufferedGraphics绘制一些东西,然后我将它绘制到用户控件上.这是代码:

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,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)),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,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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读