背景:

最近,在做一个控件的鼠标样式,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, , , PixelFormats.Pbgra32);
bitmapSource.Render(visual); // Convert to System.Drawing.Bitmap
var pixels = new int[width*height];
bitmapSource.CopyPixels(pixels, width, );
var bitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
for(int y=; y<height; y++)
for(int x=; 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(, SeekOrigin.Begin);
stream.WriteByte();
stream.Seek(, SeekOrigin.Begin);
stream.WriteByte((byte)(int)(hotSpot.X * width));
stream.WriteByte((byte)(int)(hotSpot.Y * height));
stream.Seek(, 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本身已经集成了一个作用点设置工具:点击这个图标,我们可以可视化的轻松设置鼠标图标的作用点,根本没有那么麻烦!

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. jquery 改变变量出现值不同步

    出现问题的代码 var unc = 0; $.get( 'index.php', 'data=1', function(res) { unc=1; } ); alert(nuc); 这样的话,不管aj ...

  2. 文本去重-----awk或者uniq

    对于awk '!a[$3]++',需要了解3个知识点 1.awk数组知识,不说了 2.awk的基本命令格式 awk 'pattern{action}'     省略action时,默认action是{ ...

  3. Java Dwr3实现消息推送步骤详解

    DWR包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改 ...

  4. UVa 10945 - Mother bear

    题目大意:给一个字符串,判断是否回文(忽略大小写,忽略非字母字符). #include <cstdio> #include <cctype> #include <cstr ...

  5. leangoo

    leangoo网址:https://www.leangoo.com/

  6. 【转】安卓布局:layout_weight的理解

    android:layout_weight详细分析介绍: 布局文件是:<?xml version="1.0" encoding="utf-8"?>& ...

  7. adapter中报错:Can't create handler inside thread that has not called Looper.prepare()

    http://stackoverflow.com/questions/9357513/cant-create-handler-inside-thread-that-has-not-called-loo ...

  8. python 模块添加

    python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径.下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构:`-- src  ...

  9. shell 创建带参数的命令方法

    主要用到case in,和shift命令. shift 命令是从参数数组中,删除当前第一个参数. while [ "$1" != "" ] do case $1 ...

  10. Python使用Selenium/PhantomJS

    安装selenium: 1 pip install selenium 安装PhantomJS: 1 2 3 4 https://bitbucket.org/ariya/phantomjs/downlo ...