您好,欢迎来到时间财富网
全部需求分类
当前位置:首页 > 移动应用 > 威客用.NET Compact Framework如何创建图像按钮
威客用.NET Compact Framework如何创建图像按钮
2015/8/14 15:33:01   作者:心缘新   人气:772次  评论(0)
所属标签: 移动应用开发 
  与现有开发技术比较 

  与之前的EVB,EVC相比,.net Compact Framework 和Smart Device Extensions (SDE) for Visual Studio.Net具有很大的优势,一方面,MS所有的开发技术和开发工具都在向.Net平台进行迁移。Visual Studio 6.0(包括VB和VC) 已经被Visual Studio.Net所取代。在手持设备的开发中采用.NET方式开发的话,你将获得.NET技术的所有优势:IL中间语言、类似VM(虚拟机)机制的运行时编译器(Run-Time)等,你将从这些特性中获得平台无关性和程序快速移植的能力。

  我们可以通过.NET的优势来看一下Compact Framework和SDE相对于EVC,EVB等编程工具的优势所在:



  . 提供了一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。

  . 提供一个将软件部署和版本控制冲突最小化的代码执行环境,您不必再担心臭名昭著的Dll漏洞。

  . 提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境。由于.NET程序会先编译成IL(中间语言),并且有JIT(Just-In-Time)编译器实时编译为Native Code(本地代码,即机器码),所以在JIT编译器实时编译时完全可以控制代码本身和调用类库的安全性问题。

  . 提供一个可消除脚本环境或解释环境的性能问题的代码执行环境,我们可以不必再考虑应用平台的问题,这部分问题由.NET Framework负责解决。

  . 使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致,因为在WinForm和WebForm中使用同样的基础类库,只是在涉及表现层的控件时,有点差别。

  . 按照工业标准生成所有通讯,以确保基于 .NET 框架的代码可与任何其他代码集成。 并且微软公司将使.NET应用可以使用多种语言编写,C++,Pascal,Cobol等等,其中也包括.NET最大的竞争对手Sun公司的Java语言。

  . 在.NET下进行编程,你将不必考虑垃圾收集问题,.NET有自动的垃圾回收器

  基于以上优点,我想您能体会到.NET的巨大力量了吧,在手持设备开发方面,尽管现在的Windows CE上大多数应用还是使用的EVB,EVC等工具,但是不久的将来,.NET的应用将快速占领这一市场。在整个手持设备开发方面.NET Compact Framework已经落后于唯一的劲敌J2ME了,不过微软公司强大的技术创新能力和市场开拓能力将弥补时间上的缺陷。

  而.NET的核心语言C#是一个真正面向对象的高级编程语言,他在很多方面借鉴了Java语言成功的经验并且又对Java语言加以扩充。我们的示例项目都将采用C#语言编写,在这里也极力推荐大家在今后的学习和编程中使用C#这一新兴的语言。当然,你也可以使用其他语言来编写.NET的应用,只要你符合.NET的编程规则。

三、应用规则

  在实际的操作中,我们将建立一个自画的图像按钮控件.需要在按钮上面显示一个图片,当用户在按按钮时可以看到效果。

  我们开始 Visual Studio .net中建立一个SmartDevice项目的Windows应用程序.在这个项目中我们加入一个新的ImageButton类。

using System;
using System.Drawing;
using System.Windows.Forms;

public class ImageButton : Control
{
//Private members 
private Image image;
//flag to indicate the pressed state
private bool bPushed; 
private Bitmap m_bmpOffscreen;

public ImageButton()
{
bPushed = false;
//default minimal size
this.Size = new Size(21, 21); 
}

protected override void OnPaint(PaintEventArgs e )
{
//Some drawing logic
}

protected override void OnPaintBackground(PaintEventArgs e )
{
//Do nothing
}
}

  在以上代码中,我们用Control控件中的ImageButton类,和重载OnPaint以及OnPaintBackground事件,在上面提到,ImageButton将要一个图片用来显示,所以我们添加图像属性:

public Image Image
{
get
{
return image; 
}
set
{
image = value;
}
}

  当然,还有重载OnPaint事件来绘制按钮

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e )
{
Graphics gxOff; //Offscreen graphics
Rectangle imgRect; //image rectangle
Brush backBrush; //brush for filling a backcolor

if (m_bmpOffscreen == null) //Bitmap for doublebuffering
{
m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
}

gxOff = Graphics.FromImage(m_bmpOffscreen);

gxOff.Clear(this.BackColor);

if (!bPushed) 
backBrush = new SolidBrush(Parent.BackColor);
else //change the background when it's pressed
backBrush = new SolidBrush(Color.LightGray);

gxOff.FillRectangle(backBrush, this.ClientRectangle);

if (image != null)
{
//Center the image relativelly to the control
int imageLeft = (this.Width - image.Width) / 2;
int imageTop = (this.Height - image.Height) / 2;

if (!bPushed)
{
imgRect = new Rectangle(imageLeft, imageTop, image.Width,
image.Height);
}
else //The button was pressed
{
//Shift the image by one pixel
imgRect = new Rectangle(imageLeft + 1, imageTop + 1, image.Width, 
image.Height);
}
//Set transparent key
ImageAttributes imageAttr = new ImageAttributes();
imageAttr.SetColorKey(BackgroundImageColor(image),
BackgroundImageColor(image));
//Draw image
gxOff.DrawImage(image, imgRect, 0, 0, image.Width, image.Height,
GraphicsUnit.Pixel, imageAttr); 

}

if (bPushed) //The button was pressed
{
//Prepare rectangle
Rectangle rc = this.ClientRectangle;
rc.Width--;
rc.Height--;
//Draw rectangle
gxOff.DrawRectangle(new Pen(Color.Black), rc);
}

//Draw from the memory bitmap
e.Graphics.DrawImage(m_bmpOffscreen, 0, 0);

base.OnPaint(e);
}

  根据上面章节的提要,我们成功的按.NET Compact Framework的画图方法写下了这些代码。我们先建立好绘图对象的缓存,并尽可能的用双缓存来减少图像闪烁。我们用下面的函数来帮助识别背景色,使图像透明:

private Color BackgroundImageColor(Image image)
{
Bitmap bmp = new Bitmap(image);
return bmp.GetPixel(0, 0);
}

  上面的函数返加位图左上角的颜色。当在画按钮时,我们用bPushed标志判断按钮按下否。我们可以很容易重载OnMouseDown和OnMouseUp事件:

protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e )
{
bPushed = true;
this.Invalidate();
}

protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
{
bPushed = false;
this.Invalidate();
}

  五、用法

  可以很容易的新建一个ImageButton控件。把下面的少量代码添加到Form 结构中:

public Form1()
{
InitializeComponent();

imageButton1 = new ImageButton();
imageButton1.Image = new 
Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("ImageButtonProject.doorin2.gif"));
imageButton1.Location = new Point(30, 50);
imageButton1.Size = new Size(44, 34);
//Hook up into click event
imageButton1.Click+=new EventHandler(imageButton1_Click);
this.Controls.Add(imageButton1);
}

  我们添加doorin2.gif文件,同样可以在很容易用GetManifestResourceStream方法当前集合在项目的资源中。

用.NET Compact Framework创建图像按钮 
图二(第一个控件按下时)

  六、结论

  .NET Compact Framework并不像.NET Framework一样提供很多可用的图形和绘图函数。这是由于平台资源限制的缘故。不过,我们可以用一些自画技巧,在用户程序中建立大量丰富和可响应的图形。


  时间财富网为广大企业、商家、个人,提供平面设计、装修设计、建筑设计、起名改名、策划文案、网站建设、营销推广等服务。只要能通过网络解决的任务,都可以通过时间财富网来完成。若您有类似需要,请点击立即发布项目

  另,时间财富网上也有着各式各样的任务,无论您是拥有技能的专业人士,还是只剩时间的技术小白。都能在时间财富网上找到您能参与的项目。点击查看项目进入悬赏大厅