我曾经使用 VB 6.0,现在我正在切换到 .net,我发现很多事情都发生了变化。过去,我曾经将图形资源存储在图片框中,使它们不可见,然后在需要时将它们 bitblt 到表单/屏幕/画布上。这是一种很好、整洁的方法,但现在我试图在 VB.NET 中做同样的事情,但它不会工作。
如果图片框在屏幕上并且可见,则一切正常,但是使图片框不可见或将其移出屏幕会破坏 bitblt 绘制的图形。我可以成功加载存储在外部的位图,但我想知道的是,在 VB.NET 应用程序中存储图形(位图)资产以供 bitblt 使用的最佳方式是什么?
作为参考,这是一个代码片段:
#Region " Members "
Public mouseX As Integer
Public mouseY As Integer
Public srcGraphics As Graphics
Public TargetGraphics As Graphics
Public srcHdc As IntPtr
Public targetHdc As IntPtr
Public srcSize As Size
Private blnShowWheel As Boolean
#End Region
#Region " Internals "
Const SRCCOPY As Integer = &HCC0020
' Wraping things up
Private Sub MyBitBlt(ByVal SourceGraphics As Graphics, ByVal TargetHDC As IntPtr, ByVal width As Integer, ByVal Height As Integer)
    ' Creating a DeviceContext to capture from
    Dim SourceHDC As IntPtr = SourceGraphics.GetHdc
    ' Blitting (Copying) the data
    BitBlt(TargetHDC, 0, 0, width, Height, SourceHDC, 0, 0, SRCCOPY)
    ' Releasing the Device context used
    SourceGraphics.ReleaseHdc(SourceHDC)
End Sub
Private Sub MyBitBlt(ByVal SourceHDC As IntPtr, ByVal TargetHDC As IntPtr, ByVal width As Integer, ByVal Height As Integer, ByVal PosX As Integer, ByVal PosY As Integer)
    ' Copying data to a specific position on the target Device Context
    BitBlt(TargetHDC, PosX, PosY, width, Height, SourceHDC, 0, 0, SRCCOPY)
End Sub
' Cleanning Up
' Before Destroying this class, dispose of objects to reclaim memory
Protected Overrides Sub Finalize()
    DisposeObjects()
    MyBase.Finalize()
End Sub
' Disposing of objects
Private Sub DisposeObjects()
    TargetGraphics.Dispose()
    srcGraphics.Dispose()
End Sub
#End Region
Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click
    Finalize()
    End
End Sub
Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Finalize()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.Width = 800
    Me.Height = 600
    Me.Left = (Screen.PrimaryScreen.Bounds.Width - Me.Width) / 2
    Me.Top = (Screen.PrimaryScreen.Bounds.Height - Me.Height) / 2
    srcSize = picColourWheel.Size
End Sub
Private Sub frmMain_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    srcGraphics = picColourWheel.CreateGraphics
    TargetGraphics = Me.CreateGraphics
    srcHdc = srcGraphics.GetHdc
    targetHdc = TargetGraphics.GetHdc
    If Not blnShowWheel = True Then
        blnShowWheel = True
    Else
        blnShowWheel = False
    End If
    If blnShowWheel = True Then
        MyBitBlt(srcHdc, targetHdc, srcSize.Width, srcSize.Height, mouseX - (srcSize.Width / 2), mouseY - (srcSize.Height / 2))
    Else
        Me.Refresh()
    End If
    srcGraphics.ReleaseHdc(srcHdc)
    TargetGraphics.ReleaseHdc(targetHdc)
End Sub
Private Sub frmMain_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    mouseX = e.X
    mouseY = e.Y
End Sub