VB.NET BitBlt копировать растровое изображение на экран

Редактировать: Исправлено, я создал совместимый DC для графического объекта и дескриптор для растрового изображения (используя b.gethbitmap), затем использовал функцию SelectObject внутри GDI, чтобы выбрать эти два, и использовал совместимый DC вместо hDc в функции BitBlt

Я пытался нарисовать растровое изображение на экране (устройство 0), однако я столкнулся с проблемой при копировании графики с использованием BitBlt.

Первоначально я рисовал прямо на рабочем столе, используя SetPixel (gdi32), но это было медленно, поэтому теперь я устанавливаю пиксели растрового объекта, а затем создаю графику из этого объекта и копирую hdc графики на экран.

Я предполагаю, что я добавляю HDC графического объекта в intptr, который, по сути, дает мне HDC контейнера графического объекта, а это не то, что мне нужно. Однако, несмотря на это, я не нашел никакой информации о том, как я мог бы скопировать растровое изображение на устройство, кроме использования BitBlt.

Это мой текущий код (приложение Windows Forms, текстовое поле, кнопка). Текстовое поле - это устройство для копирования, и кнопка запускает его. В целях тестирования установите для текстового поля значение 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

Он работает так, как если бы он вызывал функцию setpx, учитывая местоположение и цвет из цикла, повторяющего все пиксели в блоке (50x50 в моем коде). Затем функция setpx вызовет функцию setpixel для растрового изображения b. Эта часть работает нормально.

Затем он будет определять графический объект g из растрового изображения, и я использую BitBlt для копирования hdc (g.gethdc) g на экран. Это не работает правильно, это правильный способ сделать это?

1 ответ

Вы передаете Textbox1.text как дескриптор устройства, который не будет работать... Вы хотите textbox1.hwnd

Другие вопросы по тегам