AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VB编程

用Visual Basic轻松实现看图软件

51自学网 http://www.wanshiok.com
  一、 前言

  在日常的工作或学习中,像一些常用的工具是必不可少的。比如ACDsee,WinRAR等等。其实在VB中就可以很容易地实现像ACDsee这样的一些基本看图功能,用着自己编写的看图软件,感觉是不是非常棒?!好了,言归正传,现在就开始编写吧!

  二、分析与实现

  编写之前,首先把一些重要的实现功能思考一下。明白了原理,做其他类似的程序,应该是轻车熟路了。

  1) 在选择的目录中过滤出图片格式的文件(gif,jpg,bmp,ico等)功能:

  VB中自带的DriveListBox,DirListBox,FileListBox控件组合就可以轻易的实现上述功能,将FileListBox的Pattern属性设置为*.jpg;*.bmp;*.ico;*.gif即可,这样FileListBox中只显示Pattern属性设定好的扩展名所对应的图片文件。

  2) 将当前目录下的图片按分页的方式显示功能:

  关于显示图片的控件问题,其实用VB自带的Image控件就可以了。对于如何实现分页的问题,就需要按照自定义的显示图片数量/页(本程序定义为25张图片/页),动态生成Image控件组,然后将目录中的图片以缩放预览的方式显示出来,具体实现参见后面的代码。

  以上两个问题解决了,基本功能应该可以实现了。下面就是具体的实现步骤:

  a) 主窗体设计

  主窗体布局采用流行的T型框架,上方包括菜单及常用工具栏,左侧显示目录结构树,右侧为显示图片区域(图片预览区),下方为状态栏,用来显示简单的图片信息。下表是用到的部分控件列表:

控件名控件类型标题说明
Command1(1)CommandButton上一页预览上一页图片
Command1(0)CommandButton下一页预览下一页图片
Picture1PictureBox 用来装入预览控件组的容器控件
Image1(0)Image 显示图片控件
Drive1DriveListBox 显示当前系统的磁盘列表
Dir1DirListBox 显示当前磁盘的目录列表
File1FileListBox 显示当前目录的图片格式文件列表

  b) 代码实现

  通过以下一段代码将驱动器列表控件、目录列表控件、文件列表控件联系起来。

Private Sub Dir1_Change()
 File1.Path = Dir1.Path
End Sub

Private Sub Drive1_Change()
 Dir1.Path = Drive1.Drive
 Call InitShowPic
End Sub


Private Sub File1_PathChange() ‘当文件列表发生变化时重新显示图片
 Call InitShowPic
End Sub

  其中InitShowPic是自定义函数,用来显示当前目录下的第一页图片。主窗体初始化时,需要先将显示图片的Image控件组动态创建,以下就是创建代码:

Private Sub Form_Load()
 Dim i, j As Integer
 For i = 1 To 24 ‘动态创建24个Image控件
  Load Image1(i) ‘动态创建Image控件
  Image1(i).Visible = True ‘显示此控件
 Next

 Drive1.Drive = "c:" ‘默认驱动器为C:
 Dir1.Path = "c:/"
 Picture1.DrawWidth = 3
 For i = 1 To 4 ‘在Picture画线将Image控件组以5×5排列
  Picture1.Line (0, i * (Picture1.Height / 5) - 30)-(Picture1.Width, i * (Picture1.Height / 5) - 30), &H80000003

  Picture1.Line (i * (Picture1.Width / 5) - 30, 0)-(i * (Picture1.Width / 5) - 30, Picture1.Height), &H80000003
 Next

 For i = 0 To 4
  For j = 0 To 4
   Image1(i * 5 + j).Left = j * (Picture1.Width / 5) + 50
   Image1(i * 5 + j).Top = i * (Picture1.Height / 5) + 50
  Next
 Next
 currindex = -1 ‘当前选择图片的索引为-1表示没有选择图片
End Sub


Private Sub InitShowPic() ‘显示当前目录的第一页图片(1到25)
 Dim i As Integer
 For i = 0 To 24 ‘所有Image控件不显示图片
  Image1(i).Picture = LoadPicture("")
  Image1(i).ToolTipText = ""
 Next
 If File1.ListCount = 0 Then ‘如果当前目录没有图片
  StatusBar1.Panels(1).Text = ""
  StatusBar1.Panels(2).Text = ""
  StatusBar1.Panels(3).Text = ""
  StatusBar1.Panels(4).Text = ""
  StatusBar1.Panels(4).Visible = False
  If currindex <> -1 Then ‘如果选择了图片,则显示此图片的Image控件的边框风格改为平板风格
   Image1(currindex).Appearance = 0
  End If 
  currpage = 1: currindex = -1 ‘当前选择的页号为1并不选择图片
  Exit Sub
 End If
 currpage = 1: currindex = -1 ‘如果当前目录有图片,则将页号赋值为1并不选择图片
 Call DisplayPicPage(currpage) ‘调用自定义函数显示指定页号的图片
End Sub

Private Sub DisplayPicPage(page As Integer) ‘显示指定页的图片
 Dim i As Integer
 Dim usetime As Long
 On Error Resume Next
 usetime = GetTickCount
 If (File1.ListCount - (25 * (page - 1)) < 25) And (File1.ListCount - (25 * (page - 1)) > 0) Then
  For i = 0 To File1.ListCount Mod 25 - 1
   Image1(i).Picture = LoadPicture(Dir1.Path + "/" + File1.List((page - 1) * 25 + i))
   Image1(i).ToolTipText = File1.List((page - 1) * 25 + i)
  Next
  For i = File1.ListCount Mod 25 To 24
   Image1(i).Picture = LoadPicture("")
   Image1(i).ToolTipText = ""
  Next
  StatusBar1.Panels(1).Text = "图片:" & File1.ListCount & "(张)" + Space(5) + "当前第" & (currpage - 1) * 25 + 1 & "-" & (currpage - 1) * 25 + File1.ListCount Mod 25 & "张"

 Else
  For i = 0 To 24
   Image1(i).Picture = LoadPicture(Dir1.Path + "/" + File1.List((page - 1) * 25 + i))
   Image1(i).ToolTipText = File1.List((page - 1) * 25 + i)
  Next
  StatusBar1.Panels(1).Text = "图片:" & File1.ListCount & "(张)" + Space(5) + "当前第" & (currpage - 1) * 25 + 1 & "-" & currpage * 25 & "张"

 End If

 StatusBar1.Panels(4).Text = "用时:" & GetTickCount - usetime & "(ms)"
 StatusBar1.Panels(4).Visible = True
End Sub

‘点击【上一页】,【下一页】按钮事件

Private Sub Command1_Click(Index As Integer)
 File1.Refresh
 If File1.ListCount = 0 Then Exit Sub
 Select Case Index
  Case 0
   If currpage = (File1.ListCount / 25 + 1) Then Exit Sub
   currpage = currpage + 1
   Call DisplayPicPage(currpage)
  Case 1
   If currpage = 1 Then Exit Sub
   currpage = currpage - 1
   Call DisplayPicPage(currpage)
  Case 2
   If currindex <> -1 Then
    Image1(currindex).Appearance = 0
   End If
   Call InitShowPic
 End Select
End Sub

  以上代码是程序的重点,后两个函数我没有注释,大家可以自己分析一下。最后不要忘了,动态创建的资源要及时释放,所以在Form_Unload事件中加上以下代码即可。

Private Sub Form_Unload(Cancel As Integer)
 Dim i As Integer
 For i = 1 To 24
  Unload Image1(i)
 Next
End Sub

  在此基础上,大家可以加上一些图片处理的功能,现在网络上有很多此方面的控件下载(比如Polar Draw等等),这样就可以和ACDsee相媲美了哦~~~

  下图是我的程序截图,程序在VB6.0+WINDOWS2000环境下编译通过。

 

 

 

 
上一篇:浅谈用VB6.0编写“特洛伊木马”程序  下一篇:VB实现文字“闪入&quot;显示的特殊效果