Imports System.Runtime.InteropServices PublicFunction GetControlBitmap()Function GetControlBitmap(ByVal c As Control, ByVal targetBounds As Rectangle) As Drawing.Bitmap If (((targetBounds.Width <=0) OrElse (targetBounds.Height <=0)) OrElse ((targetBounds.X <0) OrElse (targetBounds.Y <0))) Then ThrowNew ArgumentException("目标大小错误") EndIf Dim width AsInteger= Math.Min(c.Width, targetBounds.Width) Dim height AsInteger= Math.Min(c.Height, targetBounds.Height) Dim image AsNew Bitmap(width, height) Dim bmp AsNew Bitmap(width, height) Using graphics As Graphics = Drawing.Graphics.FromImage(image) Dim hdc As IntPtr = graphics.GetHdc SendMessage(New HandleRef(c, c.Handle), &H317, hdc, 30) Using graphics2 As Graphics = Drawing.Graphics.FromImage(bmp) Dim handle As IntPtr = graphics2.GetHdc BitBlt(New HandleRef(graphics2, handle), targetBounds.X, targetBounds.Y, width, height, New HandleRef(graphics, hdc), 0, 0, &HCC0020) graphics2.ReleaseHdcInternal(handle) EndUsing graphics.ReleaseHdcInternal(hdc) EndUsing Return bmp End Function <DllImport("user32.dll", CharSet:=CharSet.Auto)> _ PublicSharedFunction SendMessage()Function SendMessage(ByVal hWnd As HandleRef, ByVal msg AsInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function <DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)> _ PublicSharedFunction BitBlt()Function BitBlt(ByVal hDC As HandleRef, ByVal x AsInteger, ByVal y AsInteger, ByVal nWidth AsInteger, ByVal nHeight AsInteger, ByVal hSrcDC As HandleRef, ByVal xSrc AsInteger, ByVal ySrc AsInteger, ByVal dwRop AsInteger) AsBoolean End Function
C# 2005
using System.Runtime.InteropServices; public Bitmap GetControlBitmap(Control c, Rectangle targetBounds) ...{ if ((targetBounds.Width <=0) || (targetBounds.Height <=0) || (targetBounds.X <0) || (targetBounds.Y <0)) ...{ thrownew ArgumentException("目标大小错误"); } int width = Math.Min(c.Width, targetBounds.Width); int height = Math.Min(c.Height, targetBounds.Height); Bitmap image =new Bitmap(width, height); Bitmap bmp =new Bitmap(width, height); using (Graphics graphics = Graphics.FromImage(image)) ...{ IntPtr hdc = graphics.GetHdc(); SendMessage( new HandleRef(c, c.Handle), 0x317, hdc, (IntPtr) 30); using (Graphics graphics2 = Graphics.FromImage(bmp)) ...{ IntPtr handle = graphics2.GetHdc(); BitBlt(new HandleRef(graphics2, handle), targetBounds.X, targetBounds.Y, width, height, new HandleRef(graphics, hdc), 0, 0, 0xcc0020); graphics2.ReleaseHdcInternal(handle); } graphics.ReleaseHdcInternal(hdc); } return bmp; } [DllImport("user32.dll", CharSet = CharSet.Auto)] publicstaticextern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam); [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError =true, ExactSpelling =true)] publicstaticexternbool BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);