77 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Drawing;
 | 
						|
using System.Runtime.InteropServices;
 | 
						|
using System.Text;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Controls
 | 
						|
{
 | 
						|
    internal struct IconInfo
 | 
						|
    {
 | 
						|
        public bool fIcon;
 | 
						|
        public int xHotspot;
 | 
						|
        public int yHotspot;
 | 
						|
        public IntPtr hbmMask;
 | 
						|
        public IntPtr hbmColor;
 | 
						|
    }
 | 
						|
    internal class CursorHelper
 | 
						|
    {
 | 
						|
        [DllImport("user32.dll")]
 | 
						|
        public static extern IntPtr CreateIconIndirect(ref IconInfo icon);
 | 
						|
        [DllImport("user32.dll")]
 | 
						|
        [return: MarshalAs(UnmanagedType.Bool)]
 | 
						|
        public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
 | 
						|
        [DllImport("gdi32.dll")]
 | 
						|
        public static extern bool DeleteObject(IntPtr handle);
 | 
						|
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
 | 
						|
        extern static bool DestroyIcon(IntPtr handle);
 | 
						|
        public static Cursor CreateCursor(Bitmap bm, int xHotspot, int yHotspot, bool resize = true)
 | 
						|
        {
 | 
						|
            IntPtr ptr = (resize) ? ((Bitmap)ResizeBitmap(bm, 32, 32)).GetHicon() : bm.GetHicon();
 | 
						|
            IconInfo inf = new IconInfo();
 | 
						|
            GetIconInfo(ptr, ref inf);
 | 
						|
            inf.xHotspot = xHotspot;
 | 
						|
            inf.yHotspot = yHotspot;
 | 
						|
            inf.fIcon = false;
 | 
						|
            IntPtr cursorPtr = CreateIconIndirect(ref inf);
 | 
						|
            if (inf.hbmColor != IntPtr.Zero) { DeleteObject(inf.hbmColor); }
 | 
						|
            if (inf.hbmMask != IntPtr.Zero) { DeleteObject(inf.hbmMask); }
 | 
						|
            if (ptr != IntPtr.Zero) { DestroyIcon(ptr); }
 | 
						|
            Cursor c = new Cursor(cursorPtr);
 | 
						|
            c.Tag = (resize) ? new Size(32, 32) : bm.Size;
 | 
						|
            return c;
 | 
						|
        }
 | 
						|
        public static Bitmap ResizeBitmap(Image image, int maxWidth, int maxHeight)
 | 
						|
        {
 | 
						|
            double ratio = System.Math.Min((double)maxHeight / image.Height, (double)maxWidth / image.Width);
 | 
						|
            var propWidth = (int)(image.Width * ratio);
 | 
						|
            var propHeight = (int)(image.Height * ratio);
 | 
						|
            var newImage = new Bitmap(propWidth, propHeight);
 | 
						|
            using (var g = Graphics.FromImage(newImage))
 | 
						|
            {
 | 
						|
                g.DrawImage(image, 0, 0, propWidth, propHeight);
 | 
						|
            }
 | 
						|
            return newImage;
 | 
						|
        }
 | 
						|
        public static Bitmap GetControlBitmap(Control c, Color transparent)
 | 
						|
        {
 | 
						|
            var bm = new Bitmap(c.Width, c.Height);
 | 
						|
            c.DrawToBitmap(bm, new Rectangle(0, 0, c.Width, c.Height));
 | 
						|
            if (!transparent.IsEmpty)
 | 
						|
            {
 | 
						|
                bm.MakeTransparent(transparent);
 | 
						|
            }
 | 
						|
            return bm;
 | 
						|
        }
 | 
						|
        public static Bitmap OverlayBitmap(Bitmap baseBitmap, Bitmap overlay, Point atPosition)
 | 
						|
        {
 | 
						|
            using (var g = Graphics.FromImage(baseBitmap))
 | 
						|
            {
 | 
						|
                g.DrawImage(overlay, new Rectangle(atPosition, overlay.Size));
 | 
						|
            }
 | 
						|
            return baseBitmap;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |