using System; using System.Drawing; using System.Windows.Forms; namespace DevComponents.DotNetBar { /// /// Serves as integration of regular Image class and Icon class /// 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; } } } }