VB5实现窗口图像缩放、滚动技巧
2006-02-27 11:56:27 来源:WEB开发网核心提示:VisualBasic是Windows平台中最常用的应用软件开发语言,窗口图像缩放、滚动是图像处理、多媒体数据库等应用软件开发中的基本功能,本文将介绍如何用VB5.0实现地窗口图像缩放和滚动技巧,供读者在各种语言系统开发中参考,VB5实现窗口图像缩放、滚动技巧,一、获取图像本文所介绍的图像缩放并没有对真正的图像进行缩放
----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.执行“File>PRojects”创建一新项目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)
IfMX>0AndMX<HScroll1.MaxThenHScroll1.Value=MX
IfMY>0AndMY<VScroll1.MaxThenVScroll1.Value=MY
EndIf
EndSub
PrivateSubImageWin_MouseDown(ButtonAsInteger,
ShiftAsInteger,XAsSingle,YAsSingle)
X0=X:Y0=Y'拖动鼠标初值
EndSub
----5.在ZoomIn控件和ZoomOut的Click事件中输入下列程序,对窗口图像进行放大、缩小处理。
PrivateSubZoonIn_Click()
IfAMP<5ThenAMP=2*AMP
'放大系数小于5,则放大图像
AppImage.ImageWin.PaintPictureImageWin.Image,
0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
EndSub
PrivateSubZoomOut_Click()
AppImage.ImageWin.Cls
'清除窗口图像
IfAMP>0.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下调试通过。->
----一、获取图像
----本文所介绍的图像缩放并没有对真正的图像进行缩放,而是复制一幅窗口图像的真实画面,对这个窗口图像附本进行局部缩放和滚动,获取窗口图像可使用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.执行“File>PRojects”创建一新项目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)
IfMX>0AndMX<HScroll1.MaxThenHScroll1.Value=MX
IfMY>0AndMY<VScroll1.MaxThenVScroll1.Value=MY
EndIf
EndSub
PrivateSubImageWin_MouseDown(ButtonAsInteger,
ShiftAsInteger,XAsSingle,YAsSingle)
X0=X:Y0=Y'拖动鼠标初值
EndSub
----5.在ZoomIn控件和ZoomOut的Click事件中输入下列程序,对窗口图像进行放大、缩小处理。
PrivateSubZoonIn_Click()
IfAMP<5ThenAMP=2*AMP
'放大系数小于5,则放大图像
AppImage.ImageWin.PaintPictureImageWin.Image,
0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
EndSub
PrivateSubZoomOut_Click()
AppImage.ImageWin.Cls
'清除窗口图像
IfAMP>0.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下调试通过。->
赞助商链接