转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
Visual Basic.NET和GDI+共创图标编辑器         ★★★★

Visual Basic.NET和GDI+共创图标编辑器

作者:闵涛 文章来源:闵涛的学习笔记 点击数:828 更新时间:2009/4/23 14:59:42
  如果想自己设计一个个性独特的ico图片,然后让它成为如"我的电脑","回收站"这样的图标该怎么做?就只有用一些专门的画图工具。因为windows的的画图程序无法创建ico文件。于是本人利用.net和GDI+就编写了一个这样的画图工具。虽然现在有很多文章都介绍了GDI+技术,但都只是纯粹的GDI+的简单应用的介绍,至少我还没有看见一篇利用GDI+开发一个完整软件或程序片段的文章。

  这个程序实现了以下的功能:将BMP、JPG、jpeg、GIF、.png、.tiff文件转化成ico文件,可以对转化后的文件进行编辑;创建并编辑一个新的ico文件;对已有的ico文件进行编辑。所有被编辑的文件都保存为ico文件,可以在任何可使用ico文件的地方使用它们。

  我先说明一下什么是GDI+。GDI+ 是GDI(Windows 早期版本提供的图形设备接口)的后续版本,是Microsoft Windows XP操作系统即后续版本的图形显示技术。它已经集成到了.net开发环境中,所以不管你的OS是什么版本,只要安装了.NET框架,就有了GDI+(注意:是.net框架,而不是.net开发环境,所以win98中也可以使用GDI+)。当然它也提供了传统的api,可以由.net或非.net开发工具调用它。由于他和GDI的使用有很大的差别,所以要使用GDI+就必须从头学。GDI+要比GDI简单得多。

  现在就来看一下如何实现这个软件:先添加picturebox,0penfiledialog,savefiledialog,colordialog,domainupdown,label控件;然后添加两个菜单即它们的子菜单,添加的菜单如下"文件"菜单包括"新建","打开","保存","退出","功能"菜单包括"直线","选择颜色"代码如下,在代码后给出程序说明:

Public Class Form1
Inherits System.Windows.Forms.Form
Public imagepen, newbit, changiamge, mpen 'movepen,moveb,,grh,filenames,endpen
Dim xd, yd, xu, yu, pk, ps

Private Sub MenuItem9_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) 'Handles MenuItem9.Click
'新建一个ico文件,即"新建"菜单

 PictureBox1.Image = Nothing
 Dim bitnew As New System.Drawing.Bitmap(32, 32,
 Drawing.Imaging.PixelFormat.Format32bppArgb)'建立一个Bitmap对象,以便在它上面画图
 Dim x, y
 For x = 0 To 31
  For y = 0 To 31
   bitnew.SetPixel(x, y, Color.Transparent)'将Bitmap的背景设置为透明
  Next
 Next

 newbit = bitnew
 MenuItem3.Enabled = False'"选择颜色"菜单不可用
 MenuItem2.Enabled = True'"直线"菜单可用
End Sub

Private Sub MenuItem6_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)' Handles MenuItem6.Click
'打开图片文件即"打开"菜单"

 OpenFileDialog1.Filter = "ico文件(*.ico)|*.ico|图像文件
(*.BMP;*.JPG;*.jpeg;*.GIF;*.png;*.tiff)|*.BMP;*.JPG;*.jpeg;*.GIF;*.png;*.tiff"

 OpenFileDialog1.FilterIndex = 2
 OpenFileDialog1.ShowDialog()
 OpenFileDialog1.FileName = ""

End Sub

Private Sub MenuItem8_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) 'Handles MenuItem8.Click

 Me.Close()'退出

End Sub

Private Sub MenuItem7_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)

 'Handles MenuItem7.Click
 '保存文件,即"保存"对话筐

 PictureBox1.Cursor = System.Windows.Forms.Cursors.Default
 SaveFileDialog1.Filter = "ico文件(*.ico)|*.ico"'设置要保存的文件后缀
 SaveFileDialog1.ShowDialog()
 If SaveFileDialog1.FileName <> "" Then
  If Not SaveFileDialog1.ShowDialog.Cancel Then
   Dim bmp As New System.Drawing.Bitmap(PictureBox1.Image,
32,32)'从PictureBox1.Image初始化Bitmap,设置保存为图片的大小,标准ico图由
32*32和16*16两种格式组成,此处为32*32,你也可以设置为16*16

   Dim ico As System.Drawing.Icon = ico.FromHandle(bmp.GetHicon())
   '用Bitmap的句柄,初始化icon,他是专门处理ico文件的类
   Dim file As New System.IO.FileStream(SaveFileDialog1.FileName(),
   IO.FileMode.Create)'创建文件流
   ico.Save(file)'保存为ico文件
   file.Close()'关闭流
  End If
 End If
End Sub

Public Sub MenuItem2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)

 'Handles MenuItem2.Click
 '是用直线在新建的ico中画图

 PictureBox1.Cursor =System.Windows.Forms.Cursors.Cross
 '在PictureBox1中鼠标的样式

 ColorDialog1.ShowDialog()
 Dim pen As New Pen(ColorDialog1.Color, DomainUpDown1.Text())'创建画笔
 imagepen = pen

End Sub

Private Sub PictureBox1_MouseDown(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.MouseEventArgs)

 'Handles PictureBox1.MouseDown
 '当按下鼠标左键时获取直线的起点

 If e.Button = MouseButtons.Left Then
  xd = e.X / 8 : yd = e.Y / 8
 End If

End Sub

Private Sub PictureBox1_MouseUp(ByVal sender As System.Object,
ByVal e As System.Windows.Forms.MouseEventArgs)

 'Handles PictureBox1.MouseUp
 '画出直线
 If PictureBox1.Cursor Is System.Windows.Forms.Cursors.Cross And ps <> 1 Then
  xu = e.X : yu = e.Y
  Me.k(1, imagepen, yu / 8, xu / 8, xd, yd)
 Else
  If OpenFileDialog1.FilterIndex = 1 Then
   xu = e.X : yu = e.Y
   Me.k(2, mpen, yu / 8, xu / 8, xd, yd)
  End If
 End If
End Sub

Public Sub k(ByVal k As Integer, ByVal drawtool As Object,
ByVal x As Integer, ByVal y As Integer, ByVal xs As Integer,
ByVal ys As Integer)

 If k = 1 Then
  PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage'自动容纳图片
  PictureBox1.Image = newbit
  Dim Graphic As Graphics
  Graphic = Graphic.FromImage(Me.PictureBox1.Image)'在PictureBox1上画图
  Graphic.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias'锯齿削边
  Graphic.DrawLine(drawtool, y, x, xs, ys)'画线
 End If
  If k = 2 Then
   PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
   PictureBox1.Image = changiamge
   Dim Graphic As Graphics
   Graphic = Graphic.FromImage(Me.PictureBox1.Image)
   Graphic.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
   Graphic.DrawLine(drawtool, y, x, xs, ys)
  End If
End Sub

Private Sub MenuItem3_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)

 'Handles MenuItem3.Click
 '对打开的ico文件用直线画图

 ColorDialog1.ShowDialog()
 Dim m3pen As New Pen(ColorDialog1.Color, DomainUpDown1.Text())'建立画笔
 mpen = m3pen

End Sub

Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs)

 'Handles OpenFileDialog1.FileOk
 '打开文件

 If OpenFileDialog1.FilterIndex = 1 Then
  Dim m3pen As New Pen(Color.Black, DomainUpDown1.Text())
  mpen = m3pen
  MenuItem2.Enabled = False
  MenuItem3.Enabled = True
 Else
  MenuItem3.Enabled = False
  MenuItem2.Enabled = False
 End If

 If OpenFileDialog1.FileName <> "" Then
  PictureBox1.Cursor = System.Windows.Forms.Cursors.Default
  Dim images As New System.Drawing.Bitmap(OpenFileDialog1.FileName)
  changiamge = images
  PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
  PictureBox1.Image = images
  Me.Text = OpenFileDialog1.FileName
 End If

End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)

  'Handles MyBase.Load
  '由于刚运行次程序时,没有打开的ico文件和新建立的ico对象所以不可以创建画图工具对象

  MenuItem3.Enabled = False
  MenuItem2.Enabled = False

End Sub
End Class
  程序说明

  1. 如何新建ico文件:先初始化bitmap,然后在"功能"-》"直线"菜单代码中创建画笔,就可以开始画了。此时只是创建的一个bitmap对象,是我们在picturebox中画。画完后将bitmap对象保存到文件,就完成了新建ico的文件。

  2.如何打开已有的ico文件,并修改后保存它:判断打开的文件是否是ico,如果不是就只显示他,如果是就显示并且初始化一个画笔,通过"功能"-》"选择颜色"来改变画出直线的颜色和宽度,然后保存,就完成了对原来ico文件的修改。

  3.保存文件和对非ico文件转化为ico文件:通过打开文件,将非ico文件显示在picturebox中,在用picturebox.image初始化bitmap对象,此句的实际作用是将当前的picturebox.image内容附给bitmap。用bitmap的句柄初始icon对象(处理ico文件的对象),作用是将非ico文件转化为ico文件,建立文件流对象,在其中指定新文件名,和访问方法(文件流是save方法的参数)使用icon对象的save保存,最后关闭文件流。

  4.如何画:当完成1或2后,就可以开始画图,画图是由sub k过程,mouse-down,mouse-up来实现的。此时调用mouse-down获得直线的起点,在mouse-up中获得直线终点,接着在mouse-up 中调用sub k过中程绑定bitmap对象到picturebox的image属性,他的作用类似于有了一张可以画画的纸,并在sub k中用Graphic.FromImage(Me.PictureBox1.Image)语句创建Graphics对象,表示是在PictureBox1.Image的bitmap对象中画,而不是在PictureBox1上画,他们的区别在于前者是可以保存画画结果的,后者不可以。K的值表示是在新建的ico文件中画还是修改以有的ico文件(k=2是表示修改已有的ico文件)

  5.一些语句说明:dim pen …是指用钢笔来画,object.rawline(….)表示画直线,

  6.文件格式的转换问题:你可以使用image对象的save的方法来转换图象的格式,但是我发现虽然他提供了icon格式,但转化后不是ico文件,而是png文件。从网上的资料显示这是.net的本身问题。顺便提一下image对象无构造函数,他虽然标为必须继承才可使用,但实际上不行,如要使用它要用他的fromfile或fromstream方法来构造它。

  7.关于k的问题:当你看懂这篇文章后你一定会提出为什么在每条分支中的PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage,PictureBox1.Image = changiamge这两句代码不可以与它后面的代码分开放在其他地方,如k=1时放在"新建"菜单中的代码部分,k=2是放在mouseup中的else后的if语句中!其实这两句就是我在编写这个程序时遇到的最大的难题,我用了两个小时才的出这两句代码要放在了现在的位置。最后看资料并与朋友探讨后得出3个结论:

  1. .NET本身问题。

  2.如果分开使PictureBox1.Image对象丢失(PictureBox1.Image返回的是bitmap对象),无法绑定到Graphics。

  3. PictureBox1.Image对象在sub k中不可见。虽然我不知道那个结论是对的,但我将它写了出来,仅供参考。

  对于程序中的0penfiledialog,savefiledialog,colordialog,domainupdown,文件流的使用请见msdn。这5个只是为了辅助这个程序而使用的,如果要在这里讲清楚那这片文章就太长了,而且这些的使用很简单。我在程序中使用的画图工具是钢笔,画出的图形是直线,这队ico文件已经够有了,如果你想使用其他工具,画其他图形,只要修改"功能"中的子菜单,和sub k代码就够了。

  运行如图:



  更换后的"我的电脑"图标



[系统软件]Visual Studio 2005 Express Beta Products 下载链…  [系统软件]Visual FoxPro9.0中扩展报表系统功能
[系统软件]Visual FoxPro:我是旁观者  [系统软件]Visual Studio 2005 Express Editions Beta 2 下载…
[系统软件]Boost库在XP+Visual C++.net中的安装  [系统软件]Visual Studio 2005 Express Edition 正式版下载地…
[常用软件]Visual Foxpro通用报表打印程序  [常用软件]Visual FoxPro 6.0与大型数据库的无数据源连接
[常用软件]Visual Foxpro 的一个BUG  [VB.NET程序]Visual Basic 6 逆向工程与反逆向工程 (2)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台