VB5实现窗口图像缩放、滚动技巧

2016-02-19 18:10 3 1 收藏

想要天天向上,就要懂得享受学习。图老师为大家推荐VB5实现窗口图像缩放、滚动技巧,精彩的内容需要你们用心的阅读。还在等什么快点来看看吧!

【 tulaoshi.com - 编程语言 】

----VisualBasic是Windows平台中最常用的应用软件开发语言,窗口图像缩放、滚动是图像处理、多媒体数据库等应用软件开发中的基本功能。本文将介绍如何用VB5.0实现地窗口图像缩放和滚动技巧,供读者在各种语言系统开发中参考。
  
  ----一、获取图像
  
  ----本文所介绍的图像缩放并没有对真正的图像进行缩放,而是复制一幅窗口图像的真实画面,对这个窗口图像附本进行局部缩放和滚动,获取窗口图像可使用Windows的API函数来实现。具体来说,实现窗口图像缩放、滚动需要用GetDeskTopWindow()函数获取桌面窗口句柄,再通过GetDC()函数转换为描述表句柄,则用BitBlt()函数把桌面图像复制到任意图形容器控件中,桌面图像复制完成后,再用ReleaseDC释放窗口描述表,各API函数的具体使用方法参见本文的例子程序。
  
  ----本文所用的API函数包含在WIN95/98的GDI32.DLL和USER32.DLL动态链接库中,在使用时可通过VB5.0的TEXTVIEWER复制到所开发的应用程序中。
  
  ----二、图像缩放
  
  ----图像缩放显示的基本原理就是把原图像的一部分缩放后再送入窗口的图形容器控件中,在VB中可用内部命令PaintPicture来进行,语法格式为:
  
  PaintPicturePic,DestX,DestY,DestWidth,
  DestHeight,ScrX,ScrY,ScrWidth,ScrHeight
  
  ----其中,Pic为图片对象,如图形控件对象等;
  
  DestX,DestY为目标图像起始坐标;
  DestWidth,DestHeight为目标图像幅面尺寸;
  ScrX,ScrY为源图像起始坐标;
  ScrWidth,ScrHeight为源图像剪裁尺寸。
  
  ----该命令就是把一个源图像资源任意复制到指定的区域,其功能相当于API函数的BitBlt,但使用更简单,若复制时改变源图像的ScrWidth,ScrHeight或目标图像的DestWidth,DestHeight可使复制后的图像尺寸发生变化,实现窗口图像的缩放显示。若ScrWidth,ScrHeight或DestWidth,DestHeight为负值还可实现窗口图像的水平、垂直反转显示。因此,在把源图像送入目标图形容器控件时,若改变源图像的幅面尺寸,即可实现图像的缩放处理。
  
  ----三、图像滚动
  
  ----当载入图像尺寸大于图形控件窗口时,为了便于浏览、选取必须对窗口图像滚动操作。窗口图像滚动可通过水平滚动控件HScroll和垂直滚动控件VScroll来实现,通过控件的改变值HScroll.Value和VScroll.Value来控制PaintPicture命令中的源图像坐标ScrX和ScrY,即可实现窗口图像的滚动操作。
  
  ----四、图像缩放、滚动实现
  
  ----本文可对非压缩BMP位图进行缩放、滚动,非压缩BMP位图的宽度和高度在文件开始11H后的8个字节。若读者需要对其它图像格式(如JPG,TIF等)进行缩放操作,可根据本文介绍的方法对找出相应的图像高度和宽度即可,具体实现步骤如下:
  
  ----1.执行“FileProjects”创建一新项目APPIMG.VBP,在FORM窗口中创建PictureBox、CommandButton、HScroll、VScroll等对象,调整各自位置,并设置各对象的属性如下:
  
  Form:Name=AppImage,ScaleMode=1
  PictureBox:Name=ImageWin,Appearance=1-3D,ScaleMode=3
  CommandButton:Name=ZoomIn,Caption="ZoomIn"
  CommandButton:Name=ZoomOut,Caption="ZoomOut"
  CommandButton:Name=ExitButton,Caption="Exit"
  
  ----2.双击FORM窗口,并将下面程序输入到Form对象的Load事件中。该程序用于读取图像的宽度和高度,初始化常用参数,载入窗口图像,并将图像复制到FORM窗口的PictureBox图形控件容器中显示。
  
  PrivateSubForm_Load()
  DimFileNameAsString
  FileName="C:SAMP.BMP"
  OpenFileNameForBinaryAs#1
  Get#1,19,ImageWidth:Get#1,,ImageHeight
  '读取位图的宽度和高度
  Close#1
  DW=15*ImageWidth-ImageWin.Width
  '将像点转换为Twip(微点)
  DH=15*ImageHeight-ImageWin.Height
  ImageWin.Width=15*ImageWidth
  ImageWin.Height=15*ImageHeight
  AppImage.AutoRedraw=True
  AppImage.Caption=FileName
  '改变Form窗标题
  HScroll1.SmallChange=100
  '设置滚动最小步距
  VScroll1.SmallChange=100
  DX=ImageWin.Width:DY=ImageWin.Height
  '设置复制图像尺寸
  SX=ImageWin.Width:SY=ImageWin.Height
  AMP=1'设置缩放比例为1
  sWin=GetDesktopWindow()
  '获取桌面窗口句柄
  sDC=GetDC(sWin)
  '转换为描述表句柄
  hd=BitBlt(ImageWin.hdc,0,0,Image.Width,
  Image.Height,sDC,0,0,&HCC0020)
  hd=ReleaseDC(sWin,sDC)'释放窗口描述表
  AppImage.ImageWin=LoadPicture(FileName)
  '载入图像显示
  EndSub
  
  ----3.在General对象的Declaration过程中声明本程序所使用的WIN95API函数和和过程,以及各事件程序所使用的全局变量等。
  
  PrivateDeclareFunctionBitBltLib"gdi32"
  (ByValhDestDCAsLong,ByValXAsLong,
  ByValYAsLong,ByValnWidthAsLong,ByVal
  nHeightAsLong,ByValhSrcDCAsLong,
  ByValxSrcAsLong,ByValySrcAsLong,
  ByValdwRopAsLong)AsLong
  PrivateDeclareFunctionGetDCLib"user32"
  (ByValhwndAsLong)AsLong
  PrivateDeclareFunction
  GetDesktopWindowLib"user32"()AsLong
  PrivateDeclareFunctionReleaseDCLib"user32"
  (ByValhwndAsLong,ByValhdcAsLong)AsLong
  DimsWin,sDC,hd
  DimImageWidthAsLong,ImageHeightAsLong
  DimDX,DY,SX,SY,PX,PY,DW,DH,MX,MY,X0,Y0,AMP
  
  ----4.双击ImageWin对象,并在MouseMove事件和Mouse_down事件中输入下面程序,用于窗口图形的拖动滚动处理。
  
  PrivateSubImageWin_MouseMove(ButtonAsInteger,
  ShiftAsInteger,XAsSingle,YAsSingle)
  If(ButtonAndvbLeftButton)0Then
  '拖动鼠标滚动图像
  MX=HScroll1.Value (X-X0)
  MY=VScroll1.Value (Y-Y0)
  IfMX0AndMXHScroll1.MaxThenHScroll1.Value=MX
  IfMY0AndMYVScroll1.MaxThenVScroll1.Value=MY
  EndIf
  EndSub
  PrivateSubImageWin_MouseDown(ButtonAsInteger,
  ShiftAsInteger,XAsSingle,YAsSingle)
  X0=X:Y0=Y'拖动鼠标初值
  EndSub
  
  ----5.在ZoomIn控件和ZoomOut的Click事件中输入下列程序,对窗口图像进行放大、缩小处理。
  
  PrivateSubZoonIn_Click()
  IfAMP5ThenAMP=2*AMP
  '放大系数小于5,则放大图像
  AppImage.ImageWin.PaintPictureImageWin.Image,
  0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
  EndSub
  PrivateSubZoomOut_Click()
  AppImage.ImageWin.Cls
  '清除窗口图像
  IfAMP0.25ThenAMP=AMP/2
  '放大系数大于0.25,则缩小图像
  AppImage.ImageWin.PaintPicture
  ImageWin.Image,0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
  EndSub
  
  ----6.在HScroll控件和VScroll控件的Change事件中输入下面程序,对窗口图像进行滚动处理。
  
  PrivateSubHScroll1_Change()
  PX=HScroll1.Value*DW/HScroll1.Max
  '计算水平滚动位置
  AppImage.ImageWin.PaintPictureImageWin.Image,
  0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
  EndSub
  PrivateSubVScroll1_Change()
  PY=VScroll1.Value*DH/VScroll1.Max
  '计算垂直滚动位置
  AppImage.ImageWin.PaintPictureImageWin.Image,
  0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
  EndSub
  
  ----7.在ExitButton控件的Click事件中输入下面程序,用于结束程序、关闭窗口。
  
  PrivateSubExitButton_Click()
  End
  EndSub
  
  ----五、应用说明
  
  ----窗口图像滚动是各种数据查询系统、多媒体图形数据库系统开发中的基本功能之一,本文用WindowsAPI函数实现了窗口图像缩放、滚动,该方法可适用于VisualC 等语言。本文全部程序均在WIN98环境中VisualBasic5.0下调试通过。->

来源:http://www.tulaoshi.com/n/20160219/1616936.html

延伸阅读
标签: PHP
  show.php源代码: <? if ($action=="cp"){ echo"<div align=center   <p滚动菜单资料输入端</p   <form method=post action=show.php?action=edit     <p文字一:         <input type=text name=t1 maxlen...
前面讲到了二次线性插值的应用。这一篇来给大家讲一下关于锐化、柔化、扩散、雕刻这几个滤镜的实现。 一、锐化 锐化的算法很简单,就是比较相邻的几个像素,把当前像素加上和周围的像素的差就可以了。这里我给出一个示例: ->ABCD EFGH IJKL MNOP-> 假设有一个图片,4*4,共16个像素,分别用A--...
VisualBasic5.0(VB5)是一个功能强大的工具,它有一大特点就是易学易用,下面我们就通过写一个“趣味撞球”的程序来初步体会一下。 首先启动VB5,新建一个标准的EXE工程。此时可以看到,工程包括一个Form1框体。在Form1边框的右下角按住鼠标左键不放,拖动鼠标把Form1的面积改为适当大小,比如6930×4320。再在属性框中把Form1的ScaleMode属...
----在VB5.0中,用MicrosoftJet数据库引擎和数据访问对象DAO(DataAccessObject)可以创建功能强大的客户/服务器应用程序。对远程数据库的访问是开发这类应用程序的关键环节,本文将介绍在VB5.0中用DAO通过MiscrosoftJet数据库引擎访问远程数据库的方法。 ----用DAO访问远程数据库大体上可以通过三步来实现,即数据连接、数据处理和断...
一些应用软件提供了一种方便的功能,只需要一个操作就可以将Windows桌面上的所有窗口最小化。首先,我们要遍历桌面上的所有窗口;其次,要判断窗口类型,桌面上的很多窗口无法最小化,或者窗口是不可见的,如中文Win 95中的输入法窗口。最后,将类型符合的窗口最小化。下面通过程序来介绍如何实现这种功能。 首先,在Project中加入一...

经验教程

482

收藏

40
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部