如果你让窗体随图片大小变化,就不存在图片大于窗体的情况。
你可以得到一个图片的大小吧,如果不可以,就将图片导入到 Image 控件,将 Image 控件设置为自动改变大小,这时的 Image 控件大小就是图片大小。然后根据这个大小改变窗体大小。
以一个 PictureBox 作容器,另一个 PictureBox 或者 Image 放在其中显示图片,用真实大小。此时可能出现内部的 Image 大于外部的 PictureBox 的情况,再加上滚动条,用于控件内部 Image 在 PictureBox 的相对位置就可以了。如果你要以窗体为单位,可能合适的安排 PictureBox(外)的大小,注意要留出 ScrollBar 的空间哦。

解决方案 »

  1.   

    to iamfancy(边城狂人):
       没有着方面的经验,能否示例一下,马上送粉
      

  2.   

    转载一篇,参考一下:
    在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 SubPrivate Sub Form_Resize()
    ImgEdit1.Top = 0
    ImgEdit1.Left = 0
    ImgEdit1.Height = Form1.ScaleHeight
    ImgEdit1.Width = Form1.ScaleWidth
    End SubPrivate 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 LongPrivate Sub Form_Load()
    c1 = Form1.Width
    c2 = Form1.Height
    blf = 100
    Picture2.Picture = LoadPicture("a:\ddd.jpg")
    yk = Picture2.Width
    yg = Picture2.Height
    End SubPrivate 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 SubPrivate 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 SubSub 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 SubPrivate Sub VScroll1_Change()
    Picture2.Top = -VScroll1.Value
    Picture2.SetFocus
    End Sub
    Private Sub HSCROLL1_Change()
    Picture2.Left = -HScroll1.Value
    Picture2.SetFocus
    End SubSub 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中使用通过。 
    回复人: bdzwc(bdzwc) (2001-9-24 16:57:11)  得0分 
    转贴一个,参考:
    在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 SubPrivate Sub Form_Resize()
    ImgEdit1.Top = 0
    ImgEdit1.Left = 0
    ImgEdit1.Height = Form1.ScaleHeight
    ImgEdit1.Width = Form1.ScaleWidth
    End SubPrivate 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 LongPrivate Sub Form_Load()
    c1 = Form1.Width
    c2 = Form1.Height
    blf = 100
    Picture2.Picture = LoadPicture("a:\ddd.jpg")
    yk = Picture2.Width
    yg = Picture2.Height
    End SubPrivate 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 SubPrivate 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 SubSub 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 SubPrivate Sub VScroll1_Change()
    Picture2.Top = -VScroll1.Value
    Picture2.SetFocus
    End Sub
    Private Sub HSCROLL1_Change()
    Picture2.Left = -HScroll1.Value
    Picture2.SetFocus
    End SubSub 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中使用通过。