原文:[WPF]自定义鼠标指针

[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)(-);            }        }        public static Cursor CreateBmpCursor(Bitmap cursorBitmap)        {            var c = new BitmapCursor(cursorBitmap);            return CursorInteropHelper.Create(c);        }        protected BitmapCursor(Bitmap cursorBitmap)            : base((IntPtr)(-), true)        {            handle = cursorBitmap.GetHicon();        }        protected override bool ReleaseHandle()        {            bool result = DestroyIcon(handle);            handle = (IntPtr)(-);            return result;        }        [DllImport("user32")]        private static extern bool DestroyIcon(IntPtr hIcon);    }

下面是一段示例代码:

        private static Cursor CreateMyCursor()        {            const int w = ;            const int h = ;            const int f = ;            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 -  * f, w -  * 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;            }        }

最新文章

  1. Implicit and Explicit Multithreading MULTITHREADING AND CHIP MULTIPROCESSORS
  2. Deep Learning: Activation Function
  3. linux ps命令详解
  4. JavaScript 正则表达式相关理解
  5. Nhibernate cookbook 3.0-翻译
  6. EasyUI中combotree允许多选的时候onSelect事件会重复触发onCheck事件
  7. 【java】利用异常机制,往前台写错误信息
  8. [转] Linux下查看文件和文件夹大小
  9. 优雅高效的MyBatis-Plus工具快速入门使用
  10. 《深入理解计算机系统》【PDF】下载
  11. windows下搭建virtualenv虚拟环境
  12. 在python中使用print()时,raw write()返回无效的长度:OSError: raw write() returned invalid length 254 (should have been between 0 and 127)
  13. HTML5-2
  14. 洛谷P4723 【模板】线性递推(多项式取模 线性代数)
  15. 通过URL传递中文参数的乱码处理
  16. (转载)Android开发——Android中常见的4种线程池(保证你能看懂并理解)
  17. (一 ) 天猫精灵接入Home Assistant-服务器搭建
  18. parent.relativePath&#39; points at wrong local POM
  19. Git_简介
  20. 转载:QT QTableView用法小结

热门文章

  1. showSoftInput不起作用
  2. 删除GitHub上项目中的某个文件
  3. hdu 2577 How to Type(DP)
  4. php实现把二叉树打印成多行(谋而后动,写好算法思路,不然浪费超多时间而且还是错误代码,而且精力消耗会导致代码正确率下降以及低级错误)
  5. Qt5 编译 &amp; 打包依赖dll发布
  6. ITFriend创业阶段的服务器环境搭建手册
  7. CSS自己主动换行、强制不换行、强制断行、超出显示省略号
  8. 使用Ant包装时,包javax.servlet.http有没有搞错
  9. Tricks(四十七)—— 布尔矩阵(0-1矩阵)取反
  10. spark 基于key排序的wordcount