当前位置: 首页 > news >正文

在 Windows Mobile 上使用 GDI+

GDI+ 是 Windows 操作系统中提供二维矢量图形、图像处理和版式的部分。GDI+ 在 GDI(较早版本的 Windows 中提供的 Graphics Device Interface)的基础上进行了改进,添加了新功能并优化了现有功能。.NET Framework 已经实现了托管的 GDI+ 编程接口,而 .NET Compact Framework 并没有支持 GDI+。这使得 Windows Mobile 应用程序在实现一些漂亮的绘图效果时(如:渐变),没有桌面应用程序那么容易。

事实上很早以前就有人开发了一个叫 XrossOne Mobile GDI+ 的开源二维图形引擎,它完全是用 C# 托管代码编写的。XrossOne GDI+ 可以帮助 .NET Compact Framework 开发人员创建高质量的矢量图形输出。GDI+ 中的所有高级功能(反锯齿绘图、线帽/联接装饰、二维变换、渐变填充等等)几乎都可以通过它实现。不过由于 XrossOne GDI+ 是纯托管代码实现的,在绘图性能上跟 .NET Framework 的 GDI+ 还有一定的差距。在《用于 Microsoft .NET Compact Framework 的 XrossOne Mobile》一文中可以了解到 XrossOne GDI+ 的详细介绍及源代码下载。

Windows Mobile 还提供了 Game API 和 Direct3D Mobile,但这两套 API 是针对游戏程序的,并不一定适合普通的应用程序。

事实上从 Windows Mobile 5.0 开始就支持 GDI+ 了,开发人员可以利用 C 语言或者 P/Invoke 来使用这些 API。OpenNETCF 顾问 Alex Feinman 已经将 Windows Mobile 的 GDI+ API 用 C# 语言封装好了,并且提供了一些很漂亮的示例程序。

Brushes

BrushDemo.png

Brush Demo source code:

  1. PathGradient brush
    // Create rectangular path
    GraphicsPath path = new GraphicsPath(FillMode.FillModeAlternate);
    path.AddRectangle(new GpRectF( 0, 0, ClientRectangle.Width,
    ClientRectangle.Height / 5));

    // Create rectangular gradient brush
    // with red in center and black in the corners
    brPathGrad = new PathGradientBrush(path);
    brPathGrad.SetCenterColor(Color.Red);
    int count = 2;
    brPathGrad.SetSurroundColors(new Color[] { Color.Black, Color.Black },
    ref count);
  2. Solid Brush
    brSolid = new SolidBrushPlus(Color.CornflowerBlue);
  3. Hatch Brush
    brHatch = new HatchBrush(HatchStyle.HatchStyle25Percent,
    Color.Black, Color.White);
  4. Linear Gradient
    brLinGrad = new LinearGradientBrush(new GpPointF(0, 0),
    new GpPointF(50, 50), Color.Black, Color.White);
  5. Texture brush
    StreamOnFile sf = new StreamOnFile(bitmapPath);
    ImagePlus img = new ImagePlus(sf, false);
    brTexture = new TextureBrushPlus(img, WrapMode.WrapModeTile);

Pens

PenDemo.png

Pen Demo source code:

  1. Solid with caps. Standard caps are used – round and arrow
    brSolid = new SolidBrushPlus(Color.CornflowerBlue);
    penSolid = new PenPlus(Color.Red, 10);
    penSolid.SetEndCap(LineCap.LineCapRound);
    penSolid.SetStartCap(LineCap.LineCapArrowAnchor);
  2. Solid with caps and antialiasing. This one is the same as before except it is drawn with antialiasing
    g.SetSmoothingMode(SmoothingMode.SmoothingModeAntiAlias);
    penSolid.SetColor(Color.Blue);
    g.DrawLine(penSolid, 5, rcf.Top + 10, rc.Width - 10, rcf.Top + 10);
  3. Hatched (25%)
    brHatch = new HatchBrush(HatchStyle.HatchStyle25Percent,
    Color.Black, Color.White);
    penHatch = new PenPlus(brHatch, 10);
  4. Solid with transparency
    penSolidTrans = new PenPlus(Color.FromArgb(-0x5f7f7f7f), 10);
  5. Custom cap. The custom cap has been created out of a path object consisting of a single ellipse
    penSolidCustomCap = new PenPlus(Color.Black, 20);
    GraphicsPath path = new GraphicsPath(FillMode.FillModeAlternate);
    path.AddEllipse(-0.5f, -1.5f, 1, 3);
    CustomLineCap cap = new CustomLineCap(null,path, LineCap.LineCapFlat, 0);
    penSolidCustomCap.SetCustomEndCap(cap);
  6. Dash
    penDash = new PenPlus(Color.Black, 5);
    penDash.SetDashStyle(DashStyle.DashStyleDot);
  7. Gradient brush-based

brGrad = new LinearGradientBrush(

new GpPointF(0, 0), new GpPointF(100, 100),

Color.Black, Color.White);

penGradient = new PenPlus(brGrad, 30);

Demo application

Main.png

效果还不错吧!既然是用 Win32 API 实现绘图的,性能肯定不差。关于这套 GDI+ API 的详细信息,可以仔细看 Alex Feinman 的《Using GDI+ on Windows Mobile》,还提供源代码和文章的PDF格式下载哦!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python class namedtuple 效率_Python数据结构:一个被低估的Namedtuple(一)
  • 在Tech Ed上要看到的Sync Service for ADO.NET
  • python具有可嵌入性_python基础第一节
  • 壮壮出世了
  • mysql数据库中本体数据_基于关系型数据库的本体持久化
  • 使用Ghost32.exe进行点对点计算机克隆
  • python正则通配符_通配符、正则表达式、python去重
  • 深入研究Windows内部原理系列(视频)(微软制造)
  • root命令连接mysql_通过更改root密码实现连接MySQL及常用命令
  • 关于Component Business Model和DDD关系的探究结论
  • 查看mysql的ibdata1_mysql 里的 ibdata1 文件
  • 电子信息系统常识介绍--上位机和下位机
  • mysql 字符集测试_Windows下MySQL的my.ini文件字符集测试(二)
  • gOS Google的OS来了?(图)
  • 因特网MySQL服务器_因特网服务器的主要功能
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • express如何解决request entity too large问题
  • Java 最常见的 200+ 面试题:面试必备
  • springboot_database项目介绍
  • SpriteKit 技巧之添加背景图片
  • vue数据传递--我有特殊的实现技巧
  • 百度地图API标注+时间轴组件
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 仿天猫超市收藏抛物线动画工具库
  • 使用 @font-face
  • 一个项目push到多个远程Git仓库
  • 因为阿里,他们成了“杭漂”
  • 原生js练习题---第五课
  • 中文输入法与React文本输入框的问题与解决方案
  • 国内开源镜像站点
  • 数据库巡检项
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • # Redis 入门到精通(七)-- redis 删除策略
  • # SpringBoot 如何让指定的Bean先加载
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (离散数学)逻辑连接词
  • (十)Flink Table API 和 SQL 基本概念
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)视频码率,帧率和分辨率的联系与区别
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *Django中的Ajax 纯js的书写样式1
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET 分布式技术比较
  • .net 连接达梦数据库开发环境部署