using System; using System.Drawing; using Microsoft.Win32; namespace Microsoft.Drawing { /// /// Graphics辅助类 /// public static class GraphicsEx { /// /// 复制设备内容(不支持Alpha通道) /// /// 原设备 /// 目标设备 /// 源起始坐标 /// 目标起始坐标 /// 复制大小 public static void Render(Graphics gSrc, Graphics gDest, Point ptDest, Point ptSrc, Size szBlock) { if (gSrc == null || gDest == null) return; IntPtr hdcDest = gDest.GetHdc(); IntPtr hdcSrc = gSrc.GetHdc(); try { UnsafeNativeMethods.BitBlt(hdcDest, ptDest.X, ptDest.Y, szBlock.Width, szBlock.Height, hdcSrc, ptSrc.X, ptSrc.Y, NativeMethods.SRCCOPY); } finally { gSrc.ReleaseHdcInternal(hdcSrc); gDest.ReleaseHdcInternal(hdcDest); } } /// /// 混合设备内容(支持Alpha通道) /// /// 原设备 /// 目标设备 /// 源起始坐标 /// 目标起始坐标 /// 复制大小 public static void BlendRender(Graphics gSrc, Graphics gDest, Point ptDest, Point ptSrc, Size szBlock) { if (gSrc == null || gDest == null) return; IntPtr hdcDest = gDest.GetHdc(); IntPtr hdcSrc = gSrc.GetHdc(); try { UnsafeNativeMethods.GdiAlphaBlend(hdcDest, ptDest.X, ptDest.Y, szBlock.Width, szBlock.Height, hdcSrc, ptSrc.X, ptSrc.Y, szBlock.Width, szBlock.Height, NativeMethods.BLENDFUNCTION.Default); } finally { gSrc.ReleaseHdcInternal(hdcSrc); gDest.ReleaseHdcInternal(hdcDest); } } /// /// 混合设备内容(支持Alpha通道) /// /// 原设备 /// 目标设备 /// 源起始坐标 /// 目标起始坐标 /// 复制大小 /// 透明度[0-255] public static void BlendRender(Graphics gSrc, Graphics gDest, Point ptDest, Point ptSrc, Size szBlock, byte alpha) { if (gSrc == null || gDest == null) return; IntPtr hdcDest = gDest.GetHdc(); IntPtr hdcSrc = gSrc.GetHdc(); try { UnsafeNativeMethods.GdiAlphaBlend(hdcDest, ptDest.X, ptDest.Y, szBlock.Width, szBlock.Height, hdcSrc, ptSrc.X, ptSrc.Y, szBlock.Width, szBlock.Height, new NativeMethods.BLENDFUNCTION(NativeMethods.AC_SRC_OVER, 0, alpha, NativeMethods.AC_SRC_ALPHA)); } finally { gSrc.ReleaseHdcInternal(hdcSrc); gDest.ReleaseHdcInternal(hdcDest); } } } }