1

我曾经使用 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
4

1 回答 1

0

在解决方案资源管理器中,右键单击项目 --> 添加 --> 现有项目 --> 选择图像。在解决方案资源管理器中选择新添加的图像条目。在属性窗格下方,将“构建操作”更改为“嵌入式资源”。现在图像将嵌入到应用程序中,您可以像这样绘制它:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim bmp As New Bitmap(Me.GetType, "Smiley1.jpg") ' <-- Exactly as it appears in Solution Explorer (it IS cAsE-sEnSiTiVe!)
        Using G As Graphics = Me.CreateGraphics
            G.DrawImage(bmp, New Point(25, 25))
        End Using
    End Sub

End Class
于 2013-05-05T02:31:49.743 回答