|
[WPF]自定义鼠标指针 周银辉
看看WPF Cursor类的两个构造函数吧: public Cursor(Stream cursorStream) public Cursor(string cursorFile) 恩, 均要求用 ani 或 cur, 无语啊,我要使用一张普通图片呢? 或者甚至是在程序内存中动态生成一张图片而生成鼠标指针呢? 于是乎, 我们可以折腾出如下代码, 它可以从由一张图片来创建鼠标指针: /// <summary> /// This class allow you create a Cursor form a Bitmap /// </summary> internal class BitmapCursor : SafeHandle { public override bool IsInvalid { get { return handle == (IntPtr)(-1); } } public static Cursor CreateBmpCursor(Bitmap cursorBitmap) { var c = new BitmapCursor(cursorBitmap); return CursorInteropHelper.Create(c); } protected BitmapCursor(Bitmap cursorBitmap) : base((IntPtr)(-1), true) { handle = cursorBitmap.GetHicon(); } protected override bool ReleaseHandle() { bool result = DestroyIcon(handle); handle = (IntPtr)(-1); return result; } [DllImport("user32")] private static extern bool DestroyIcon(IntPtr hIcon); }
下面是一段示例代码: private static Cursor CreateMyCursor() { const int w = 25; const int h = 25; const int f = 4; var bmp = new Bitmap(w, h); Graphics g = Graphics.FromImage(bmp); g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; var pen = new Pen(Brushes.Black, 2.0F); g.DrawEllipse(pen, new Rectangle(f, f, w - 2 * f, w - 2 * f)); g.Flush(); g.Dispose(); pen.Dispose(); return BitmapCursor.CreateBmpCursor(bmp); }
有人会说"啊!Bitmap? WinForm的! 就不可以从WPF的图像来生成么?" public static Bitmap BitmapSourceToBitmap(this BitmapSource source) { using (var stream = new MemoryStream()) { var e = new BmpBitmapEncoder(); e.Frames.Add(BitmapFrame.Create(source)); e.Save(stream); var bmp = new Bitmap(stream); return bmp; } }
(责任编辑:admin) |
