原文:从FrameworkElement对象创建Cursor对象

Normal
0

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

 

理论上可以从任何派生自 Visual的对象创建光标对象,但是由于 FrameworkElement拥有 ActualWidth和 ActualHeight属性,这就省去了指定光标大小的麻烦。创建过程很简单,可运行代码如下:

public static class CursorHelper

  {

    // 表示每英寸的像素点数

    private const int DPI = 96;

 

    public static Cursor CreateCursorFromFrameworkElement(FrameworkElement e, Point hotSpot)

{

       // 把界面元素呈现到位图上

      RenderTargetBitmap renderTargetBitmap =

        new RenderTargetBitmap ((int )e.ActualWidth, (int )e.ActualHeight, DPI, DPI, PixelFormats .Pbgra32);

      renderTargetBitmap.Render(e);

 

      PngBitmapEncoder bitmapEncoder = new PngBitmapEncoder ();

      BitmapFrame bitmapFrame = BitmapFrame .Create(renderTargetBitmap);

      bitmapEncoder.Frames.Add(bitmapFrame);

 

      using (var stream = new System.IO.MemoryStream ())

      {

        // 把位图保存到一个 Stream 中

        bitmapEncoder.Save(stream);

 

        stream.Seek(0, System.IO.SeekOrigin .Begin);

        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap (stream);

        // 光标文件 .cur 文件其实是基于图标文件的( .ico ) , 所以先将位图转换为图标

        IntPtr iconHandle = bitmap.GetHicon();

        System.Drawing.Icon icon = System.Drawing.Icon .FromHandle(iconHandle);

 

        using (System.IO.Stream iconStream = new System.IO.MemoryStream ())

        {

          icon.Save(iconStream);

 

     // 第二个字节表示该图形是图标还是光标, 2 表示光标

           iconStream.Seek(2, System.IO.SeekOrigin .Begin);

          iconStream.WriteByte(2);

     // 第十个字节处存放热点坐标的 x 坐标,热点就是用来点击屏幕的点,该点的坐标就是其在位图中的坐标,此处参数用的是相对坐标。此处转换为绝对坐标

          iconStream.Seek(10, System.IO.SeekOrigin .Begin);

          iconStream.WriteByte((byte )(int )(e.ActualWidth * hotSpot.X));

Normal
0

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4


<![endif]-->

   // 第十二个字节处存放热点坐标的 y 坐标

          iconStream.Seek(12, System.IO.SeekOrigin .Begin);

          iconStream.WriteByte((byte )(int )(e.ActualHeight * hotSpot.Y));

          iconStream.Seek(0, System.IO.SeekOrigin .Begin);

          return new Cursor (iconStream);

        }

      }

    }

从FrameworkElement对象创建Cursor对象的更多相关文章

  1. Cocos2d-js中使用纹理对象创建Sprite对象

    本节我们会通过一个实例介绍纹理对象创建Sprite对象使用,这个实例如图5-2所示,其中地面上的草是放在背景(如下图所示)中的,场景中的两棵树是从后图所示的“树”纹理图片中截取出来的,图5-5所示是树 ...

  2. 实例:使用纹理对象创建Sprite对象

    精灵类是Sprite,它的类图如下图所示: Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的派生类有:PhysicsSprite和Skin.Physics ...

  3. Object-C 对象 (创建/销毁 对象)-- 笔记

    创建/销毁 对象: Dog *dog = [Dog alloc]; //  通过alloc创建dog一个这样的对象, alloc相对于C语言中的new // *号既表示指针,也表示引用 初始化构造函数 ...

  4. HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)

    以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位 一.对象的创建 1)类加载:虚拟机遇到一条new指令时,先检测这个指令的参数能否在常量池中定位到 ...

  5. Java虚拟机4:Java对象创建和对象访问

    1.对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.看一下在虚拟 ...

  6. 在TerraExplorer中如何批量根据shape多边形对象创建TerrainModify对象?

    其实,在Skyline中TerrainModify对象就是一个特殊类型Polygon对象,他们的Geometry是可以直接交换使用的: <!DOCTYPE html PUBLIC "- ...

  7. JVM之对象创建、对象内存布局、对象访问定位

    对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Ja ...

  8. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  9. JavaScript 基础(二) - 创建 function 对象的方法, String对象, Array对象

    创建 function 对象的两种方法: 方式一(推荐) function func1(){ alert(123); return 8 } var ret = func1() alert(ret) 方 ...

随机推荐

  1. BUFSIZ

    转http://www.judymax.com/archives/262 今天在看示例程序时冒出来一句args = emalloc(BUFSIZ); BUFSIZ是什么意思,查了一下才明白. 这是st ...

  2. cmake配置c++可调用的文件路径参数

    一.目的 在程序中使用一个路径配置,因为在svn服务器的测试数据,测试数据成为了本地路径,在程序中使用了绝对路径来处理文件的输入,这个令人头疼啊. 每次下完代码,我得挨个地方去找,谁在用本地路径,有点 ...

  3. 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)

    前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...

  4. [Tools] Fix Only Committed Files with Prettier and lint-staged

    In this lesson we'll use prettier and lint-staged to run prettier only on files that have been chang ...

  5. Matlab-------regexp正则表达式

    转自原文 Matlab-------regexp正则表达式 句点符号 '.' ——匹配任意一个(只有一个)字符(包括空格). 例如:t.n,它匹配tan. ten.tin和ton,还匹配t#n.tpn ...

  6. js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素

    js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素 一.总结 一句话总结:closest()方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上.of ...

  7. 常用服务器ftp、ssh

    1. Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议". 用于Int ...

  8. 【u208】修复公路

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数 ...

  9. 算法 Tricks(五)—— 二进制逻辑运算

    int flag = 1; while ( (data & flag) == 0 ) flag <<= 1; 判断某数的二进制形式的某位(第 k 位)是否为 1,将其与 2k 相与 ...

  10. 安全配置基线Linux系统

    Linux系统安全配置基线 一:共享账号检查 配置名称:用户账号分配检查,避免共享账号存在 配置要求:1.系统需按照实际用户分配账号: 2.避免不同用户间共享账号,避免用户账号和服务器间通信使用的账号 ...