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, , , 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中鼠标样式的修改,作用点修改的更多相关文章
- wpf中的样式与模板
1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resource ...
- wxpython中鼠标样式的获取与匹配
在wxpython中定义有多种默认的鼠标样式,譬如:wx.CURSORCROSS wx.CURSORHAND等等, 此处按下不表,可以参考wxpython的samples里面自带的cursor例子 这 ...
- WPF编程学习——样式
本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的 ...
- [No000012F]WPF(7/7) - 样式,触发器和动画
WPF Tutorial : Beginning [^] WPF Tutorial : Layout-Panels-Containers & Layout Transformation [^] ...
- WPF编程学习 —— 样式
本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中 ...
- WPF中Style文件的引用——使用xaml代码或者C#代码动态加载
原文:WPF中Style文件的引用--使用xaml代码或者C#代码动态加载 WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观 ...
- WPF 中style文件的引用
原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...
- C#、WPF中如何自定义鼠标样式
需求:在C#中如何自定义鼠标样式?在这里可以分两种情况,一种是在winForm,另一种是在WPF中(注意使用的Cursor对象不一样) 解决办法如下: a.首先针对WinForm中,我们可以采用图标加 ...
- JQ方法实用案例///鼠标移动到div和修改ipt中弹窗、CSS鼠标变小手、JQ获取元素属性、JQ选择器
今天学习了jQ,jQ对js的帮助很大,菜鸟教程上也有属性.可以查看 js 和 jquery主要的区别 在 dom 想用jquery 必须先引入(顺序问题) 先css 再js: ...
随机推荐
- jqGrid的搜索框下拉
当需要在jqGrid的搜索框里配置搜索条件时,如下拉,日期等,代码如下: datePick = function(elem) { jQuery(elem). } colNames : [ " ...
- 字典NSDictionary的常见用法
// 动态获取字典的第一个典 NSString *firstKey = responseObject.keyEnumerator.nextObject;
- 微信小程序之----生命周期
在app.js的app()中注册程序 在页面.js中的Page({})中注册页面. 执行效果:
- UVa 495 - Fibonacci Freeze
题目大意:计算斐波那契数列的第n项. 由于结果会很大,要用到大数.开始本来想节省空间的,就没用数组保存,结果超时了... import java.io.*; import java.util.*; i ...
- centos6 安装mysql
如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS(七)--Cen ...
- tomcat 修改网站路径(Java之负基础实战)
1.找到server.xml 在tomcat安装路径/conf/server.xml 2.搜索webapps 添加 <Context path="" docBace=&quo ...
- 解剖 Elasticsearch 集群 - 之三
解剖 Elasticsearch 集群 - 之三 本篇文章是一系列涵盖 Elasticsearch 底层架构和原型示例的其中一篇.在本篇文章中,我们会讨论 Elasticsearch 如何提供准实时搜 ...
- js判断浏览器在PC中打开还是移动设备中打开
var browser = { versions: function () { va ...
- HDU-1166-敌兵布阵(线段树)
前言: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a, ...
- JQuery hover toggle事件使用
JQuery hover toggle事件使用: <%@ page language="java" import="java.util.*" pageEn ...