知识大全 Visual Basic.NET和GDI+共创图标编辑器

Posted 文件

篇首语:大鹏一日同风起,扶摇直上九万里。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Visual Basic.NET和GDI+共创图标编辑器相关的知识,希望对你有一定的参考价值。

Visual Basic.NET和GDI+共创图标编辑器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

如果想自己设计一个个性独特的ico图片 然后让它成为如 我的电脑 回收站 这样的图标该怎么做?就只有用一些专门的画图工具 因为Windows的的画图程序无法创建ico文件 于是本人利和GDI+就编写了一个这样的画图工具 虽然现在有很多文章都介绍了GDI+技术 但都只是纯粹的GDI+的简单应用的介绍 至少我还没有看见一篇利用GDI+开发一个完整软件或程序片段的文章   这个程序实现了以下的功能 将BMP JPG jpeg GIF png tiff文件转化成ico文件 可以对转化后的文件进行编辑 创建并编辑一个新的ico文件 对已有的ico文件进行编辑 所有被编辑的文件都保存为ico文件 可以在任何可使用ico文件的地方使用它们   我先说明一下什么是GDI+ GDI+ 是GDI(Windows 早期版本提供的图形设备接口)的后续版本 是Microsoft Windows XP操作系统即后续版本的图形显示技术 它已经集成到开发环境中 所以不管你的OS是什么版本 只要安装了 NET框架 就有了GDI+(注意 框架 而不开发环境 所以win 中也可以使用GDI+) 当然它也提供了传统的api 可以或开发工具调用它 由于他和GDI的使用有很大的差别 所以要使用GDI+就必须从头学 GDI+要比GDI简单得多   现在就来看一下如何实现这个软件 先添加picturebox penfiledialog savefiledialog colordialog domainupdown label控件 然后添加两个菜单即它们的子菜单 添加的菜单如下 文件 菜单包括 新建 打开 保存 退出 功能 菜单包括 直线 选择颜色 代码如下 在代码后给出程序说明 Public Class Form Inherits System Windows Forms FormPublic imagepen newbit changiamge mpen movepen moveb grh filenames endpenDim xd yd xu yu pk psPrivate Sub MenuItem _Click(ByVal sender As System Object ByVal e As System EventArgs) Handles MenuItem Click 新建一个ico文件 即 新建 菜单 PictureBox Image = Nothing Dim bitnew As New System Drawing Bitmap(  Drawing Imaging PixelFormat Format bppArgb) 建立一个Bitmap对象 以便在它上面画图 Dim x y For x = To   For y = To    bitnew SetPixel(x y Color Transparent) 将Bitmap的背景设置为透明  Next Next newbit = bitnew MenuItem Enabled = False 选择颜色 菜单不可用 MenuItem Enabled = True 直线 菜单可用End SubPrivate Sub MenuItem _Click(ByVal sender As System Object ByVal e As System EventArgs) Handles MenuItem Click 打开图片文件即 打开 菜单  OpenFileDialog Filter = ico文件(* ico)|* ico|图像文件 (* BMP;* JPG;* jpeg;* GIF;* png;* tiff)|* BMP;* JPG;* jpeg;* GIF;* png;* tiff  OpenFileDialog FilterIndex =  OpenFileDialog ShowDialog() OpenFileDialog FileName = End SubPrivate Sub MenuItem _Click(ByVal sender As System Object ByVal e As System EventArgs) Handles MenuItem Click Me Close() 退出End SubPrivate Sub MenuItem _Click(ByVal sender As System Object ByVal e As System EventArgs)  Handles MenuItem Click  保存文件 即 保存 对话筐 PictureBox Cursor = System Windows Forms Cursors Default SaveFileDialog Filter = ico文件(* ico)|* ico 设置要保存的文件后缀 SaveFileDialog ShowDialog() If SaveFileDialog FileName <> Then  If Not SaveFileDialog ShowDialog Cancel Then   Dim bmp As New System Drawing Bitmap(PictureBox Image ) 从PictureBox Image初始化Bitmap 设置保存为图片的大小 标准ico图由 * 和 * 两种格式组成 此处为 * 你也可以设置为 *    Dim ico As System Drawing Icon = ico FromHandle(bmp GetHicon())    用Bitmap的句柄 初始化icon 他是专门处理ico文件的类   Dim file As New System IO FileStream(SaveFileDialog FileName()    IO FileMode Create) 创建文件流   ico Save(file) 保存为ico文件   file Close() 关闭流  End If End IfEnd SubPublic Sub MenuItem _Click(ByVal sender As System Object ByVal e As System EventArgs)  Handles MenuItem Click  是用直线在新建的ico中画图 PictureBox Cursor =System Windows Forms Cursors Cross  在PictureBox 中鼠标的样式 ColorDialog ShowDialog() Dim pen As New Pen(ColorDialog Color DomainUpDown Text()) 创建画笔 imagepen = penEnd SubPrivate Sub PictureBox _MouseDown(ByVal sender As System Object ByVal e As System Windows Forms MouseEventArgs)  Handles PictureBox MouseDown  当按下鼠标左键时获取直线的起点  If e Button = MouseButtons Left Then  xd = e X / : yd = e Y /  End IfEnd SubPrivate Sub PictureBox _MouseUp(ByVal sender As System Object ByVal e As System Windows Forms MouseEventArgs)  Handles PictureBox MouseUp  画出直线 If PictureBox Cursor Is System Windows Forms Cursors Cross And ps <> Then  xu = e X : yu = e Y  Me k( imagepen yu / xu / xd yd) Else  If OpenFileDialog FilterIndex = Then   xu = e X : yu = e Y   Me k( mpen yu / xu / xd yd)  End If End IfEnd SubPublic 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 = Then  PictureBox SizeMode = PictureBoxSizeMode StretchImage 自动容纳图片  PictureBox Image = newbit  Dim Graphic As Graphics  Graphic = Graphic FromImage(Me PictureBox Image) 在PictureBox 上画图  Graphic SmoothingMode = Drawing Drawing D SmoothingMode AntiAlias 锯齿削边  Graphic DrawLine(drawtool y x xs ys) 画线 End If  If k = Then   PictureBox SizeMode = PictureBoxSizeMode StretchImage   PictureBox Image = changiamge   Dim Graphic As Graphics   Graphic = Graphic FromImage(Me PictureBox Image)   Graphic SmoothingMode = Drawing Drawing D SmoothingMode AntiAlias   Graphic DrawLine(drawtool y x xs ys)  End IfEnd SubPrivate Sub MenuItem _Click(ByVal sender As System Object ByVal e As System EventArgs)  Handles MenuItem Click  对打开的ico文件用直线画图 ColorDialog ShowDialog() Dim m pen As New Pen(ColorDialog Color DomainUpDown Text()) 建立画笔 mpen = m penEnd SubPrivate Sub OpenFileDialog _FileOk(ByVal sender As Object ByVal e As System ComponentModel CancelEventArgs)   Handles OpenFileDialog FileOk  打开文件 If OpenFileDialog FilterIndex = Then  Dim m pen As New Pen(Color Black DomainUpDown Text())  mpen = m pen  MenuItem Enabled = False  MenuItem Enabled = True Else  MenuItem Enabled = False  MenuItem Enabled = False End If If OpenFileDialog FileName <> Then  PictureBox Cursor = System Windows Forms Cursors Default  Dim images As New System Drawing Bitmap(OpenFileDialog FileName)  changiamge = images  PictureBox SizeMode = PictureBoxSizeMode StretchImage  PictureBox Image = images  Me Text = OpenFileDialog FileName End IfEnd SubPrivate Sub Form _Load(ByVal sender As Object ByVal e As System EventArgs)    Handles MyBase Load   由于刚运行次程序时 没有打开的ico文件和新建立的ico对象所以不可以创建画图工具对象  MenuItem Enabled = False  MenuItem Enabled = FalseEnd SubEnd Class 程序说明    . 如何新建ico文件 先初始化bitmap 然后在 功能 》 直线 菜单代码中创建画笔 就可以开始画了 此时只是创建的一个bitmap对象 是我们在picturebox中画 画完后将bitmap对象保存到文件 就完成了新建ico的文件    如何打开已有的ico文件 并修改后保存它 判断打开的文件是否是ico 如果不是就只显示他 如果是就显示并且初始化一个画笔 通过 功能 》 选择颜色 来改变画出直线的颜色和宽度 然后保存 就完成了对原来ico文件的修改    保存文件和对非ico文件转化为ico文件 通过打开文件 将非ico文件显示在picturebox中 在用picturebox image初始化bitmap对象 此句的实际作用是将当前的picturebox image内容附给bitmap 用bitmap的句柄初始icon对象(处理ico文件的对象) 作用是将非ico文件转化为ico文件 建立文件流对象 在其中指定新文件名 和访问方法(文件流是save方法的参数)使用icon对象的save保存 最后关闭文件流    如何画 当完成 或 后 就可以开始画图 画图是由sub k过程 mouse down mouse up来实现的 此时调用mouse down获得直线的起点 在mouse up中获得直线终点 接着在mouse up 中调用sub k过中程绑定bitmap对象到picturebox的image属性 他的作用类似于有了一张可以画画的纸 并在sub k中用Graphic FromImage(Me PictureBox Image)语句创建Graphics对象 表示是在PictureBox Image的bitmap对象中画 而不是在PictureBox 上画 他们的区别在于前者是可以保存画画结果的 后者不可以 K的值表示是在新建的ico文件中画还是修改以有的ico文件(k= 是表示修改已有的ico文件)    一些语句说明 dim pen …是指用钢笔来画 object rawline(… )表示画直线    文件格式的转换问题 你可以使用image对象的save的方法来转换图象的格式 但是我发现虽然他提供了icon格式 但转化后不是ico文件 而是png文件 从网上的资料显示这的本身问题 顺便提一下image对象无构造函数 他虽然标为必须继承才可使用 但实际上不行 如要使用它要用他的fromfile或fromstream方法来构造它    .关于k的问题 当你看懂这篇文章后你一定会提出为什么在每条分支中的PictureBox SizeMode = PictureBoxSizeMode StretchImage PictureBox Image = changiamge这两句代码不可以与它后面的代码分开放在其他地方 如k= 时放在 新建 菜单中的代码部分 k= 是放在mouseup中的else后的if语句中!其实这两句就是我在编写这个程序时遇到的最大的难题 我用了两个小时才的出这两句代码要放在了现在的位置 最后看资料并与朋友探讨后得出 个 结论    NET本身问题    如果分开使PictureBox Image对象丢失(PictureBox Image返回的是bitmap对象) 无法绑定到Graphics    PictureBox Image对象在sub k中不可见 虽然我不知道那个结论是对的 但我将它写了出来 仅供参考   对于程序中的 penfiledialog savefiledialog colordialog domainupdown 文件流的使用请见msdn 这 个只是为了辅助这个程序而使用的 如果要在这里讲清楚那这片文章就太长了 而且这些的使用很简单 我在程序中使用的画图工具是钢笔 画出的图形是直线 这队ico文件已经够有了 如果你想使用其他工具 画其他图形 只要修改 功能 中的子菜单 和sub k代码就够了   运行如图

  

  更换后的 我的电脑 图标 cha138/Article/program/net/201311/12005

相关参考

知识大全 实战Visual Basic.Net对话框

实战VisualBasic.Net对话框  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对话框和

知识大全 Visual Basic.Net基本语句

VisualBasic.Net基本语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Try…

知识大全 Visual Basic.Net实现TCP协议

VisualBasic.Net实现TCP协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!TCP协

知识大全 使用Visual Basic.NET重载事件处理程序

使用VisualBasic.NET重载事件处理程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Visual Basic.NET中组件的叠加使用

VisualBasic.NET中组件的叠加使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  状

知识大全 Visual Basic .Net打造个性化菜单

VisualBasic.Net打造个性化菜单  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  菜单

知识大全 使用 Visual Basic .NET 访问注册表

使用VisualBasic.NET访问注册表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!使用Vi

知识大全 一步一步创建Visual Basic .NET 控件

一步一步创建VisualBasic.NET控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!我从来

知识大全 Visual Basic.Net引人注目的语言革新

VisualBasic.Net引人注目的语言革新  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 在Visual Basic.NET使用ADO访问数据库

在VisualBasic.NET使用ADO访问数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!