1

以前は VB 6.0 を使用していましたが、現在は .net に切り替えており、多くのことが変わっていることがわかりました。昔は、グラフィック アセットをピクチャ ボックスに保存して非表示にし、必要に応じてフォーム / スクリーン / キャンバスに bitblt していました。これはきちんとした方法でしたが、VB.NET で同じことをしようとしていますが、うまくいきません。

ピクチャ ボックスが画面上に表示されている場合、すべてが完全に機能しますが、ピクチャ ボックスを非表示にしたり画面外に移動したりすると、bitblt が描画するグラフィックが台無しになります。外部に保存されているビットマップを正常にロードできますが、知りたかったのは、bitblt で使用するために VB.NET アプリケーション内にグラフィック (ビットマップ) アセットを保存する最良の方法は何ですか?

参考までに、コード スニペットを次に示します。

#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 に答える