Wpf中鼠標樣式的修改,作用點修改


背景:

最近,在做一個控件的鼠標樣式,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本身已經集成了一個作用點設置工具:點擊這個圖標,我們可以可視化的輕松設置鼠標圖標的作用點,根本沒有那么麻煩!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM