using System; using System.Drawing; using System.Reflection; namespace Microsoft.Drawing { /// /// BufferedGraphicsEx辅助类 /// public static class BufferedGraphicsEx { private static readonly FieldInfo FiTargetLoc; //BufferedGraphics.targetLoc字段信息 private static readonly FieldInfo FiVirtulSize; //BufferedGraphics.virtualSize字段信息 /// /// 静态构造 /// static BufferedGraphicsEx() { Type type = typeof(BufferedGraphics); BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; FiTargetLoc = type.GetField("targetLoc", flags); FiVirtulSize = type.GetField("virtualSize", flags); } /// /// 获取缓冲区的目标坐标。 /// /// 缓冲区。 /// 缓冲区的目标坐标 public static Point GetTargetLoc(BufferedGraphics bg) { if (bg == null) throw new ArgumentNullException("bg"); return (Point)FiTargetLoc.GetValue(bg); } /// /// 获取缓冲区的虚拟尺寸大小。 /// /// 缓冲区。 /// 缓冲区的虚拟尺寸大小。 public static Size GetVirtualSize(BufferedGraphics bg) { if (bg == null) throw new ArgumentNullException("bg"); return (Size)FiVirtulSize.GetValue(bg); } /// /// 将图形缓冲区的内容写入指定的 System.Drawing.Graphics 对象。 /// /// 图形缓冲区,要混合的源。 /// 一个 System.Drawing.Graphics 对象,要向其中写入图形缓冲区的内容。 /// 目标矩形。 public static void Render(BufferedGraphics bgSrc, Graphics gDest, Rectangle rcDest) { //验证 if (bgSrc == null || gDest == null || !RectangleEx.IsVisible(rcDest)) return; //反射获取私有字段 Point targetLoc = (Point)FiTargetLoc.GetValue(bgSrc); targetLoc.Offset(rcDest.X, rcDest.Y); Size virtualSize = rcDest.Size; Point sourceLoc = rcDest.Location; //混合渲染 GraphicsEx.Render(bgSrc.Graphics, gDest, targetLoc, sourceLoc, virtualSize); } /// /// 将图形缓冲区的内容与指定的 System.Drawing.Graphics 对象混合。(支持缓冲区Alpha通道) /// /// /// 一个 System.Drawing.Graphics 对象,图形缓冲区要混合的目标。 public static void BlendRender(BufferedGraphics bgSrc, Graphics gDest) { //验证 if (bgSrc == null || gDest == null) return; //反射获取私有字段 Point targetLoc = (Point)FiTargetLoc.GetValue(bgSrc); Size virtualSize = (Size)FiVirtulSize.GetValue(bgSrc); //混合渲染 GraphicsEx.BlendRender(bgSrc.Graphics, gDest, targetLoc, Point.Empty, virtualSize); } /// /// 将图形缓冲区的内容与指定的 System.Drawing.Graphics 对象混合。(支持缓冲区Alpha通道) /// /// 图形缓冲区,要混合的源。 /// 一个 System.Drawing.Graphics 对象,图形缓冲区要混合的目标。 /// 目标矩形。 public static void BlendRender(BufferedGraphics bgSrc, Graphics gDest, Rectangle rcDest) { //验证 if (bgSrc == null || gDest == null || !RectangleEx.IsVisible(rcDest)) return; //反射获取私有字段 Point targetLoc = (Point)FiTargetLoc.GetValue(bgSrc); targetLoc.Offset(rcDest.X, rcDest.Y); Size virtualSize = rcDest.Size; Point sourceLoc = rcDest.Location; //混合渲染 GraphicsEx.BlendRender(bgSrc.Graphics, gDest, targetLoc, sourceLoc, virtualSize); } } }