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;
}
}
}
}