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