編集: 修正しました。グラフィックス オブジェクト用に compatibleDC を作成し、(b.gethbitmap を使用して) ビットマップ用のハンドルを作成し、GDI 内で SelectObject 関数を使用してこれら 2 つを選択し、BitBlt 関数で hDc の代わりに compatibleDC を使用しました。
画面 (デバイス 0) にビットマップを描画しようとしましたが、BitBlt を使用してグラフィックをコピーする際に問題が発生しました。
最初は、SetPixel (gdi32) を使用して直接デスクトップに描画していましたが、遅いので、現在はビットマップ オブジェクトのピクセルを設定し、そのオブジェクトからグラフィックを作成し、グラフィックの hdc を画面にコピーしています。
私の推測では、グラフィック オブジェクトの HDC を intptr に追加していると思います。これにより、基本的にグラフィック オブジェクトのコンテナーの HDC が得られますが、これは必要なものではありません。ただし、それでも、 BitBlt を使用する以外にビットマップをデバイスにコピーする方法に関する情報は見つかりませんでした。
これは私の現在のコードです (Windows フォーム アプリ、テキスト ボックス、ボタン) テキスト ボックスはコピー先のデバイスであり、ボタンはそれを開始します。テスト目的で、テキスト ボックスのテキストを 0 に設定し、ボタンを押します。画面の左上隅に黒いボックス (50x50px) が表示されます。正しく機能している場合、色は青になります。
Public Class Form1
Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Int32) As Int32
Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Int32, ByVal hdc As Int32) As Int32
Declare Function SetPixel Lib "gdi32.dll" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal crColor As Integer) As Integer
Declare Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Int32) As Boolean
Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal nWidth As Integer, ByVal nHeight As Integer) As IntPtr
Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As IntPtr) As IntPtr
Dim x As Integer
Sub setpx(ByVal location As Point, ByVal color As Color)
b.SetPixel(location.X, location.Y, color)
End Sub
Sub drawrectangle(ByVal device As Integer, ByVal location As Point, ByVal size As Point, ByVal color As Color)
b = New Bitmap(size.X, size.Y)
For i = location.X To size.X - 1
For z = location.Y To size.Y - 1
setpx(New Point(i, z), color)
Next
Next
g = Graphics.FromImage(b)
Dim hDc As IntPtr = g.GetHdc
BitBlt(GetDC(device), location.X, location.Y, size.X, size.Y, hDc, location.X, location.Y, 13369376)
ReleaseDC(device, GetDC(device))
End Sub
Dim b As Bitmap
Dim g As Graphics
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttnon1.Click
Dim r As New Random
Dim timestart As Integer = Now.TimeOfDay.TotalMilliseconds
drawrectangle(TextBox1.Text, New Point(1, 1), New Point(50, 50), Color.Blue)
MsgBox(Now.TimeOfDay.TotalMilliseconds - timestart)
End Sub
End Class
それが機能する方法は、ボックス内のすべてのピクセル (私のコードでは 50x50) を反復するループ内から位置と色を指定して、関数 setpx を呼び出すことです。次に、setpx 関数は、ビットマップで setpixel 関数を呼び出します。この部分は正常に動作しています。
次に、ビットマップからグラフィック オブジェクト g を定義し、BitBlt を使用して g の hdc (g.gethdc) を画面にコピーします。これは正しく機能していません。これは正しい方法ですか?