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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值