給項(xiàng)目的圖表做了一個(gè)手工具,用來(lái)拖動(dòng)圖表(類似photoshop里面的手工具)。 但是把Chart鼠標(biāo)指針換成找來(lái)的手指針以后運(yùn)行程序以后,原本藍(lán)色的指針卻在圖標(biāo)上面顯示出來(lái)卻是黑白的了,丑的要死。
改變默認(rèn)指針我用的是這行代碼:
Chart.Cursor = new Cursor("hand.cur"); 其中"hand.cur" 是手指針文件名。
當(dāng)時(shí)我就很疑惑不解,為什么彩色的指針變成黑白的了呢? 是不是指針文件本身的問(wèn)題? 簡(jiǎn)單建了一個(gè)html然后設(shè)置<body style="cursor:("hand.cur");" > 后發(fā)現(xiàn)我的hand.cur文件沒(méi)有問(wèn)題,在IE瀏覽器里能正確的顯示。
是不是System.Windows.Forms.Cursor 不支持彩色的指針?或者在Windows Form Control不支持彩色的指針。試著去控制面板把系統(tǒng)的默認(rèn)指針改成彩色的另一套,然后吧鼠標(biāo)指到新建的一個(gè)空白form上面,發(fā)現(xiàn)彩色的指針能夠在win form 上面顯示。
可能出現(xiàn)問(wèn)題的范圍越縮越小,看來(lái)問(wèn)題在于.net framework了。因?yàn)檎{(diào)用unmanage code 是肯定可以設(shè)置彩色指針的(剛才的測(cè)試),估計(jì)是framework 包裹unmanage 代碼(windows API)的時(shí)候改了cursor的顏色位數(shù)(16,128,256之類)。 于是我想到了去Cursor里面找這個(gè)類都調(diào)用了哪些非托管代碼來(lái)設(shè)置指針。
Cursors 靜態(tài)類里面定義的默認(rèn)Cursor可以用彩色的。于是打開(kāi)Cursors.cs的源碼來(lái)看,Cursors的靜態(tài)屬性里面實(shí)際上調(diào)用了Cursor的internal Constructor 來(lái)實(shí)例化Cursor然后返回。Cursor 類有很多個(gè)contructor,而Cursors 的靜態(tài)屬性里面調(diào)用的是 Cursor(IntPtr) 這個(gè)構(gòu)造函數(shù)。而我之前調(diào)用的卻是Cursor(string fileName)。 基本上可以說(shuō)是這幾個(gè)構(gòu)造函數(shù)造成的差異了,既然Cursors里面的靜態(tài)屬性可以返回有顏色的指針,那么我也調(diào)用同樣的構(gòu)造函數(shù)試試看吧。
首先,我在visual studio里面創(chuàng)建了一個(gè)新的icon文件。然后吧我的彩色指針同樣用vs打開(kāi),復(fù)制圖像到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);
創(chuàng)建icon實(shí)例,然后創(chuàng)建指針實(shí)例。把windows 的pointer 指定給Cursor的構(gòu)造函數(shù),然后我的彩色指針就能顯示出來(lái)了。
還有一點(diǎn)要注意的是,如果程序運(yùn)行離開(kāi)了這個(gè)函數(shù)的scope以后,icoHand1, icoHand2 會(huì)被GC 收集掉, 然后你的cursor就會(huì)指向空指針。所以我吧icoHand1,2定義在函數(shù)外面,變成這個(gè)類的一個(gè)member variable。 這樣子就不會(huì)出現(xiàn)icon在cursor之前被收集掉的情況了。
唉,高中語(yǔ)文沒(méi)有學(xué)好啊。到現(xiàn)在想寫(xiě)一篇文章都這么難,讀者應(yīng)該很難理解吧。
Tag標(biāo)簽: colorful Cursor,Win form,IntPtr