如果想自己設計一個個性獨特的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
Form
Public imagepen
newbit
changiamge
mpen
movepen
moveb
grh
filenames
endpen
Dim xd
yd
xu
yu
pk
ps
Private 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 Sub
Private 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 Sub
Private Sub MenuItem
_Click(ByVal sender As System
Object
ByVal e As System
EventArgs)
Handles MenuItem
Click
Me
Close()
退出
End Sub
Private 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 If
End Sub
Public 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 = pen
End Sub
Private 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 If
End Sub
Private 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 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
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 If
End Sub
Private 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
pen
End Sub
Private 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 If
End Sub
Private Sub Form
_Load(ByVal sender As Object
ByVal e As System
EventArgs)
Handles MyBase
Load
由於剛運行次程序時
沒有打開的ico文件和新建立的ico對象所以不可以創建畫圖工具對象
MenuItem
Enabled = False
MenuItem
Enabled = False
End Sub
End 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代碼就夠了
運行如圖
更換後的
我的電腦
圖標
From:http://tw.wingwit.com/Article/program/net/201311/12005.html