背景:

最近,在做一个控件的鼠标样式,Ps加了插件,可以编辑生成.cur格式的图标。可是,所有的改完以后,调试运行,结果发现自己制作的图标的作用点总是在左上角,而不是在“手形”图标的食指上...所以,问题来了,怎么修改鼠标样式的作用点呢?百度半天无果,自己琢磨半天,cursor这个东东没有什么可以使用的其它属性。

经过:

后来,在逛StackOverflow的时候,偶然发现了一个提问,找到点有用的东西:

原地址:http://stackoverflow.com/questions/46805/custom-cursor-in-wpf

感谢万能的StackOverflow,顺便吐槽一下百度。

其实文章中我找到的是一个词:hotspot,即“热点”。阅读代码可以发现这就是我们要的。

文中提出了制作鼠标样式的方法,这些方法都好说,我们关注的是修改作用点,观察文中提到的方法,都是通过向stream中写字节的方法实现,个人觉得比较麻烦且费时。于是想,大家改stream,那么是不是.cur中可以直接对其进行设置呢

  1. public Cursor ConvertToCursor(FrameworkElement visual, Point hotSpot)
  2. {
  3. int width = (int)visual.Width;
  4. int height = (int)visual.Height;
  5.  
  6. // Render to a bitmap
  7. var bitmapSource = new RenderTargetBitmap(width, height, , , PixelFormats.Pbgra32);
  8. bitmapSource.Render(visual);
  9.  
  10. // Convert to System.Drawing.Bitmap
  11. var pixels = new int[width*height];
  12. bitmapSource.CopyPixels(pixels, width, );
  13. var bitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
  14. for(int y=; y<height; y++)
  15. for(int x=; x<width; x++)
  16. bitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x]));
  17.  
  18. // Save to .ico format
  19. var stream = new MemoryStream();
  20. System.Drawing.Icon.FromHandle(resultBitmap.GetHicon()).Save(stream);
  21.  
  22. // Convert saved file into .cur format
  23. stream.Seek(, SeekOrigin.Begin);
  24. stream.WriteByte();
  25. stream.Seek(, SeekOrigin.Begin);
  26. stream.WriteByte((byte)(int)(hotSpot.X * width));
  27. stream.WriteByte((byte)(int)(hotSpot.Y * height));
  28. stream.Seek(, SeekOrigin.Begin);
  29.  
  30. // Construct Cursor
  31. return new Cursor(stream);
  32. }

于是,便回到百度键入刚刚知道的关键词 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本身已经集成了一个作用点设置工具:点击这个图标,我们可以可视化的轻松设置鼠标图标的作用点,根本没有那么麻烦!

Wpf中鼠标样式的修改,作用点修改的更多相关文章

  1. wpf中的样式与模板

    1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resource ...

  2. wxpython中鼠标样式的获取与匹配

    在wxpython中定义有多种默认的鼠标样式,譬如:wx.CURSORCROSS wx.CURSORHAND等等, 此处按下不表,可以参考wxpython的samples里面自带的cursor例子 这 ...

  3. WPF编程学习——样式

    本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的 ...

  4. [No000012F]WPF(7/7) - 样式,触发器和动画

    WPF Tutorial : Beginning [^] WPF Tutorial : Layout-Panels-Containers & Layout Transformation [^] ...

  5. WPF编程学习 —— 样式

     本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中 ...

  6. WPF中Style文件的引用——使用xaml代码或者C#代码动态加载

    原文:WPF中Style文件的引用--使用xaml代码或者C#代码动态加载 WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观 ...

  7. WPF 中style文件的引用

    原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...

  8. C#、WPF中如何自定义鼠标样式

    需求:在C#中如何自定义鼠标样式?在这里可以分两种情况,一种是在winForm,另一种是在WPF中(注意使用的Cursor对象不一样) 解决办法如下: a.首先针对WinForm中,我们可以采用图标加 ...

  9. JQ方法实用案例///鼠标移动到div和修改ipt中弹窗、CSS鼠标变小手、JQ获取元素属性、JQ选择器

    今天学习了jQ,jQ对js的帮助很大,菜鸟教程上也有属性.可以查看 js 和 jquery主要的区别 在 dom    想用jquery  必须先引入(顺序问题)        先css 再js:   ...

随机推荐

  1. FZU 1397 保送

    网络流入门题. 源点到每一个学生连一条边,容量为1 每个学校到汇点连一条边,容量为L 符合要求的学生和学校之间连边,容量为1. 从源点到汇点的最大流就是答案. #include<cstdio&g ...

  2. linux与windows回车换行符的区别

    转自:http://www.cnblogs.com/dartagnan/archive/2010/12/14/2003499.html “回车”(carriage return)VS  “换行”(li ...

  3. sql 里的 IF ELSE 语句用法

      IF ELSE 语句 IF ELSE 是最基本的编程语句结构之一几乎每一种编程语言都支持这种结构而 它在用于对从数据库返回的数据进行检查是非常有用的TRANSACT-SQL 使用IF ELSE 的 ...

  4. python中使用urllib2伪造HTTP报头的2个方法

    在采集网页信息的时候,经常需要伪造报头来实现采集脚本的有效执行 下面,我们将使用urllib2的header部分伪造报头来实现采集信息 方法1. ? 1 2 3 4 5 6 7 8 9 10 11 1 ...

  5. RACSingle 有效的两种方式

    第一种当然是subscribeNext 另外还有一种就是作为Command的enablesingle也相当于被订阅了.

  6. fiddler 路由设置

    REGEX:^http://data.51buy.com/biz/oppmsmobile/web/js/app/(.+)/(.+).js E:\svns\new\dev\webapp\data_ics ...

  7. 导航栏项目滑过时子菜单显示/隐藏jquery代码

    ;(function(window){    $('.menuitem').hover(function(){        $('>a',this).css('background-color ...

  8. Selenium关于Page Objects

    介绍页面对象设计模式.一个页面对象表示在你测试的web页面用户交互的界面. 使用页面对象模式的有点: 创建可重用的代码可以在多个测试用例中使用 减少重复的代码量 如果用户界面改变,只需要修改一个地方 ...

  9. PHP中PDO错误/异常(PDOException)处理

    PDO 提供了三种不同的错误处理模式,以满足不同风格的应用开发: PDO::ERRMODE_SILENT 此为默认模式. PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 P ...

  10. C++第四天学习

    回顾: 1.初始化表 2.this指针 3.拷贝构造 Test(const Test& rt) { //1.分配新空间 //2.给新空间赋值 } 4.static成员 类::函数(): 类型 ...