我用pset方法编写了一个显示pcx图片的程序,但由于图片框的限制,大图片看不到多出的部分,请问如何可以显示完整的图片?

解决方案 »

  1.   

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

  2.   

    自己画图片?那就改用第三方控件好了.推荐vsdraw
      

  3.   

    思路:用两个图片框,第一个做第二个的容器并放其他控件(滚动条)第二个图片框与放图片并与之大小一起改变(AutoSzie=True),而且把第二个图片框的边框设置成无。在第一个图片框中放入横向滚动条与纵向滚动条控件,第一个图片框与第二个图片框的左上角一致,当图片大小超出第二个图片框大小时,用滚动条控件移动第二个图片框即可。具体看《Visual Basic 6.0 中文版程序员指南》第562页(电子版)!
      

  4.   

    楼上的兄弟你的图片是现成的,你画一个看看?
    可以这样,先建立一个内存dc,根据pcx文件格式在上面画图,然后将其保存为bmp格式的文件
      

  5.   

    用MFC写个双缓冲的SDI程序就全都明白了。而且,你会发现VB很周到的,它本身就是双缓冲的喽………
      

  6.   

    调用picture1.picture.width 和 picture1.picture.height
    然后就看你自己了
    随便你怎么编。
    比如
    让picture1.width=picture1.picture.width : picture1.height=picture1.picture.height
    如果你愿意可以加两个 滚动条改变 picturebox的top 和left(可以是负值)
      

  7.   

    同意楼也呆直接改属性
    AutoSzie=True
      

  8.   

    对于Picturebox并不能通过AutoSzie实现他的自动放缩,image可以