黎波

Windows Mobile Development for Line of Business
posts - 179, comments - 1141, trackbacks - 36, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

在 Windows Mobile 上使用 GDI+

Posted on 2007-11-06 01:32 黎波 阅读(1013) 评论(7)  编辑 收藏 所属分类: .NET CF

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格式下载哦!

Feedback

#1楼    回复  引用  查看    

2007-11-06 14:55 by 银河      
好文章,支持一下!

#2楼    回复  引用  查看    

2007-11-08 22:21 by 啊夏      
利用 C 语言 来调用GDI+ 在wm5上 包含头文件后。编译出了一堆的错误。
在网上找了好久没找到解决的方法。

望博主指条明路。

#3楼    回复  引用    

2007-11-09 10:23 by zhusz [未注册用户]
下载了Alex Feinman提供的源代码,用vs2005却打不开,说是找不到项目引用的设备平台,不知道这个project是在哪个平台上的?谢谢!
PS:vs2005已经安装了Windows Mobile 5.0 Pocket PC SDK.msi、Windows Mobile 5.0 Smartphone SDK.msi

#4楼    回复  引用    

2007-11-14 17:15 by Alex Feinman [未注册用户]
The demo project is for Windows Mobile 6. You will need WIndows Mobile 6 Professional SDK Refresh

http://www.microsoft.com/downloads/details.aspx?familyid=06111a3a-a651-4745-88ef-3d48091a390b

#5楼 [楼主]   回复  引用  查看    

2007-11-14 21:14 by 黎波      
@Alex Feinman
thanks Alex Feinman:)

#6楼    回复  引用    

2008-05-07 10:09 by 尚秀颖 [未注册用户]
不错,学习一下阿

#7楼    回复  引用    

2008-05-09 21:14 by 尚秀颖 [未注册用户]
希望对wm下使用GDI+的朋友进行交流学习:qq 67530591

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-06 09:57 编辑过
 

另存  打印