我的图标我来存──利用VB制作图标提取程序

软件世界

  前言:在电脑的世界里,图标是一种重要而有趣的资源。对于软件开发者,在编制程序时常会用到它。而对于一般的电脑用户,更是要和图标频繁地打交道。比如在《电脑报》第43期E3版介绍的软件《IE按钮助手》就需要用户自己准备漂亮的图标文件。像这样的应用场合在日常使用电脑中还会碰到很多很多。这需要我们平时就注意对漂亮图标的收集。

  本文就将介绍使用VB编写图标提取程序,方便大家对图标资源的积累,心动了吗?让我们马上动手吧。

  一、界面设计

  首先,虽然是做一个很简单的程序,我们也要制作一个方便操作的界面。在新建的窗体中,我们要放置以下控件:标签控件lblNum,用于显示图标的数量;图片框picIcon,用于显示提取出的图标;垂直滚动条VScroll1,用于在图标中进行切换;对话框控件dlg,用于打开和保存图标;按钮cmdOpen,cmdSave。控件的摆放位置如图:

  二、代码编写

  有了一个简单的界面后,接下来的工作自然是要编写代码了。由于前面已经设计了思路明确的界面,下面的工作也就比较简单了。我们会先介绍窗体模块中的代码,为程序打好基础,然后依次介绍打开和保存按钮以及滚动条代码的编写,从而顺利完成整个程序的编制。

  先来看看窗体模块中的代码:

  Option Explicit

  Dim lIcon As Long '图标句柄

  Dim sSourcePgm As String

  Dim sDestFile As String

  'API函数声明,为后面的函数调用做准备

  Private Declare Function ExtractIcon Lib “shell32.dll” Alias “ExtractIconA” (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long

  Private Declare Function DrawIcon Lib “user32” (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long

  Private Declare Function DestroyIcon Lib “user32” (ByVal hIcon As Long) As Long

  然后,我们要为打开按钮编写代码,使用户在点击打开按钮后,程序弹出对话框让用户选择exe或dll文件,然后检测选择的文件所包含的图标数量,最后将第一个图标显示出来。

  下面是具体的打开按钮的代码:

  Private Sub cmdOpen_Click()

  '打开按钮代码

  Dim lCount As Long '用于记录图标数量

  On Error Resume Next

  With dlg

  .FileName = sSourcePgm

  .CancelError = True

  .DialogTitle = “选择文件”

  .Filter = “Icon Resources (*.ico;*.exe;*.dll)|*.ico;*.exe;*.dll|All files|*.*” '设置可以打开的文件类型

  .Action = 1

  If Err Then '用户点击取消按钮则退出过程

  Err.Clear

  Exit Sub

  End If

  sSourcePgm = .FileName '获取打开的文件名

  DestroyIcon lIcon

  Do

  lIcon = ExtractIcon(App.hInstance, sSourcePgm, lCount) '检测第lCount个图标是否存在,不存在返回值为0

  If lIcon = 0 Then Exit Do '如果图标不存在则退出循环

  lCount = lCount + 1

  DestroyIcon lIcon

  Loop

  If lCount = 0 Then

  MsgBox “此文件不包含图标”

  End If

  lblNum.Caption = lCount & IIf(lCount = 1, “ Image”, “ Images”) '显示图标数量

  VScroll1.Max = IIf(lCount = 0, 0, lCount - 1) '将滚动条的最大值设置为图标数量

  VScroll1.Value = 0 '设置滚动条当前图标为第一个

  VScroll1_Change '显示第一个图标

  End With

  End Sub

  小提示:图标以资源的方式保存在exe或dll文件中,并不是每个exe或dll文件都包含图标资源,所以我们要用程序进行筛选。lCount用于记录图标个数,如果图标存在,lCount的值从1开始,而滚动条的值则从0开始,因此最大值要设置为lCount-1。

  下面,我们为保存按钮编写代码。在这段代码中,我们使用SavePicture函数将图片框当前的图标保存为图标文件。

  来看看保存按钮的具体代码:

  Private Sub cmdSave_Click()

  '保存按钮代码

  On Error Resume Next

  With dlg

  .FileName = sDestFile

  .CancelError = True

  .Filter = “Icon Resources (*.ico)|*.ico” '设置保存的扩展名

  .Action = 2

  If Err Then '用户点击取消按钮则退出过程

  Err.Clear

  Exit Sub

  End If

  sDestFile = .FileName '获得保存的文件名

  SavePicture picIcon.Image, sDestFile '保存图标

  End With

  End Sub

  最后,我们为滚动条编写代码,这样,在用户滑动滚动条时,程序将提取滚动条当前值所对应的图标。

  以下是滚动条的具体代码:

  Private Sub VScroll1_Change()

  '滚动条代码

  DestroyIcon lIcon

  picIcon.Cls '清除当前显示的图标

  lIcon = ExtractIcon(App.hInstance, sSourcePgm, VScroll1.Value) '提取图标并获取其句柄

  picIcon.AutoSize = True

  picIcon.AutoRedraw = True

  DrawIcon picIcon.hdc, 0, 0, lIcon '将图标画在picIcon上

  picIcon.Refresh

  End Sub

  三、代码解析

  程序使用ExtractIcon这个函数来提取图标。lCount变量用于记录当前提取的图标的位置。在循环中,随着lCount变量递增,程序不断试着提取图标,直到ExtractIcon返回值为0,表示无法再找到可用的图标,这时lCount的值为图标的个数。然后初始化滚动条的值并激活VScroll1_Change事件显示第一个图标。以后,每次VScroll1_Change事件被激活,程序都会调用ExtractIcon函数提取图标,获取句柄,然后使用DrawIcon函数将图标画在图片框中。

  运行程序,我们便可以从EXE或DLL文件中提取图标了。有了这个程序,我们可以大大节省自己制作图标的时间。以后再发现心仪的图标的时候,马上就可以把它保存下来,是不是有一种自己是图标主人的感觉呢?(以上代码在Visual Basic 6.0中实现,Windows 2000中调试成功)