VB.NET BitBlt копировать растровое изображение на экран - PullRequest
1 голос
/ 07 марта 2012

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

Я пытался нарисовать растровое изображение на экране (устройство 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

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

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

1 Ответ

0 голосов
/ 07 марта 2012

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

...