VB 2005
Imports System.Runtime.InteropServices

Public Function 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
Throw New ArgumentException("目标大小错误")
End If
Dim width As Integer = Math.Min(c.Width, targetBounds.Width)
Dim height As Integer = Math.Min(c.Height, targetBounds.Height)
Dim image As New Bitmap(width, height)
Dim bmp As New 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)
End Using
graphics.ReleaseHdcInternal(hdc)
End Using
Return bmp
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function SendMessage()Function SendMessage(ByVal hWnd As HandleRef, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function
<DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)> _
Public Shared Function BitBlt()Function BitBlt(ByVal hDC As HandleRef, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As HandleRef, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal dwRop As Integer) As Boolean
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))
...{
throw new 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)]
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam);


[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern bool BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);


本文详细介绍了在Visual Studio 2005(VS2005)环境下,如何在VB和C#中获取并操作控件的图像资源。通过实例代码,展示了如何利用integer和function来实现这一功能,对于用户界面开发具有参考价值。
1290

被折叠的 条评论
为什么被折叠?



