?? 03.txt
字號:
VB5 實 現 窗 口 圖 像 縮 放、 滾 動 技 巧
成 都 理 工 學 院 計 算 機 工 程 系 洪 志 全
Visual Basic 是Windows 平 臺 中 最 常 用 的 應 用 軟 件 開 發 語 言, 窗 口 圖 像 縮 放、 滾 動 是 圖 像 處 理、 多 媒 體 數 據 庫 等 應 用 軟 件 開 發 中 的 基 本 功 能。 本 文 將 介 紹 如 何 用VB 5.0 實 現 地 窗 口 圖 像 縮 放 和 滾 動 技 巧, 供 讀 者 在 各 種 語 言 系 統 開 發 中 參 考。
---- 一、 獲 取 圖 像 ---- 本 文 所 介 紹 的 圖 像 縮 放 并 沒 有 對 真 正 的 圖 像 進 行 縮 放, 而 是 復 制 一 幅 窗 口 圖 像 的 真 實 畫 面, 對 這 個 窗 口 圖 像 附 本 進 行 局 部 縮 放 和 滾 動, 獲 取 窗 口 圖 像 可 使 用Windows 的API 函 數 來 實 現。 具 體 來 說, 實 現 窗 口 圖 像 縮 放、 滾 動 需 要 用GetDeskTopWindow() 函 數 獲 取 桌 面 窗 口 句 柄, 再 通 過GetDC() 函 數 轉 換 為 描 述 表 句 柄, 則 用BitBlt() 函 數 把 桌 面 圖 像 復 制 到 任 意 圖 形 容 器 控 件 中, 桌 面 圖 像 復 制 完 成 后, 再 用ReleaseDC 釋 放 窗 口 描 述 表, 各API 函 數 的 具 體 使 用 方 法 參 見 本 文 的 例 子 程 序。 ---- 本 文 所 用 的API 函 數 包 含 在WIN95/98 的GDI32.DLL 和USER32.DLL 動 態 鏈 接 庫 中, 在 使 用 時 可 通 過VB5.0 的TEXT VIEWER 復 制 到 所 開 發 的 應 用 程 序 中。 ---
- 二、 圖 像 縮 放 ---- 圖 像 縮 放 顯 示 的 基 本 原 理 就 是 把 原 圖 像 的 一 部 分 縮 放 后 再 送 入 窗 口 的 圖 形 容 器 控 件 中, 在VB 中 可 用 內 部 命 令PaintPicture 來 進 行, 語 法 格 式 為: PaintPicture Pic,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="Zoom In" CommandButton:Name = ZoomOut, Caption="Zoom Out" CommandButton:Name = ExitButton, Caption="Exit"
---- 2. 雙 擊FORM 窗 口, 并 將 下 面 程 序 輸 入 到Form 對 象 的Load 事 件 中。 該 程 序 用 于 讀 取 圖 像 的 寬 度 和 高 度, 初 始 化 常 用 參 數, 載 入 窗 口 圖 像, 并 將 圖 像 復 制 到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 '將像點轉換為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) '載入圖像顯示 End Sub
---- 3. 在General 對 象 的Declaration 過 程 中 聲 明 本 程 序 所 使 用 的WIN95 API 函 數 和 和 過 程, 以 及 各 事 件 程 序 所 使 用 的 全 局 變 量 等。 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 事 件 和Mouse_down 事 件 中 輸 入 下 面 程 序, 用 于 窗 口 圖 形 的 拖 動 滾 動 處 理。 Private Sub ImageWin_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If (Button And vbLeftButton) > 0 Then '拖動鼠標滾動圖像 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 '拖動鼠標初值 End Sub
---- 5. 在ZoomIn 控 件 和ZoomOut 的Click 事 件 中 輸 入 下 列 程 序, 對 窗 口 圖 像 進 行 放 大、 縮 小 處 理。 Private Sub ZoonIn_Click() If AMP < 5 Then AMP = 2 * AMP '放大系數小于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 '放大系數大于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 事 件 中 輸 入 下 面 程 序, 用 于 結 束 程 序、 關 閉 窗 口。 Private Sub ExitButton_Click() End End Sub
---- 五、 應 用 說 明 ---- 窗 口 圖 像 滾 動 是 各 種 數 據 查 詢 系 統、多 媒 體 圖 形 數 據 庫 系 統 開 發 中 的 基 本 功 能 之 一, 本 文 用Windows API 函 數 實 現 了 窗 口 圖 像 縮 放、 滾 動, 該 方 法 可 適 用 于Visual C++ 等 語 言。 本 文 全 部 程 序 均 在WIN98 環 境 中Visual
Basic 5.0 下 調 試 通 過。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -