VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 制作可滚动的图像显示
发表评论(0)作者:, 平台:, 阅读:12183, 日期:2000-03-12


 


在VB中制作可滚动的图像显示




摘要:我们在制作多媒体程序时,不可避免的要涉及图像的显示,尽管VB中提

供的picturebox可以显示多种格式的图像文件,但由于没有提供滚动条和缩放功

能,在使用中多有不便。笔者在编制一多媒体程序时,就需要对图像进行缩放显

示。这通常有两种处理办法,一是利用第三方控件,如Windows自带的WANG图像控

件;二是利用VB的picturebox和滚动条控件自行编程实现。本文给出了利用这两

种方法制作的实例。


在VB中制作可滚动的图像显示


我们在制作多媒体程序时,不可避免的要涉及图像的显示,尽管VB中提供的

picturebox可以显示多种格式的图像文件,但由于没有提供滚动条和缩放功能,在

使用中多有不便。笔者在编制一多媒体程序时,就需要对图像进行缩放显示。这通

常有两种处理办法,一是利用第三方控件,如Windows自带的WANG图像控件;二是

利用VB的picturebox和滚动条控件自行编程实现。两种方法各有优缺点,可以根

据需要具体选用。

一,利用第三方控件实现

在“工程”中选取“部件”,将WANG 图像编辑控制添加到工具箱中,并在窗

体中绘制出合适大小,按鼠标右键,选取特性,设置好各种参数后加入程序代码就

行了,使用非常简单,如果需要,在程序中也可加入一定的图像编辑功能。

采用第三方控件,功能较强,程序编制也简单一些,不失为一种好方法。但存

在一些其他问题,比如本文采用的WANG 图像编辑控制,在使用中就经常出现“类

没有注册”的错误,解决此问题,要么修改注册表,要么重装系统,很麻烦,所以

在要求的功能不是很多的情况下,用第二种方法比较合适。以下就是使用WANG控

件的程序,可以看出,代码很简单。

Private Sub imgedit1_KeyDown(KeyCode As Integer, Shift As Integer)

Select Case KeyCode '定义功能键,+,-用以缩放图像

Case vbKeyAdd

ImgEdit1.Zoom=imgedit1.zoom*1.2

Case vbKeySubtract

ImgEdit1.Zoom=imgedit1.zoom/1.2

End Select

ImgEdit1.Refresh

End Sub


Private Sub Form_Resize()

ImgEdit1.Top = 0

ImgEdit1.Left = 0

ImgEdit1.Height = Form1.ScaleHeight

ImgEdit1.Width = Form1.ScaleWidth

End Sub


Private Sub Form_Load()

imgedit1.image="a:\ddd.jpg"

ImgEdit1.ImagePalette = 3

ImgEdit1.Display

End Sub

二是利用VB的picturebox和滚动条控件编程实现

PICTUREBOX控件能支持许多种图像格式,但没有缩放功能并且不自动添加滚

动条,所以必须自行编程实现。

应用程序使用两个图片框,一个作为包容器,可称之为父图片框,另一个作

为子图片框显示图形,配合滚动条控件在父图片框内移动子图片框就可实现画面

的滚动。

VB中提供了paintpicture方法,可以在窗体、图片框上的任何地方绘制图

形,语法为 object.PaintPicture picture, x1, y1, width1, height1, x2,

y2, width2, height2, opcode,其中x1,y1为指定在 object 上绘制 picture

的目标坐标;width1,height1 指定 picture 的目标宽度和高度;x2,y2指定

picture 内剪贴区的坐标 width2,height2 指定 picture 内剪贴区的源宽度和高

度,当我们重新设定width1,height1时,就可以在子图片框内实现平滑的缩放图

片。虽然Paintpicture可以代替bitblt windows API函数,但没有API的执行

速度快,如程序对速度的要求比较高,可用API函数代替paintpicture方法 。

在窗体中先画出picture1作为父图片框,然后在其中中画出picture2,在窗

体中再画出滚动条,picture2的autosize属性为TRUE,borderstyle属性为0,

autoredraw属性为true,滚动条的largechange和smallchange属性设为合适大

小,窗体既设置完毕。

以下为可以直接使用的完整程序,可以用光标键移动画面,也可以拖放方式

移动画面;用加减号缩放画面。

Public c1, c2, c3, c4 As Integer

Public tf, d1, d2, d3, d4, blf As Integer

Public yk, yg As Long


Private Sub Form_Load()

c1 = Form1.Width

c2 = Form1.Height

blf = 100

Picture2.Picture = LoadPicture("a:\ddd.jpg")

yk = Picture2.Width

yg = Picture2.Height

End Sub


Private Sub Form_Resize()

If Width > 1500 And Height > 1170 Then

c3 = Form1.Width - c1

c4 = Form1.Height - c2

Picture1.Move Picture1.Left, Picture1.Top, Picture1.Width + c3, Picture1.Height + c4

c1 = Form1.Width

c2 = Form1.Height

Call p

End If

Picture2.SetFocus

End Sub

'以拖放方式滚动画面

Private Sub Picture2_DragDrop(Source As Control, x As Single, y As Single)

If Picture2.Height > Picture1.Height Then '通过计算鼠标移动位置,调用vscroll_change事件

cccc = VScroll1.Value + (d2 - y) '移动画面

If cccc <= 0 Then

cccc = 0

End If

If cccc >= VScroll1.Max Then

cccc = VScroll1.Max

End If

VScroll1.Value = cccc

End If

If Picture2.Width > Picture1.Width Then

cccc1 = HScroll1.Value + (d1 - x)

If cccc1 <= 0 Then

cccc1 = 0

End If

If cccc1 >= HScroll1.Max Then

cccc1 = HScroll1.Max

End If

HScroll1.Value = cccc1

End If

End Sub

'设置功能键,光标键移动画面,加减号缩放画面

Private Sub Picture2_KeyDown(KeyCode As Integer, Shift As Integer)

Select Case KeyCode

Case vbKeyLeft

HScroll1.Value = IIf(HScroll1.Value - HScroll1.SmallChange < 0, 0, HScroll1.Value -

HScroll1.SmallChange)

Case vbKeyRight

If Picture2.Width > Picture1.Width Then

HScroll1.Value = IIf(HScroll1.Value + HScroll1.SmallChange > HScroll1.Max, HScroll1.Max,

HScroll1.Value + HScroll1.SmallChange)

End If

Case vbKeyUp

VScroll1.Value = IIf(VScroll1.Value - VScroll1.SmallChange < 0, 0, VScroll1.Value -

VScroll1.SmallChange)

Case vbKeyDown

If Picture2.Height > Picture1.Height Then

VScroll1.Value = IIf(VScroll1.Value + VScroll1.SmallChange > VScroll1.Max, VScroll1.Max,

VScroll1.Value + VScroll1.SmallChange)

End If

Case vbKeyAdd

If blf < 150 Then

blf = blf + 25

Call fs(blf)

End If

Case vbKeySubtract

If blf > 50 Then

blf = blf - 25

Call fs(blf)

End If

End Select

End Sub


Private Sub Picture2_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

d1 = x

d2 = y

Picture2.Drag 1

Set Picture2.DragIcon = LoadPicture("a:\plane.ico")

End Sub


Sub p()'画面和滚动条重设置程序

Picture2.Move 0, 0

HScroll1.Top = Picture1.Height + Picture1.Top

HScroll1.Left = Picture1.Left

HScroll1.Width = Picture1.Width

VScroll1.Top = Picture1.Top

VScroll1.Left = Picture1.Width + Picture1.Left

VScroll1.Height = Picture1.Height

HScroll1.Max = (Picture2.Width - Picture1.Width)

VScroll1.Max = (Picture2.Height - Picture1.Height)

VScroll1.Visible = (Picture1.Height < Picture2.Height)

HScroll1.Visible = (Picture1.Width < Picture2.Width)

End Sub


Private Sub VScroll1_Change()

Picture2.Top = -VScroll1.Value

Picture2.SetFocus

End Sub

Private Sub HSCROLL1_Change()

Picture2.Left = -HScroll1.Value

Picture2.SetFocus

End Sub


Sub fs(bl1 As Variant) '画出缩放

Dim bl As Variant

bl = bl1 / 100

Form1.MousePointer = vbHourglass

Picture2.Width = yk * bl

Picture2.Height = yg * bl

Picture2.Refresh

Picture2.PaintPicture Picture2.Picture, 0, 0, yk * bl, yg * bl, 0, 0, yk, yg

Call p

If VScroll1.Visible Then

VScroll1.Value = IIf(VScroll1.Value * bl > VScroll1.Max, VScroll1.Max, VScroll1.Value * bl)

End If

If HScroll1.Visible Then

HScroll1.Value = IIf(HScroll1.Value * bl > HScroll1.Max, HScroll1.Max, HScroll1.Value * bl)

End If

Form1.MousePointer = vbDefault

End Sub

本文的两例程序均在VB5.0中使用通过。