首页 > 开发 > 综合 > 正文

在 运 行 时 刻 创 建 可 改 变 尺 寸 的 控 件

2024-07-21 02:24:11
字体:
来源:转载
供稿:网友

商业源码热门下载www.html.org.cn

我 们 可 以 将 许 多 不 同 的 控 件, 例 如 文 本 框 控 件, 添 加 到visual basic 的 窗 体 上。 在 设 计 期 间, 可 以 调 整 控 件 的 大 小 和 位 置。 文 本 介 绍 如 何 从 一 个visual basic 应 用 程 序 中, 在 运 行 时 刻 修 改 这 些 控 件 的 尺 寸。
运 行 时 刻 重 设 控 件 的 尺 寸 ---- 当 设 计visual basic 应 用 程 序 时, 可 以 简 单 地 按 照 需 要 将 控 件 添 加 到 窗 体 上, 例 如, 文 本 框 控 件 为 程 序 提 供 了 一 个 最 小 功 能 的 字 处 理 程 序 的 特 性。
---- 控 件 的 尺 寸 必 须 在 设 计 期 间 设 置。 然 而, 通 过 使 用 两 个windows api 函 数:getwindowlong 以 及setwindowlong, 我 们 可 以 实 现 在 运 行 时 刻 改 变 一 个 控 件, 例 如 一 个 文 本 框 控 件 的 大 小。

---- 当 将 一 个 控 件, 例 如 一 个 文 本 框 控 件 添 加 到visual basic 应 用 程 序 中 时, 本 质 上 是 创 建 了 一 个 新 的 窗 口。 每 个 在windows 操 作 系 统 中 被 创 建 的 窗 口 都 具 有 某 种 与 之 相 关 的 风 格 属 性, 例 如, 一 个 文 本 框 控 件 可 能 具 有es_multiline 的 窗 口 风 格。 这 告 诉windows 该 控 件 是 一 个 多 行 编 辑 控 件。

---- 通 常, 一 个 文 本 框 控 件 不 能 在 运 行 时 刻 被 重 设 大 小。 然 而, 通 过 改 变 控 件 的 风 格 属 性, 用 户 将 能 够 在 程 序 运 行 期 间 调 整 文 本 框 的 物 理 尺 寸。

---- 这 可 以 通 过 调 用getwindowlong 和setwindowlong 函 数 来 完 成。 首 先, 调 用getwindowlong 函 数 以 提 取 该 文 本 框 控 件 当 前 的 窗 口 风 格 属 性。 其 次, 可 以 使 用or 位 操 作 符 为 该 文 本 框 控 件 设 置ws_thickframe 属 性。 一 个 具 有ws_thickframe 属 性 的 窗 口 会 在 它 的 边 界 绘 制 一 个 粗 框。 可 以 使 用 该 边 框 来 改 变 窗 口 的 大 小。

---- 然 后 运 行setwindowlong 函 数, 它 告 诉windows 修 改 文 本 框 控 件 的 风 格 属 性。

---- 最 后, 固 定 文 本 框 最 新 的 尺 寸, 以 便 它 的 新 位 置 和 尺 寸 被 注 册 在 其 下 的 窗 体 中, 可 以 调 用setwindowpos 函 数 来 完 成 这 项 工 作。

样 例 程 序 ---- 该 程 序 显 示 了 在visual basic 中, 如 何 在 运 行 时 刻 创 建 一 个 可 变 大 小 的 文 本 框 控 件。
---- 1. 在visual basic 中 开 始 一 个 新 的 工 程, 采 用 缺 省 的 方 法 建 立form1。
---- 2. 将 如 下 常 量 和 声 明 语 句 添 加 到form1 的 通 用 声 明 部 分 中( 注 意 每 个 声 明 语 句 需 要 被 书 写 在 一 行 内):

---- private declare function getwindowlong lib "user" (byval hwnd as integer, byval nindex as integer) as long
---- private declare function setwindowlong lib "user" (byval hwnd as integer, byval nindex as integer, byval dwnewlong as long) as long
---- private declare sub setwindowpos lib "user" (byval hwnd as integer, byval hwndinsertafter as integer, byval x as integer, byval y as integer, byval cx as integer, byval cy as integer, byval wflags as integer)
---- const swp_nosize = &h1
---- const swp_nozorder = &h4
---- const swp_nomove = &h2
---- const swp_drawframe = &h20
---- const gwl_style = (-16)
---- const ws_thickframe = &h40000

---- 对 于32 位 环 境 下 使 用visual basic 5.0 的 用 户, 需 要 将 如 下 声 明 语 句 添 加 到form1 的 通 用 声 明 部 分 中( 注 意 每 个 声 明 语 句 需 要 被 书 写 在 一 行 内):

---- private declare function getwindowlong lib "user32" alias "getwindowlonga" (byval hwnd as long, byval nindex as long) as long
---- private declare function setwindowlong lib "user32" alias "setwindowlonga" (byval hwnd as long, byval nindex as long, byval dwnewlong as long) as long
---- private declare function setwindowpos lib "user32" (byval hwnd as long, byval hwndinsertafter as long, byval x as long, byval y as long, byval cx as long, byval cy as long, byval wflags as long) as long
---- const swp_nosize = &h1
---- const swp_nozorder = &h4
---- const swp_nomove = &h2
---- const swp_drawframe = &h20
---- const gwl_style = (-16)
---- const ws_thickframe = &h40000

---- 3. 在form1 上 添 加 一 个 命 令 按 钮 控 件, 采 用 缺 省 的 方 法 建 立comand1。 将 它 的caption 属 性 设 置 为“ 改 变 文 本 框 控 件 大 小”

---- 4. 将 如 下 代 码 添 加 到command1 的 单 击 事 件 中:

---- private sub command1_click()
---- resizecontrol text1, form1
---- end sub

---- 5. 在form1 上 添 加 一 个 文 本 框 控 件, 采 用 缺 省 的 方 法 建 立text1。

---- 6. 创 建 一 个 名 为resizecontrol 的 新 函 数, 将 如 下 代 码 添 加 到 该 函 数 中:

---- sub resizecontrol(controlname as control, formname as form)
---- dim newstyle as long
---- newstyle = getwindowlong(controlname.hwnd, gwl_style)
---- newstyle = newstyle or ws_thickframe
---- newstyle = setwindowlong(text1.hwnd, gwl_style, newstyle)
---- setwindowpos controlname.hwnd, formname.hwnd, 0, 0, 0, 0, swp_nozorder or swp_nosize or swp_nomove or swp_drawframe
---- end sub

---- 按 下f5 来 运 行 该 样 例 程 序, 单 击 命 令 按 钮, 可 以 将 文 本 框 的 大 小 按 照 需 要 进 行 改 变.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表