明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

VB完成窗口圖像縮放、滾動技巧

[摘要]Visual Basic是Windows平臺中最常用的應(yīng)用軟件開發(fā)語言,窗口圖像縮放、滾動是圖像處理、多媒體數(shù)據(jù)庫等應(yīng)用軟件開發(fā)中的基本功能。本文將介紹如何用VB5.0實現(xiàn)地窗口圖像縮放和滾動技巧,供讀者在各種語言系統(tǒng)開發(fā)中參考。一、獲取圖像本文所介紹的圖像縮放并沒有對真正的圖像進行縮放,而是復(fù)制...
Visual Basic是Windows平臺中最常用的應(yīng)用軟件開發(fā)語言,窗口圖像縮放、滾動是圖像處理、多媒體數(shù)據(jù)庫等應(yīng)用軟件開發(fā)中的基本功能。本文將介紹如何用VB5.0實現(xiàn)地窗口圖像縮放和滾動技巧,供讀者在各種語言系統(tǒng)開發(fā)中參考。

一、獲取圖像

本文所介紹的圖像縮放并沒有對真正的圖像進行縮放,而是復(fù)制一幅窗口圖像的真實畫面,對這個窗口圖像附本進行局部縮放和滾動,獲取窗口圖像可使用Windows的API函數(shù)來實現(xiàn)。具體來說,實現(xiàn)窗口圖像縮放、滾動需要用GetDeskTopWindow()函數(shù)獲取桌面窗口句柄,再通過GetDC()函數(shù)轉(zhuǎn)換為描述表句柄,則用BitBlt()函數(shù)把桌面圖像復(fù)制到任意圖形容器控件中,桌面圖像復(fù)制完成后,再用ReleaseDC釋放窗口描述表,各API函數(shù)的具體使用方法參見本文的例子程序。

本文所用的API函數(shù)包含在WIN95/98的GDI32.DLL和USER32.DLL動態(tài)鏈接庫中,在使用時可通過VB5.0的TExt VIEWER復(fù)制到所開發(fā)的應(yīng)用程序中。

二、圖像縮放

圖像縮放顯示的基本原理就是把原圖像的一部分縮放后再送入窗口的圖形容器控件中,在VB中可用內(nèi)部命令PaintPicture來進行,語法格式為:
    PaintPicture Pic,DestX,DestY,DestWidth,DestHeight,ScrX,ScrY,ScrWidth,ScrHeight
    其中,Pic為圖片對象,如圖形控件對象等;
    DestX,DestY為目標(biāo)圖像起始坐標(biāo);
    DestWidth,DestHeight為目標(biāo)圖像幅面尺寸;
    ScrX,ScrY為源圖像起始坐標(biāo);
    ScrWidth,ScrHeight為源圖像剪裁尺寸。

該命令就是把一個源圖像資源任意復(fù)制到指定的區(qū)域,其功能相當(dāng)于API函數(shù)的BitBlt,但使用更簡單,若復(fù)制時改變源圖像的ScrWidth,ScrHeight或目標(biāo)圖像的DestWidth,DestHeight可使復(fù)制后的圖像尺寸發(fā)生變化,實現(xiàn)窗口圖像的縮放顯示。若ScrWidth,ScrHeight或DestWidth,DestHeight為負值還可實現(xiàn)窗口圖像的水平、垂直反轉(zhuǎn)顯示。因此,在把源圖像送入目標(biāo)圖形容器控件時,若改變源圖像的幅面尺寸,即可實現(xiàn)圖像的縮放處理。

三、圖像滾動

當(dāng)載入圖像尺寸大于圖形控件窗口時,為了便于瀏覽、選取必須對窗口圖像滾動操作。窗口圖像滾動可通過水平滾動控件HScroll和垂直滾動控件VScroll來實現(xiàn),通過控件的改變值HScroll.Value和VScroll.Value來控制PaintPicture命令中的源圖像坐標(biāo)ScrX和ScrY,即可實現(xiàn)窗口圖像的滾動操作。

四、圖像縮放、滾動實現(xiàn)

本文可對非壓縮BMP位圖進行縮放、滾動,非壓縮BMP位圖的寬度和高度在文件開始11H后的8個字節(jié)。若讀者需要對其它圖像格式(如jpg,TIF等)進行縮放操作,可根據(jù)本文介紹的方法對找出相應(yīng)的圖像高度和寬度即可,具體實現(xiàn)步驟如下:

1.執(zhí)行“File-->Projects”創(chuàng)建一新項目APPIMG.VBP,在FORM窗口中創(chuàng)建PictureBox、CommandButton、HScroll、VScroll等對象,調(diào)整各自位置,并設(shè)置各對象的屬性如下:
    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事件中。該程序用于讀取圖像的寬度和高度,初始化常用參數(shù),載入窗口圖像,并將圖像復(fù)制到FORM窗口的PictureBox圖形控件容器中顯示。
    Private Sub Form_Load()
        Dim FileName As String
        FileName="C:\SAMP.BMP"
        Open FileName For Binary As #1
        Get #1,19,ImageWidth:Get#1,,ImageHeight        '讀取位圖的寬度和高度
        Close #1
        DW=15*ImageWidth-ImageWin.Width           '將像點轉(zhuǎn)換為Twip(微點)
        DH=15*ImageHeight-ImageWin.Height
        ImageWin.Width=15*ImageWidth
        ImageWin.Height=15*ImageHeight
        AppImage.Autoredraw=True
        AppImage.Caption=FileName           '改變Form窗標(biāo)題
        HScroll1.SmallChange=100            '設(shè)置滾動最小步距
        VScroll1.SmallChange=100
        DX=ImageWin.Width:DY=ImageWin.Height            '設(shè)置復(fù)制圖像尺寸
        SX=ImageWin.Width:SY=ImageWin.Height
        AMP=1'設(shè)置縮放比例為1
        sWin=GetDesktopWindow()                    '獲取桌面窗口句柄
        sDC=GetDC(sWin)                                    '轉(zhuǎn)換為描述表句柄
        hd=BitBlt(ImageWin.hdc,0,0,Image.Width,Image.Height,sDC,0,0,&HCC0020)
        hd=ReleaseDC(sWin,sDC)                    '釋放窗口描述表
        AppImage.ImageWin=LoadPicture(FileName)            '載入圖像顯示
End Sub

3.在General對象的Declaration過程中聲明本程序所使用的WIN95 API函數(shù)和和過程,以及各事件程序所使用的全局變量等。
    Private Declare Function BitBlt Lib "gdi32"(ByVal hDestDC As Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As     Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32"(ByVal hwnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32"() As Long
Private Declare Function ReleaseDC Lib "user32"(ByVal hwnd As Long,ByVal hdc As Long) As Long
Dim sWin,sDC,hd
Dim ImageWidth As Long,ImageHeight As Long
Dim DX,DY,SX,SY,PX,PY,DW,DH,MX,MY,X0,Y0,AMP

4.雙擊ImageWin對象,并在MouseMove事件和Mousedown事件中輸入下面程序,用于窗口圖形的拖動滾動處理。
Private Sub ImageWin_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)
If (Button and vbLeftButton)>0 Then
'拖動鼠標(biāo)滾動圖像
MX=HScroll1.Value+(X-X0)
MY=VScroll1.Value+(Y-Y0)
If MX>0 and MX<HScroll1.Max Then HScroll1.Value=MX
If MY>0 and MY<VScroll1.Max Then VScroll1.Value=MY
End If
End Sub
Private Sub ImageWin_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
X0=X:Y0=Y'拖動鼠標(biāo)初值
End Sub

5.在ZoomIn控件和ZoomOut的Click事件中輸入下列程序,對窗口圖像進行放大、縮小處理。
Private Sub ZoonIn_Click()
If AMP<5 Then AMP=2*AMP
'放大系數(shù)小于5,則放大圖像
AppImage.ImageWin.PaintPicture ImageWin.Image,0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
End Sub
Private Sub ZoomOut_Click()
AppImage.ImageWin.Cls
'清除窗口圖像
If AMP>0.25 Then AMP=AMP/2
'放大系數(shù)大于0.25,則縮小圖像
AppImage.ImageWin.PaintPicture ImageWin.Image,0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
End Sub

6.在HScroll控件和VScroll控件的Change事件中輸入下面程序,對窗口圖像進行滾動處理。
Private Sub HScroll1_Change()
PX=HScroll1.Value*DW/HScroll1.Max
'計算水平滾動位置
AppImage.ImageWin.PaintPicture ImageWin.Image,0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
End Sub
Private Sub VScroll1_Change()
PY=VScroll1.Value*DH/VScroll1.Max
'計算垂直滾動位置
AppImage.ImageWin.PaintPicture ImageWin.Image,0,0,AMP*DX,AMP*DY,PX,PY,SX,SY
End Sub

7.在ExitButton控件的Click事件中輸入下面程序,用于結(jié)束程序、關(guān)閉窗口。
Private Sub ExitButton_Click()
        End
End Sub

五、應(yīng)用說明

窗口圖像滾動是各種數(shù)據(jù)查詢系統(tǒng)、多媒體圖形數(shù)據(jù)庫系統(tǒng)開發(fā)中的基本功能之一,本文用Windows API函數(shù)實現(xiàn)了窗口圖像縮放、滾動,該方法可適用于Visual C++等語言。本文全部程序均在WIN98環(huán)境中Visual Basic5.0下調(diào)試通過。