在winform的控件上面如何使用彩色的鼠标指针

       给项目的图表做了一个手工具,用来拖动图表(类似photoshop里面的手工具)。  但是把Chart鼠标指针换成找来的手指针以后运行程序以后,原本蓝色的指针却在图标上面显示出来却是黑白的了,丑的要死。
       改变默认指针我用的是这行代码:
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里面去保存。
然后:

    
            icoHand1 = new Icon(GetType(), "cursors.hand1.ico");
            icoHand2 
= new Icon(GetType(), "cursors.hand2.ico");

            curHand 
= new Cursor(icoHand1.Handle);
            curDrag 
= new Cursor(icoHand2.Handle);

       创建icon实例,然后创建指针实例。把windows 的pointer 指定给Cursor的构造函数,然后我的彩色指针就能显示出来了。
       还有一点要注意的是,如果程序运行离开了这个函数的scope以后,icoHand1, icoHand2 会被GC 收集掉, 然后你的cursor就会指向空指针。所以我吧icoHand1,2定义在函数外面,变成这个类的一个member variable。 这样子就不会出现icon在cursor之前被收集掉的情况了。


唉,高中语文没有学好啊。到现在想写一篇文章都这么难,读者应该很难理解吧。
posted @ 2008-04-08 18:57  Yang Ching  阅读(1352)  评论(1编辑  收藏