VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB5 实 现 窗 口 图 像 缩 放、 滚 动 技 巧
发表评论(0)作者:, 平台:, 阅读:11759, 日期:2000-03-12
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 下 调 试 通 过。