冰天雪地软件 严冬
---- 在VISUAL BASIC 中 没 有 什 么 命 令 或 函 数 能 够 实 现 将 一 个 位 图 旋 转 一 个 角 度 后 显 示 出 来, 但 我 们 可 以 用 画 点 的 方 式, 将 一 个 图 画 盒 中 的 位 图 中 的 像 素 点 旋 转 一 个 角 度 后 画 入 另 一 个 图 画 盒 中, 当 源 图 画 盒 中 的 像 素 都 被 画 到 目 标 图 画 盒 中 时, 也 就 完 成 了 位 图 的 旋 转。
---- 这 里 主 要 用 到 了VISUAL BASIC 中 的 两 个 方 法:POINT 方 法 和PSET 方 法。POINT 方 法 的 作 用 是 从 源 图 画 盒 中 提 取 一 个 像 素 点 的 颜 色 值; 而PSET 方 法 的 作 用 是 按 照 旋 转 后 的 坐 标 和 相 应 像 素 点 的 颜 色 值 在 目 标 图 画 盒 中 画 点。 显 然 这 个 方 法 的 速 度 不 会 太 快, 因 而 适 用 于 较 小 的 图 片。 下 面 介 绍 一 下 实 现 方 法:
---- 进 入VISUAL BASIC 中, 建 立 一 个 新 的 窗 体。 在 窗 体 中 加 入 两 个 图 画 盒 控 件(Picture1 和Picture2), 设 置 它 们 的Name 属 性 为PicSource 和PicTarget, 并 为PicSource 图 画 盒 的 Picture 属 性 设 置 一 幅 位 图。 再 在 窗 体 中 加 入 一 个 按 钮(CommandRotorate), 设 置 它 的 Caption 属 性 为“ 旋 转”。 然 后 加 入 以 下 代 码:
Option Explicit
Const Pi = 3.14
Private Sub CommandRototate_Click()
Dim x As Integer, y As Integer
Dim X1 As Integer, Y1 As Integer
Dim X2 As Double, Y2 As Double
Dim X3 As Double, Y3 As Double
Dim JiaoDu As Double
Dim HuDu As Double
JiaoDu = 45 注释: 角 度
HuDu = JiaoDu * Pi / 180 注释: 弧 度
PicSource.ScaleMode = vbPixels
PicTarget.ScaleMode = vbPixels
For x = 0 To PicTarget.ScaleWidth
X1 = x - PicTarget.ScaleWidth \ 2
For y = 0 To PicTarget.ScaleHeight
Y1 = y - PicTarget.ScaleHeight \ 2
X2 = X1 * Cos(-HuDu) + Y1 * Sin(-HuDu)
Y2 = Y1 * Cos(-HuDu) - X1 * Sin(-HuDu)
X3 = X2 + PicSource.ScaleWidth \ 2
Y3 = Y2 + PicSource.ScaleHeight \ 2
If X3 > 0 And X3 < PicSource.Scale
Width - 1 And Y3 > 0 And Y3
< PicSource.ScaleHeight - 1 Then
PicTarget.PSet (x, y), PicSource.Point(X3, Y3)
End If
Next y
Next x
End Sub
---- 运 行 后, 按 下“ 旋 转” 按 钮, 可 以 见 到 源 图 画 盒 中 的 位 图 旋 转45 度 后 进 入 到 目 标 图 画 盒 中。 如 果 要 改 变 旋 转 的 角 度, 只 需 将JiaoDu 变 量 设 置 为 相 应 值 即 可。