编辑:固定,我为图形对象创建了一个 compatibleDC,为位图创建了一个句柄(使用 b.gethbitmap),然后使用 GDI 中的 SelectObject 函数来选择这两个,并在 BitBlt 函数中使用 compatibleDC 而不是 hDc
我一直在尝试在屏幕上绘制位图(设备 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,给定循环内的位置和颜色,循环遍历框内的所有像素(在我的代码中为 50x50)。然后 setpx 函数将调用位图 b 上的 setpixel 函数。这部分工作正常。
接下来,它将从位图中定义一个图形对象 g,我使用 BitBlt 将 g 的 hdc (g.gethdc) 复制到屏幕上。这不能正常工作,这是正确的方法吗?