----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下調試通過。->