背景:
最近,在做一個控件的鼠標樣式,Ps加了插件,可以編輯生成.cur格式的圖標。可是,所有的改完以后,調試運行,結果發現自己制作的圖標的作用點總是在左上角,而不是在“手形”圖標的食指上...所以,問題來了,怎么修改鼠標樣式的作用點呢?百度半天無果,自己琢磨半天,cursor這個東東沒有什么可以使用的其它屬性。
經過:
后來,在逛StackOverflow的時候,偶然發現了一個提問,找到點有用的東西:
原地址:http://stackoverflow.com/questions/46805/custom-cursor-in-wpf
感謝萬能的StackOverflow,順便吐槽一下百度。
其實文章中我找到的是一個詞:hotspot,即“熱點”。閱讀代碼可以發現這就是我們要的。
文中提出了制作鼠標樣式的方法,這些方法都好說,我們關注的是修改作用點,觀察文中提到的方法,都是通過向stream中寫字節的方法實現,個人覺得比較麻煩且費時。於是想,大家改stream,那么是不是.cur中可以直接對其進行設置呢
public Cursor ConvertToCursor(FrameworkElement visual, Point hotSpot) { int width = (int)visual.Width; int height = (int)visual.Height; // Render to a bitmap var bitmapSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); bitmapSource.Render(visual); // Convert to System.Drawing.Bitmap var pixels = new int[width*height]; bitmapSource.CopyPixels(pixels, width, 0); var bitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); for(int y=0; y<height; y++) for(int x=0; x<width; x++) bitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x])); // Save to .ico format var stream = new MemoryStream(); System.Drawing.Icon.FromHandle(resultBitmap.GetHicon()).Save(stream); // Convert saved file into .cur format stream.Seek(2, SeekOrigin.Begin); stream.WriteByte(2); stream.Seek(10, SeekOrigin.Begin); stream.WriteByte((byte)(int)(hotSpot.X * width)); stream.WriteByte((byte)(int)(hotSpot.Y * height)); stream.Seek(0, SeekOrigin.Begin); // Construct Cursor return new Cursor(stream); }
於是,便回到百度鍵入剛剛知道的關鍵詞 hotspot cursor ,又是一通搜索,終於,功夫不負有心人,找到一篇有用的文章:
http://blog.sina.com.cn/s/blog_4f8d956b0100nj9i.html
在此感謝原文作者。所以說為什么寫博客,一方面提高自己,一方面可能會在意想不到的地方給他人啟發。
最終解決方案:
其實說起來太簡單,就是下了一款軟件:ArtCursor(直接上地址:http://5.yd.pc0359.cn/soft/a/ArtCursors.rar),軟件中,有一項設置sethotspot。修改就好了。。。另外,悄悄告訴你,其實Vs中,點擊選中.cur文件中在屬性欄直接就可以看得到hotspot,但不知為啥設置不了,暈!我之前都在干啥(吐血)
當然,我們還可以用更極客的方式,直接去編輯二進制文件:
我選擇用SublimeText以十六進制形式打開.cur文件,修改第6、7字(第11、13字節),分別表示hotspot的x、y(注意,這里用的是十六進制)。保存,OK!
更新:
現在回頭看之前寫的,哈哈,有點兒尷尬,其實VS本身已經集成了一個作用點設置工具:點擊這個圖標,我們可以可視化的輕松設置鼠標圖標的作用點,根本沒有那么麻煩!