改变默认指针我用的是这行代码:
Chart.Cursor = new Cursor("hand.cur"); 其中"hand.cur" 是手指针文件名。
当时我就很疑惑不解,为什么彩色的指针变成黑白的了呢? 是不是指针文件本身的问题? 简单建了一个html然后设置<body style="cursor:("hand.cur");" > 后发现我的hand.cur文件没有问题,在IE浏览器里能正确的显示。
是不是System.Windows.Forms.Cursor 不支持彩色的指针?或者在Windows Form Control不支持彩色的指针。试着去控制面板把系统的默认指针改成彩色的另一套,然后吧鼠标指到新建的一个空白form上面,发现彩色的指针能够在win form 上面显示。
可能出现问题的范围越缩越小,看来问题在于.net framework了。因为调用unmanage code 是肯定可以设置彩色指针的(刚才的测试),估计是framework 包裹unmanage 代码(windows API)的时候改了cursor的颜色位数(16,128,256之类)。 于是我想到了去Cursor里面找这个类都调用了哪些非托管代码来设置指针。
Cursors 静态类里面定义的默认Cursor可以用彩色的。于是打开Cursors.cs的源码来看,Cursors的静态属性里面实际上调用了Cursor的internal Constructor 来实例化Cursor然后返回。Cursor 类有很多个contructor,而Cursors 的静态属性里面调用的是 Cursor(IntPtr) 这个构造函数。而我之前调用的却是Cursor(string fileName)。 基本上可以说是这几个构造函数造成的差异了,既然Cursors里面的静态属性可以返回有颜色的指针,那么我也调用同样的构造函数试试看吧。
首先,我在visual studio里面创建了一个新的icon文件。然后吧我的彩色指针同样用vs打开,复制图像到icon里面去保存。
然后:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
创建icon实例,然后创建指针实例。把windows 的pointer 指定给Cursor的构造函数,然后我的彩色指针就能显示出来了。
还有一点要注意的是,如果程序运行离开了这个函数的scope以后,icoHand1, icoHand2 会被GC 收集掉, 然后你的cursor就会指向空指针。所以我吧icoHand1,2定义在函数外面,变成这个类的一个member variable。 这样子就不会出现icon在cursor之前被收集掉的情况了。
唉,高中语文没有学好啊。到现在想写一篇文章都这么难,读者应该很难理解吧。
![](https://www.cnblogs.com/Emoticons/yoyocici/224023962.gif)