lx = 0: ly = -1 For i = 0 To File1.ListCount - 1 imgPic.Picture = LoadPicture(File1.Path & "\" & File1.List(i)) If i Mod 5 = 0 Then lx = 0 ly = ly + 1 '一行显示5个图片,你可以自己改 End If picView.PaintPicture imgPic.Picture, lx * imgPic.Width, ly * imgPic.Height, imgPic.Width, imgPic.Height lx = lx + 1 Next End Sub
用vb6设计缩略图功能的图片浏览器 新天 相信每个编程爱好者都非常熟悉ACD SEE,它的缩略图察看功能和对种类繁多的图片文件的支持使它成为使用最广泛的图片浏览软件之一。现在,我们也可以轻松的设计一个具有缩略图察看功能的图片浏览器,它能够支持JPG、GIF、JPEG、BMP、WMF、DIB、ICO、CUR等格式图片文件。(一)编程思路; 性能良好的图片浏览器首先要能够支持广泛的图片文件格式 ,这一点VB6基本控件picture已经为我们做好了。我们所要考虑的是如何将一幅图片极其清晰的按照设定大小显示到“容器”中——“容器”可以是多种多样的,而且要充分利用动态创建和卸载控件技术,以便适应不同目录所含有的不同个数的图片,当然正确、有序排列缩略图片也是非常关键的。 我在这里向大家展示利用动态创建COMMAND(按钮)控件作为载体的实现方法,它不仅可以以缩略图方式进行图片预览和全屏图片浏览,而且可以自动随窗体的变化进行相应的伸展——注意本文关于界面容器、缩略图载体容器和缩略图载体的概念。(二)界面设计; (1)添加四个command控件command(1——8)Style = 1 ’Graphical,caption属性分别是“选择”、“浏览”、“预览”(缩略图察看)、“上一张”、“下一张”、“向下”、“向上”、“退出”——这些按钮用来进行系统相关操作,它们是可以添加图片的; (2)添加一个filelist控件filhidden,设置其 Pattern= "*.bmp;*.dib;*.rle;*.gif;*.jpg;*.wmf;*.emf;*.ico;*.cur",visible=fales——该文件列表控件用来读取选中目录下的所有图片文件名称,程序运行时是不可见的; (3)添加picture控件picFrame作为界面容器;在其上面添加四个picture控件picSlide作为缩略图载体容器,picload设置autosize=true作为缓冲图片要以原格式装载图片,picThumb用来装载缩略后的图片;一个VScrollBarL控件vsbSlide——用来进行图片调整,以便在缩略图较多时能够进行相应的调整,picture1用来全屏显示图片;设置上述所有图片控件ScaleMode=3’Pixel;它们用来进行界面调整和缩略图片的生成; (4)在缩略图载体容器picslide上面添加命令按钮command控件数组原型com(0),设置其 Style = 1 ’Graphical、Visible = 0 ;——用来作为缩略图片的载体; (5)添加一个StatusBar控件St ——用来显示有关的信息; (6)单击"工程"菜单项目,选择"部件",在部件对话框的"控件"栏目中选择"MICROSOFT WINDOWS COMMON CONTROLS 6.0",确认在它前面的复选框中有一个黑色的对号,单击"确认",添加对该控件的引用。添加一个progressbar控件pb——用来显示缩略图的集成进度; (7)添加定时器timer1——用来实行图片的幻灯浏览;按层次调整上述控件到适当位置(如图片1所示);三)程序源代码;Option Explicit Dim Apath As String, Pi As Integer, bZ As Integer .......Private Declare Function StretchBlt Lib "GDI32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long//本函数用来对图片进行缩放处理,生成缩略图片 .......Private Sub CreateThumbs()//本函数用来创造缩略图片,并且将它们放到足够的 file://缩略图载体com(i)中Dim lIdx As Long Dim lFilCnt As Long Dim sText As String, i As Integer Screen.MousePointer = vbHourglass//设置鼠标指针为漏斗类型picSlide.Move 0, 0, Com(0).Width, Com(0).Height picSlide.Visible = True//初始化缩略图容器载体Pr.Visible = True Pr.Value = 0 Pr.Max = filHidden.ListCount Pr.Min = 0//启动进度条Com(0).Picture = LoadPicture Com(0).Visible = False If Com.Count > 1 Then For i = 1 To Com.Count - 1 Unload Com(i) Next End If $$$AGESEP$$$ //初始化缩略图载体comOn Error Resume Nextfile://忽略错误file://lFilCnt = filHidden.ListCount For lIdx = 0 To filHidden.ListCount - 1 Load Com(lIdx) Com(lIdx).Caption = filHidden.List(lIdx) Com(lIdx).Visible = True Pr.Value = 1 Next lIdx//创建所需要的所有缩略图载体file://载体的个数等于选定目录下图片文件个数 Call Form_Resize//对载体进行排序DoEvents For lIdx = 0 To filHidden.ListCount - 1 picLoad.Picture = LoadPicture() picThumb.Cls picLoad.Picture = LoadPicture(Apath & filHidden.List(lIdx)) StretchBlt picThumb.hdc, 0, 0, picThumb.Width, picThumb.Height,picLoad.hdc, 0, 0, _ picLoad.ScaleWidth, picLoad.ScaleHeight, vbSrcCopy Set Com(lIdx).Picture = picThumb.Image//按顺序为载体添加缩略图片 DoEvents Pr.Value = lIdx + 1 Next lIdx Set picLoad.Picture = LoadPicture() Set picThumb.Picture = LoadPicture() Pr.Visible = False Screen.MousePointer = 0//释放占用的资源、隐藏进度条、恢复鼠标指针End Sub ....... Private Sub filHidden_PathChange() $$$AGESEP$$$ //当文件目录改变时计算出标准的目录变量file://显示有关的目录和图片文件个数信息 file://调用缩略图创建过程函数//...... CreateThumbs End Sub Private Sub Form_Resize()file://本函数用来对程序界面控件位置进行相应的调整file://并且调整缩略图的位置Dim X As Long Dim Y As Long Dim lIdx As Long Dim lCols As Long If Me.WindowState <> vbMinimized Then If Me.Width < 600 * Screen.TwipsPerPixelX Then Me.Width = 600 * Screen.TwipsPerPixelX ElseIf Me.Height < 378 * Screen.TwipsPerPixelY Then Me.Height = 378 * Screen.TwipsPerPixelY end if//限定软件界面的最小宽度和高度Else picFrame.Move 2, Command1.Height, Me.ScaleWidth - 11, Me.ScaleHeight - Command1.Height - St.Height vsbSlide.Move picFrame.ScaleWidth - vsbSlide.Width, 0, vsbSlide.Width, picFrame.ScaleHeight lCols = Int((picFrame.ScaleWidth - vsbSlide.Width) / Com(0).Width) For lIdx = 0 To Com.Count - 1 X = (lIdx Mod lCols) * Com(0).Width Y = Int(lIdx / lCols) * Com(0).Height Com(lIdx).Move X, Y Next lIdx picSlide.Width = lCols * Com(0).Width picSlide.Height = Int(Com.Count /lCols)*Com(0).Height If Int(Com.Count / lCols) < (Com.Count / lCols) Then picSlide.Height = picSlide.Height + Com(0).Height End If vsbSlide.Value = 0 vsbSlide.Max = picSlide.Height - picFrame.ScaleHeight If vsbSlide.Max < 0 Then vsbSlide.Max = 0 vsbSlide.Enabled = False Else vsbSlide.Enabled = True vsbSlide.SmallChange = Com(0).Height vsbSlide.LargeChange = picFrame.ScaleHeight End If End If Pr.Top = St.Top + 8 Pr.Left = St.Panels(4).Left + 6 Picture1.Move (picFrame.Width - Picture1.Width) / 2, (picFrame.Height - Picture1.Height) / 2 End Sub ........ Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) $$$AGESEP$$$ file://如果被全屏浏览的图片较大时file://可以用鼠标拖动图片来浏览全貌 ReleaseCapture SendMessage Picture1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0 End Sub ....... Private Sub vsbSlide_Change()//当缩略图较多时可以移动滑块进行浏览picSlide.Top = -vsbSlide.Value End Sub(四)运行调试(见图片2); 本文程序展示了有关缩略图预览等的全部核心技术,至于界面、缩略图载体容器和载体可以由编程爱好者们自由发挥、改造。为了加快缩略图集成速度,大家可以考虑使用多线程内存文件映射技术——相信你很快就可以和ACD一较高下了!
--------------------------------------------------------------------------------Copyright by netrobo 2001-2002.All right reserved. http://vb1.myrice.com/article/multimedia/img/019B.jpg http://vb1.myrice.com/article/multimedia/img/019A.jpg
'在窗口上加一个FILE控件,显示图片文件
'加一个IMAGE控件,宽度和高度都为900,名称为: imgPic
'加一个PICTURE控件,用于显示所有的图片,名称为: picView
Dim i As Long, lx As Long, ly As Long
imgPic.Width = 900: imgPic.Height = 900
File1.Pattern = "*.bmp"
File1.Path = "D:\My Documents\My Pictures"
imgPic.Stretch = True '设置为可拉伸的,使图片适应控件大小
imgPic.Visible = False
lx = 0: ly = -1
For i = 0 To File1.ListCount - 1
imgPic.Picture = LoadPicture(File1.Path & "\" & File1.List(i))
If i Mod 5 = 0 Then
lx = 0
ly = ly + 1 '一行显示5个图片,你可以自己改
End If
picView.PaintPicture imgPic.Picture, lx * imgPic.Width, ly * imgPic.Height, imgPic.Width, imgPic.Height
lx = lx + 1
Next
End Sub
拿EMAIL过来~~
我用picturebox作为容器,将显示tif的控件放入其中,可动态生成,加了滚动条,但不能支持方向键,而且不能用鼠标选择,子控件多了,picturebox容易溢出。
如果是学习的话做做也行,否则不要弄,即使做也不要用VB,速度始终是问题.可以考虑VC~~
新天
相信每个编程爱好者都非常熟悉ACD SEE,它的缩略图察看功能和对种类繁多的图片文件的支持使它成为使用最广泛的图片浏览软件之一。现在,我们也可以轻松的设计一个具有缩略图察看功能的图片浏览器,它能够支持JPG、GIF、JPEG、BMP、WMF、DIB、ICO、CUR等格式图片文件。(一)编程思路; 性能良好的图片浏览器首先要能够支持广泛的图片文件格式 ,这一点VB6基本控件picture已经为我们做好了。我们所要考虑的是如何将一幅图片极其清晰的按照设定大小显示到“容器”中——“容器”可以是多种多样的,而且要充分利用动态创建和卸载控件技术,以便适应不同目录所含有的不同个数的图片,当然正确、有序排列缩略图片也是非常关键的。 我在这里向大家展示利用动态创建COMMAND(按钮)控件作为载体的实现方法,它不仅可以以缩略图方式进行图片预览和全屏图片浏览,而且可以自动随窗体的变化进行相应的伸展——注意本文关于界面容器、缩略图载体容器和缩略图载体的概念。(二)界面设计; (1)添加四个command控件command(1——8)Style = 1 ’Graphical,caption属性分别是“选择”、“浏览”、“预览”(缩略图察看)、“上一张”、“下一张”、“向下”、“向上”、“退出”——这些按钮用来进行系统相关操作,它们是可以添加图片的; (2)添加一个filelist控件filhidden,设置其 Pattern= "*.bmp;*.dib;*.rle;*.gif;*.jpg;*.wmf;*.emf;*.ico;*.cur",visible=fales——该文件列表控件用来读取选中目录下的所有图片文件名称,程序运行时是不可见的; (3)添加picture控件picFrame作为界面容器;在其上面添加四个picture控件picSlide作为缩略图载体容器,picload设置autosize=true作为缓冲图片要以原格式装载图片,picThumb用来装载缩略后的图片;一个VScrollBarL控件vsbSlide——用来进行图片调整,以便在缩略图较多时能够进行相应的调整,picture1用来全屏显示图片;设置上述所有图片控件ScaleMode=3’Pixel;它们用来进行界面调整和缩略图片的生成; (4)在缩略图载体容器picslide上面添加命令按钮command控件数组原型com(0),设置其 Style = 1 ’Graphical、Visible = 0 ;——用来作为缩略图片的载体; (5)添加一个StatusBar控件St ——用来显示有关的信息; (6)单击"工程"菜单项目,选择"部件",在部件对话框的"控件"栏目中选择"MICROSOFT WINDOWS COMMON CONTROLS 6.0",确认在它前面的复选框中有一个黑色的对号,单击"确认",添加对该控件的引用。添加一个progressbar控件pb——用来显示缩略图的集成进度; (7)添加定时器timer1——用来实行图片的幻灯浏览;按层次调整上述控件到适当位置(如图片1所示);三)程序源代码;Option Explicit
Dim Apath As String, Pi As Integer, bZ As Integer
.......Private Declare Function StretchBlt Lib "GDI32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long//本函数用来对图片进行缩放处理,生成缩略图片
.......Private Sub CreateThumbs()//本函数用来创造缩略图片,并且将它们放到足够的 file://缩略图载体com(i)中Dim lIdx As Long
Dim lFilCnt As Long
Dim sText As String, i As Integer
Screen.MousePointer = vbHourglass//设置鼠标指针为漏斗类型picSlide.Move 0, 0, Com(0).Width, Com(0).Height
picSlide.Visible = True//初始化缩略图容器载体Pr.Visible = True
Pr.Value = 0
Pr.Max = filHidden.ListCount
Pr.Min = 0//启动进度条Com(0).Picture = LoadPicture
Com(0).Visible = False
If Com.Count > 1 Then
For i = 1 To Com.Count - 1
Unload Com(i)
Next
End If
$$$AGESEP$$$
//初始化缩略图载体comOn Error Resume Nextfile://忽略错误file://lFilCnt = filHidden.ListCount
For lIdx = 0 To filHidden.ListCount - 1
Load Com(lIdx)
Com(lIdx).Caption = filHidden.List(lIdx)
Com(lIdx).Visible = True
Pr.Value = 1
Next lIdx//创建所需要的所有缩略图载体file://载体的个数等于选定目录下图片文件个数 Call Form_Resize//对载体进行排序DoEvents
For lIdx = 0 To filHidden.ListCount - 1
picLoad.Picture = LoadPicture()
picThumb.Cls
picLoad.Picture = LoadPicture(Apath & filHidden.List(lIdx))
StretchBlt picThumb.hdc, 0, 0, picThumb.Width, picThumb.Height,picLoad.hdc, 0, 0, _ picLoad.ScaleWidth, picLoad.ScaleHeight, vbSrcCopy
Set Com(lIdx).Picture = picThumb.Image//按顺序为载体添加缩略图片 DoEvents
Pr.Value = lIdx + 1
Next lIdx
Set picLoad.Picture = LoadPicture()
Set picThumb.Picture = LoadPicture()
Pr.Visible = False
Screen.MousePointer = 0//释放占用的资源、隐藏进度条、恢复鼠标指针End Sub
.......
Private Sub filHidden_PathChange()
$$$AGESEP$$$
//当文件目录改变时计算出标准的目录变量file://显示有关的目录和图片文件个数信息 file://调用缩略图创建过程函数//...... CreateThumbs
End Sub
Private Sub Form_Resize()file://本函数用来对程序界面控件位置进行相应的调整file://并且调整缩略图的位置Dim X As Long
Dim Y As Long
Dim lIdx As Long
Dim lCols As Long
If Me.WindowState <> vbMinimized Then
If Me.Width < 600 * Screen.TwipsPerPixelX Then
Me.Width = 600 * Screen.TwipsPerPixelX
ElseIf Me.Height < 378 * Screen.TwipsPerPixelY Then
Me.Height = 378 * Screen.TwipsPerPixelY
end if//限定软件界面的最小宽度和高度Else
picFrame.Move 2, Command1.Height, Me.ScaleWidth - 11, Me.ScaleHeight - Command1.Height - St.Height
vsbSlide.Move picFrame.ScaleWidth - vsbSlide.Width, 0, vsbSlide.Width, picFrame.ScaleHeight
lCols = Int((picFrame.ScaleWidth - vsbSlide.Width) / Com(0).Width)
For lIdx = 0 To Com.Count - 1
X = (lIdx Mod lCols) * Com(0).Width
Y = Int(lIdx / lCols) * Com(0).Height
Com(lIdx).Move X, Y
Next lIdx
picSlide.Width = lCols * Com(0).Width
picSlide.Height = Int(Com.Count /lCols)*Com(0).Height
If Int(Com.Count / lCols) < (Com.Count / lCols) Then
picSlide.Height = picSlide.Height + Com(0).Height
End If
vsbSlide.Value = 0
vsbSlide.Max = picSlide.Height - picFrame.ScaleHeight
If vsbSlide.Max < 0 Then
vsbSlide.Max = 0
vsbSlide.Enabled = False
Else
vsbSlide.Enabled = True
vsbSlide.SmallChange = Com(0).Height
vsbSlide.LargeChange = picFrame.ScaleHeight
End If
End If
Pr.Top = St.Top + 8
Pr.Left = St.Panels(4).Left + 6
Picture1.Move (picFrame.Width - Picture1.Width) / 2, (picFrame.Height - Picture1.Height) / 2
End Sub
........
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
$$$AGESEP$$$
file://如果被全屏浏览的图片较大时file://可以用鼠标拖动图片来浏览全貌 ReleaseCapture
SendMessage Picture1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Sub
.......
Private Sub vsbSlide_Change()//当缩略图较多时可以移动滑块进行浏览picSlide.Top = -vsbSlide.Value
End Sub(四)运行调试(见图片2); 本文程序展示了有关缩略图预览等的全部核心技术,至于界面、缩略图载体容器和载体可以由编程爱好者们自由发挥、改造。为了加快缩略图集成速度,大家可以考虑使用多线程内存文件映射技术——相信你很快就可以和ACD一较高下了!
--------------------------------------------------------------------------------Copyright by netrobo 2001-2002.All right reserved.
http://vb1.myrice.com/article/multimedia/img/019B.jpg
http://vb1.myrice.com/article/multimedia/img/019A.jpg