VC教程
 

在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中使用通过。