熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Visual Basic.NET和GDI+共創圖標編輯器

2013-11-13 09:55:45  來源: .NET編程 
如果想自己設計一個個性獨特的ico圖片然後讓它成為如我的電腦回收站這樣的圖標該怎麼做?就只有用一些專門的畫圖工具因為Windows的的畫圖程序無法創建ico文件於是本人利和GDI+就編寫了一個這樣的畫圖工具雖然現在有很多文章都介紹了GDI+技術但都只是純粹的GDI+的簡單應用的介紹至少我還沒有看見一篇利用GDI+開發一個完整軟件或程序片段的文章

  這個程序實現了以下的功能將BMPJPGjpegGIFpngtiff文件轉化成ico文件可以對轉化後的文件進行編輯創建並編輯一個新的ico文件對已有的ico文件進行編輯所有被編輯的文件都保存為ico文件可以在任何可使用ico文件的地方使用它們

  我先說明一下什麼是GDI+GDI+ 是GDI(Windows 早期版本提供的圖形設備接口)的後續版本是Microsoft Windows XP操作系統即後續版本的圖形顯示技術它已經集成到開發環境中所以不管你的OS是什麼版本只要安裝了NET框架就有了GDI+(注意框架而不開發環境所以win中也可以使用GDI+)當然它也提供了傳統的api可以或開發工具調用它由於他和GDI的使用有很大的差別所以要使用GDI+就必須從頭學GDI+要比GDI簡單得多

  現在就來看一下如何實現這個軟件先添加pictureboxpenfiledialogsavefiledialogcolordialogdomainupdownlabel控件然後添加兩個菜單即它們的子菜單添加的菜單如下文件菜單包括新建打開保存退出功能菜單包括直線選擇顏色代碼如下在代碼後給出程序說明

Public Class Form
Inherits SystemWindowsFormsForm
Public imagepen newbit changiamge mpen movepenmovebgrhfilenamesendpen
Dim xd yd xu yu pk ps

Private Sub MenuItem_Click(ByVal sender As SystemObject
ByVal e As SystemEventArgs) Handles MenuItemClick
新建一個ico文件新建菜單

 PictureBoxImage = Nothing
 Dim bitnew As New SystemDrawingBitmap(
 DrawingImagingPixelFormatFormatbppArgb)建立一個Bitmap對象以便在它上面畫圖
 Dim x y
 For x = To
  For y = To
   bitnewSetPixel(x y ColorTransparent)將Bitmap的背景設置為透明
  Next
 Next

 newbit = bitnew
 MenuItemEnabled = False選擇顏色菜單不可用
 MenuItemEnabled = True直線菜單可用
End Sub

Private Sub MenuItem_Click(ByVal sender As SystemObject
ByVal e As SystemEventArgs) Handles MenuItemClick
打開圖片文件即打開菜單

 OpenFileDialogFilter = ico文件(*ico)|*ico|圖像文件
(*BMP;*JPG;*jpeg;*GIF;*png;*tiff)|*BMP;*JPG;*jpeg;*GIF;*png;*tiff

 OpenFileDialogFilterIndex =
 OpenFileDialogShowDialog()
 OpenFileDialogFileName =

End Sub

Private Sub MenuItem_Click(ByVal sender As SystemObject
ByVal e As SystemEventArgs) Handles MenuItemClick

 MeClose()退出

End Sub

Private Sub MenuItem_Click(ByVal sender As SystemObject
ByVal e As SystemEventArgs)

 Handles MenuItemClick
 保存文件保存對話筐

 PictureBoxCursor = SystemWindowsFormsCursorsDefault
 SaveFileDialogFilter = ico文件(*ico)|*ico設置要保存的文件後綴
 SaveFileDialogShowDialog()
 If SaveFileDialogFileName <> Then
  If Not SaveFileDialogShowDialogCancel Then
   Dim bmp As New SystemDrawingBitmap(PictureBoxImage
)從PictureBoxImage初始化Bitmap設置保存為圖片的大小標准ico圖由
**兩種格式組成此處為*你也可以設置為*

   Dim ico As SystemDrawingIcon = icoFromHandle(bmpGetHicon())
   用Bitmap的句柄初始化icon他是專門處理ico文件的類
   Dim file As New SystemIOFileStream(SaveFileDialogFileName()
   IOFileModeCreate)創建文件流
   icoSave(file)保存為ico文件
   fileClose()關閉流
  End If
 End If
End Sub

Public Sub MenuItem_Click(ByVal sender As SystemObject
ByVal e As SystemEventArgs)

 Handles MenuItemClick
 是用直線在新建的ico中畫圖

 PictureBoxCursor =SystemWindowsFormsCursorsCross
 在PictureBox中鼠標的樣式

 ColorDialogShowDialog()
 Dim pen As New Pen(ColorDialogColor DomainUpDownText())創建畫筆
 imagepen = pen

End Sub

Private Sub PictureBox_MouseDown(ByVal sender As SystemObject
ByVal e As SystemWindowsFormsMouseEventArgs)

 Handles PictureBoxMouseDown
 當按下鼠標左鍵時獲取直線的起點

 If eButton = MouseButtonsLeft Then
  xd = eX / : yd = eY /
 End If

End Sub

Private Sub PictureBox_MouseUp(ByVal sender As SystemObject
ByVal e As SystemWindowsFormsMouseEventArgs)

 Handles PictureBoxMouseUp
 畫出直線
 If PictureBoxCursor Is SystemWindowsFormsCursorsCross And ps <> Then
  xu = eX : yu = eY
  Mek( imagepen yu / xu / xd yd)
 Else
  If OpenFileDialogFilterIndex = Then
   xu = eX : yu = eY
   Mek( mpen yu / xu / 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 = Then
  PictureBoxSizeMode = PictureBoxSizeModeStretchImage自動容納圖片
  PictureBoxImage = newbit
  Dim Graphic As Graphics
  Graphic = GraphicFromImage(MePictureBoxImage)在PictureBox上畫圖
  GraphicSmoothingMode = DrawingDrawingDSmoothingModeAntiAlias鋸齒削邊
  GraphicDrawLine(drawtool y x xs ys)畫線
 End If
  If k = Then
   PictureBoxSizeMode = PictureBoxSizeModeStretchImage
   PictureBoxImage = changiamge
   Dim Graphic As Graphics
   Graphic = GraphicFromImage(MePictureBoxImage)
   GraphicSmoothingMode = DrawingDrawingDSmoothingModeAntiAlias
   GraphicDrawLine(drawtool y x xs ys)
  End If
End Sub

Private Sub MenuItem_Click(ByVal sender As SystemObject
ByVal e As SystemEventArgs)

 Handles MenuItemClick
 對打開的ico文件用直線畫圖

 ColorDialogShowDialog()
 Dim mpen As New Pen(ColorDialogColor DomainUpDownText())建立畫筆
 mpen = mpen

End Sub

Private Sub OpenFileDialog_FileOk(ByVal sender As Object ByVal e As
SystemComponentModelCancelEventArgs)

 Handles OpenFileDialogFileOk
 打開文件

 If OpenFileDialogFilterIndex = Then
  Dim mpen As New Pen(ColorBlack DomainUpDownText())
  mpen = mpen
  MenuItemEnabled = False
  MenuItemEnabled = True
 Else
  MenuItemEnabled = False
  MenuItemEnabled = False
 End If

 If OpenFileDialogFileName <> Then
  PictureBoxCursor = SystemWindowsFormsCursorsDefault
  Dim images As New SystemDrawingBitmap(OpenFileDialogFileName)
  changiamge = images
  PictureBoxSizeMode = PictureBoxSizeModeStretchImage
  PictureBoxImage = images
  MeText = OpenFileDialogFileName
 End If

End Sub

Private Sub Form_Load(ByVal sender As Object ByVal e As SystemEventArgs)

  Handles MyBaseLoad
  由於剛運行次程序時沒有打開的ico文件和新建立的ico對象所以不可以創建畫圖工具對象

  MenuItemEnabled = False
  MenuItemEnabled = False

End Sub
End Class
程序說明

  . 如何新建ico文件先初始化bitmap然後在功能直線菜單代碼中創建畫筆就可以開始畫了此時只是創建的一個bitmap對象是我們在picturebox中畫畫完後將bitmap對象保存到文件就完成了新建ico的文件

  如何打開已有的ico文件並修改後保存它判斷打開的文件是否是ico如果不是就只顯示他如果是就顯示並且初始化一個畫筆通過功能選擇顏色來改變畫出直線的顏色和寬度然後保存就完成了對原來ico文件的修改

  保存文件和對非ico文件轉化為ico文件通過打開文件將非ico文件顯示在picturebox中在用pictureboximage初始化bitmap對象此句的實際作用是將當前的pictureboximage內容附給bitmap用bitmap的句柄初始icon對象(處理ico文件的對象)作用是將非ico文件轉化為ico文件建立文件流對象在其中指定新文件名和訪問方法(文件流是save方法的參數)使用icon對象的save保存最後關閉文件流

  如何畫當完成就可以開始畫圖畫圖是由sub k過程mousedownmouseup來實現的此時調用mousedown獲得直線的起點在mouseup中獲得直線終點接著在mouseup 中調用sub k過中程綁定bitmap對象到picturebox的image屬性他的作用類似於有了一張可以畫畫的紙並在sub k中用GraphicFromImage(MePictureBoxImage)語句創建Graphics對象表示是在PictureBoxImage的bitmap對象中畫而不是在PictureBox上畫他們的區別在於前者是可以保存畫畫結果的後者不可以K的值表示是在新建的ico文件中畫還是修改以有的ico文件(k=是表示修改已有的ico文件)

  一些語句說明dim pen …是指用鋼筆來畫objectrawline(…)表示畫直線

  文件格式的轉換問題你可以使用image對象的save的方法來轉換圖象的格式但是我發現雖然他提供了icon格式但轉化後不是ico文件而是png文件從網上的資料顯示這的本身問題順便提一下image對象無構造函數他雖然標為必須繼承才可使用但實際上不行如要使用它要用他的fromfile或fromstream方法來構造它

  .關於k的問題當你看懂這篇文章後你一定會提出為什麼在每條分支中的PictureBoxSizeMode = PictureBoxSizeModeStretchImagePictureBoxImage = changiamge這兩句代碼不可以與它後面的代碼分開放在其他地方如k=時放在新建菜單中的代碼部分k=是放在mouseup中的else後的if語句中!其實這兩句就是我在編寫這個程序時遇到的最大的難題我用了兩個小時才的出這兩句代碼要放在了現在的位置最後看資料並與朋友探討後得出結論

   NET本身問題

  如果分開使PictureBoxImage對象丟失(PictureBoxImage返回的是bitmap對象)無法綁定到Graphics

   PictureBoxImage對象在sub k中不可見雖然我不知道那個結論是對的但我將它寫了出來僅供參考

  對於程序中的penfiledialogsavefiledialogcolordialogdomainupdown文件流的使用請見msdn個只是為了輔助這個程序而使用的如果要在這裡講清楚那這片文章就太長了而且這些的使用很簡單我在程序中使用的畫圖工具是鋼筆畫出的圖形是直線這隊ico文件已經夠有了如果你想使用其他工具畫其他圖形只要修改功能中的子菜單和sub k代碼就夠了

  運行如圖

  



  更換後的我的電腦圖標

  


From:http://tw.wingwit.com/Article/program/net/201311/12005.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.