124 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.Runtime.InteropServices;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    public class BufferedBitmap : IDisposable
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private Rectangle m_TargetRect = Rectangle.Empty;
 | 
						|
        private IntPtr m_MemDC = IntPtr.Zero;
 | 
						|
        private Graphics m_BitmapGraphics = null;
 | 
						|
        private IntPtr m_MemDib = IntPtr.Zero;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        public BufferedBitmap(Graphics source, Rectangle rect)
 | 
						|
        {
 | 
						|
            IntPtr hdc = source.GetHdc();
 | 
						|
            try
 | 
						|
            {
 | 
						|
                Initialize(hdc, rect);
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                source.ReleaseHdc(hdc);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public Graphics Graphics
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_BitmapGraphics;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public BufferedBitmap(IntPtr hdcSource, Rectangle rect)
 | 
						|
        {
 | 
						|
            Initialize(hdcSource, rect);
 | 
						|
        }
 | 
						|
        private void Initialize(IntPtr hdcSource, Rectangle r)
 | 
						|
        {
 | 
						|
            m_TargetRect = r;
 | 
						|
 | 
						|
            m_MemDC = WinApi.CreateCompatibleDC(hdcSource);
 | 
						|
            WinApi.BITMAPINFO info = new WinApi.BITMAPINFO();
 | 
						|
            info.biWidth = r.Width;
 | 
						|
            info.biHeight = r.Height;
 | 
						|
            info.biPlanes = 1;
 | 
						|
            info.biBitCount = 32;
 | 
						|
            info.biSize = Marshal.SizeOf(info);
 | 
						|
            m_MemDib = WinApi.CreateDIBSection(hdcSource, info, 0, 0, IntPtr.Zero, 0);
 | 
						|
            WinApi.SelectObject(m_MemDC, m_MemDib);
 | 
						|
            m_BitmapGraphics = Graphics.FromHdc(m_MemDC);
 | 
						|
        }
 | 
						|
 | 
						|
        public void Render(Graphics targetGraphics)
 | 
						|
        {
 | 
						|
            Render(targetGraphics, new Rectangle[] { });
 | 
						|
        }
 | 
						|
 | 
						|
        public void Render(Graphics targetGraphics, Rectangle exclude)
 | 
						|
        {
 | 
						|
            Render(targetGraphics, new Rectangle[] { exclude });
 | 
						|
        }
 | 
						|
 | 
						|
        public void Render(Graphics targetGraphics, Rectangle[] excludeArr)
 | 
						|
        {
 | 
						|
            const int SRCCOPY = 0x00CC0020;
 | 
						|
            IntPtr hdc = targetGraphics.GetHdc();
 | 
						|
            try
 | 
						|
            {
 | 
						|
                if (excludeArr!=null && excludeArr.Length > 0)
 | 
						|
                {
 | 
						|
                    foreach (Rectangle r in excludeArr)
 | 
						|
                    {
 | 
						|
                        if (!r.IsEmpty)
 | 
						|
                            WinApi.ExcludeClipRect(hdc, r.X, r.Y, r.Right, r.Bottom);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                WinApi.BitBlt(hdc, m_TargetRect.Left, m_TargetRect.Top, m_TargetRect.Width, m_TargetRect.Height, m_MemDC, 0, 0, SRCCOPY);
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                targetGraphics.ReleaseHdc(hdc);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public Rectangle TargetRect
 | 
						|
        {
 | 
						|
            get { return m_TargetRect; }
 | 
						|
            set { m_TargetRect = value; }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IDisposable Members
 | 
						|
 | 
						|
        public void Dispose()
 | 
						|
        {
 | 
						|
            if (m_BitmapGraphics != null)
 | 
						|
            {
 | 
						|
                m_BitmapGraphics.Dispose();
 | 
						|
                m_BitmapGraphics = null;
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_MemDib != IntPtr.Zero)
 | 
						|
            {
 | 
						|
                WinApi.DeleteObject(m_MemDib);
 | 
						|
                m_MemDib = IntPtr.Zero;
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_MemDC != IntPtr.Zero)
 | 
						|
            {
 | 
						|
                WinApi.DeleteDC(m_MemDC);
 | 
						|
                m_MemDC = IntPtr.Zero;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |