文/海蓝 一、 前言
在日常的工作或学习中,像一些常用的工具是必不可少的。比如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 | 下一页 | 预览下一页图片 |
Picture1 | PictureBox | 用来装入预览控件组的容器控件 | |
Image1(0) | Image | 显示图片控件 | |
Drive1 | DriveListBox | 显示当前系统的磁盘列表 | |
Dir1 | DirListBox | 显示当前磁盘的目录列表 | |
File1 | FileListBox | 显示当前目录的图片格式文件列表 |
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环境下编译通过。
图为:程序截图