263 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Serves as integration of regular Image class and Icon class
 | 
						|
    /// </summary>
 | 
						|
    internal class CompositeImage : IDisposable
 | 
						|
    {
 | 
						|
        private bool m_DisposeImage = false;
 | 
						|
 | 
						|
        private Image m_Image = null;
 | 
						|
        private Icon m_Icon = null;
 | 
						|
        private Size m_ImageSizeOverride = Size.Empty;
 | 
						|
        private ImageList m_ImageList = null;
 | 
						|
        private int m_ImageIndex = -1;
 | 
						|
 | 
						|
        public CompositeImage(int imageIndex, ImageList imageList)
 | 
						|
        {
 | 
						|
            m_ImageIndex = imageIndex;
 | 
						|
            m_ImageList = imageList;
 | 
						|
        }
 | 
						|
 | 
						|
        public CompositeImage(Image image, bool dispose)
 | 
						|
        {
 | 
						|
            m_Image = image;
 | 
						|
            m_DisposeImage = dispose;
 | 
						|
        }
 | 
						|
        public CompositeImage(Icon icon, bool dispose)
 | 
						|
        {
 | 
						|
            m_Icon = icon;
 | 
						|
            m_DisposeImage = dispose;
 | 
						|
        }
 | 
						|
        public CompositeImage(Image image, bool dispose, Size overrideSize)
 | 
						|
        {
 | 
						|
            m_Image = image;
 | 
						|
            m_DisposeImage = dispose;
 | 
						|
            m_ImageSizeOverride = overrideSize;
 | 
						|
        }
 | 
						|
        public CompositeImage(Icon icon, bool dispose, Size overrideSize)
 | 
						|
        {
 | 
						|
            m_Icon = icon;
 | 
						|
            m_DisposeImage = dispose;
 | 
						|
            m_ImageSizeOverride = overrideSize;
 | 
						|
        }
 | 
						|
        ~CompositeImage()  // destructor
 | 
						|
        {
 | 
						|
            if (m_DisposeImage && (m_Image != null || m_Icon != null))
 | 
						|
            {
 | 
						|
                Dispose();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void Dispose()
 | 
						|
        {
 | 
						|
            if (m_DisposeImage)
 | 
						|
            {
 | 
						|
                if (m_Image != null)
 | 
						|
                    m_Image.Dispose();
 | 
						|
                if (m_Icon != null)
 | 
						|
                    m_Icon.Dispose();
 | 
						|
            }
 | 
						|
 | 
						|
            m_Image = null;
 | 
						|
            m_Icon = null;
 | 
						|
        }
 | 
						|
 | 
						|
        public void DrawImage(Graphics g, Rectangle rect)
 | 
						|
        {
 | 
						|
            if (m_Image != null)
 | 
						|
                g.DrawImage(m_Image, rect);
 | 
						|
            else if (m_Icon != null)
 | 
						|
                DrawIcon(g, rect);
 | 
						|
            else if (m_ImageIndex >= 0 && m_ImageList != null && m_ImageIndex < m_ImageList.Images.Count)
 | 
						|
                m_ImageList.Draw(g, rect.X, rect.Y, rect.Width, rect.Height, m_ImageIndex);
 | 
						|
        }
 | 
						|
 | 
						|
        private void DrawIcon(Graphics g, Rectangle rect)
 | 
						|
        {
 | 
						|
            if (System.Environment.Version.Build <= 3705 && System.Environment.Version.Revision == 288 && System.Environment.Version.Major == 1 && System.Environment.Version.Minor == 0)
 | 
						|
            {
 | 
						|
                if (g.ClipBounds.IntersectsWith(rect) && rect.Width > 0 && rect.Height > 0 && m_Icon.Handle != IntPtr.Zero)
 | 
						|
                {
 | 
						|
                    IntPtr hdc = g.GetHdc();
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        NativeFunctions.DrawIconEx(hdc, rect.X, rect.Y, m_Icon.Handle, rect.Width, rect.Height, 0, IntPtr.Zero, 3);
 | 
						|
                    }
 | 
						|
                    finally
 | 
						|
                    {
 | 
						|
                        g.ReleaseHdc(hdc);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (rect.Width > 0 && rect.Height > 0 && m_Icon.Handle != IntPtr.Zero)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    g.DrawIcon(m_Icon, rect);
 | 
						|
                }
 | 
						|
                catch { }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void DrawImage(Graphics g, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, System.Drawing.Imaging.ImageAttributes imageAttrs)
 | 
						|
        {
 | 
						|
            if (m_Image != null)
 | 
						|
            {
 | 
						|
                g.DrawImage(m_Image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, imageAttrs);
 | 
						|
            }
 | 
						|
            else if (m_Icon != null)
 | 
						|
            {
 | 
						|
                // Attempt to solve issues with icon drawing...
 | 
						|
                //DrawIcon(g,destRect);
 | 
						|
                Bitmap bmp = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
 | 
						|
                bmp.MakeTransparent();
 | 
						|
                Graphics gBmp = Graphics.FromImage(bmp);
 | 
						|
                gBmp.DrawIcon(m_Icon, 0, 0);
 | 
						|
                gBmp.Dispose();
 | 
						|
                g.DrawImage(bmp, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, imageAttrs);
 | 
						|
                bmp.Dispose();
 | 
						|
            }
 | 
						|
            else if (m_ImageIndex >= 0 && m_ImageList != null && m_ImageIndex < m_ImageList.Images.Count)
 | 
						|
                m_ImageList.Draw(g, srcX, srcY, srcWidth, srcHeight, m_ImageIndex);
 | 
						|
        }
 | 
						|
 | 
						|
        public bool IsIcon
 | 
						|
        {
 | 
						|
            get { return (m_Icon != null); }
 | 
						|
        }
 | 
						|
 | 
						|
        public int Width
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (!m_ImageSizeOverride.IsEmpty)
 | 
						|
                    return GetSize(m_ImageSizeOverride.Width);
 | 
						|
                if (m_Image != null)
 | 
						|
                    return GetSize(m_Image.Width);
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return GetSize(m_Icon.Width);
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return GetSize(m_ImageList.ImageSize.Width);
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public int Height
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (!m_ImageSizeOverride.IsEmpty)
 | 
						|
                    return GetSize(m_ImageSizeOverride.Height);
 | 
						|
                if (m_Image != null)
 | 
						|
                    return GetSize(m_Image.Height);
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return GetSize(m_Icon.Height);
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return GetSize(m_ImageList.ImageSize.Height);
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int GetSize(int height)
 | 
						|
        {
 | 
						|
            return (Dpi.AutoScaleImages ? Dpi.Height(height) : height);
 | 
						|
        }
 | 
						|
        private Size GetSize(Size size)
 | 
						|
        {
 | 
						|
            return (Dpi.AutoScaleImages ? Dpi.Size(size) : size);
 | 
						|
        }
 | 
						|
 | 
						|
        public System.Drawing.Size Size
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (!m_ImageSizeOverride.IsEmpty)
 | 
						|
                    return GetSize(m_ImageSizeOverride);
 | 
						|
                if (m_Image != null)
 | 
						|
                    return GetSize(m_Image.Size);
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return GetSize(m_Icon.Size);
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return GetSize(m_ImageList.ImageSize);
 | 
						|
                return System.Drawing.Size.Empty;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public System.Drawing.Image Image
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return m_ImageList.Images[m_ImageIndex];
 | 
						|
                return m_Image;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public System.Drawing.Icon Icon
 | 
						|
        {
 | 
						|
            get { return m_Icon; }
 | 
						|
        }
 | 
						|
 | 
						|
        internal int RealHeight
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (m_Image != null)
 | 
						|
                    return GetSize(m_Image.Height);
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return GetSize(m_Icon.Height);
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return GetSize(m_ImageList.ImageSize.Height);
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal int RealWidth
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (m_Image != null)
 | 
						|
                    return GetSize(m_Image.Width);
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return GetSize(m_Icon.Width);
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return GetSize(m_ImageList.ImageSize.Width);
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal int ActualHeight
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (m_Image != null)
 | 
						|
                    return m_Image.Height;
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return m_Icon.Height;
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return m_ImageList.ImageSize.Height;
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal int ActualWidth
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (m_Image != null)
 | 
						|
                    return (m_Image.Width);
 | 
						|
                if (m_Icon != null)
 | 
						|
                    return (m_Icon.Width);
 | 
						|
                if (m_ImageIndex >= 0 && m_ImageList != null)
 | 
						|
                    return (m_ImageList.ImageSize.Width);
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |