Visual Studio .NET 2002.NET 1.0Windows 2003Windows 2000Windows XP中级开发Visual StudioWindows.NETVisual Basic
使用 BitBlt 复制图形(.NET 风格)






4.50/5 (12投票s)
2003年12月30日

201570

2480
当 Graphics.Clone() 无法满足需求时。
引言
当基本的 GDI+ 函数无法满足需求时,你需要回到 API 学习阶段。BitBlt
简单地复制屏幕的某些部分。这是通过访问 Windows hDC
和其他低级、令人费解的东西来实现的。
首先,我们需要 Declare
在 GDI32.DLL 文件中的函数,以便在 VB.NET 中使用它们。
Declare Auto 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
然后,我创建了一个特殊函数,它将复制由 rectangleF
指定的屏幕区域。
Private Function copyRect(ByVal src As PictureBox, _
ByVal rect As RectangleF) As Bitmap
'Get a Graphics Object from the form
Dim srcPic As Graphics = src.CreateGraphics
'Create a EMPTY bitmap from that graphics
Dim srcBmp As New Bitmap(src.Width, src.Height, srcPic)
'Create a Graphics object in memory from that bitmap
Dim srcMem As Graphics = Graphics.FromImage(srcBmp)
'get the IntPtr's of the graphics
Dim HDC1 As IntPtr = srcPic.GetHdc
'get the IntPtr's of the graphics
Dim HDC2 As IntPtr = srcMem.GetHdc
'get the picture
BitBlt(HDC2, 0, 0, rect.Width, _
rect.Height, HDC1, rect.X, rect.Y, 13369376)
'Clone the bitmap so we can dispose this one
copyRect = srcBmp.Clone()
'Clean Up
srcPic.ReleaseHdc(HDC1)
srcMem.ReleaseHdc(HDC2)
srcPic.Dispose()
srcMem.Dispose()
srcMem.Dispose()
End Function
然后,我们只需要调用该函数来返回所需的图像
Dim bmp = CType(copyRect(src, _
New RectangleF(0, 0, 50, src.Height)), Bitmap)
dest.Image = bmp.CloneShorthand:
-或-
dest.Image = CType(copyRect(src, _ New RectangleF(0, 0, 50, src.Height)), Bitmap).Clone
这两个语句中的任何一个都会克隆 src
图像在 (0,0,50, src.height
) 处的部分,并返回一个 bitmap
对象。我只是简单地将 bitmap
对象克隆到一个 picturebox
中,以便你可以看到结果。