博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[WPF]自定义鼠标指针
阅读量:7107 次
发布时间:2019-06-28

本文共 1643 字,大约阅读时间需要 5 分钟。

原文:

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

 

 

 

 

转载地址:http://xkjhl.baihongyu.com/

你可能感兴趣的文章
初探 MySQL 的 Binlog
查看>>
HP SmartStart CD ISO下载地址
查看>>
域控制器更改IP
查看>>
利用自定义Java注解实现资源注入
查看>>
多维地址
查看>>
rpm打包mysql5.5
查看>>
《Effective C++》之条款33:避免遮掩继承而来的名称
查看>>
现代软件工程 作业 1 个人项目
查看>>
我的友情链接
查看>>
jdk1.7升级为1.8
查看>>
Hyper-V虚拟网络总结
查看>>
博客作业:raid各级别特性
查看>>
mysql数据文件迁移(转)(亲测可用)
查看>>
三层交换
查看>>
find删除用户家目录下的文件需注意
查看>>
[ Exchange 2016] Mail Box 無法接收外部郵件
查看>>
LAMP平台搭建脚本
查看>>
C#的扩展方法解说
查看>>
量化指标程序库 ta-lib 安装方法
查看>>
Node.js 模块和包(Modules)
查看>>