在VB 里 ,MDI(Multiple Document Interface , 多 窗 口 程 序) 窗 體 是 這 樣 定 義 的:“MDI 窗 體 作 為 一 個 程 序 的 后 臺 窗 口 , 包 含 著MDIChild 屬 性 為True 的 窗 體” 。 在 一 個VB 程 序 中 , 至 多 只 能 存 在 一 個MDI 父 窗 體 , 可 以 有 多 個MDI 子 窗 體; 建 立 一 個MDI 父 窗 體 的 方 法 是 在VB 的File 菜 單 里 選 擇“New MDI Form” 。
在MDI 程 序 運 行 時 , 如 果 子 窗 口 具 有 菜 單 , 那 么 當 子 窗 口 被 激 活 時 , 子 窗 口 的 菜 單 就 會 自 動 替 換 父 窗 口 菜 單; 當 子 窗 口 被 最 小 化 時 , 在MDI 父 窗 口 里 就 會 出 現 子 窗 口 的 圖 標 。
Windows 的 通 用 圖 形 界 面 的 出 現 , 使 計 算 機 用 戶 不 必 通 過 專 門 的 學 習 就 可 以 得 心 應 手 地 使 用 各 種Windows 的 軟 件; 不 僅 如 此 , 它 還 是 程 序 設 計 者 在 設 計Windows 程 序 的 界 面 時 所 必 須 遵 循 的 標 準 , 這 在 很 大 程 度 上 減 輕 了 程 序 設 計 者 的 負 擔 , 使 他 們 能 夠 把 主 要 精 力 放 在 問 題 的 求 解 和 實 現 上 。
Visual Basic 的 出 現 , 更 加 簡 化 了Windows 程 序 界 面 的 設 計 工 作 , 只 需 要 極 少 量 的 代 碼 , 就 能 實 現 標 準Windows 應 用 程 序 的 界 面 。 但 是 , 如 果 不 了 解Windows 程 序 界 面 設 計 的 原 則 , 或 者 不 熟 悉VB 下 界 面 編 程 的 技 巧 , 就 難 以 設 計 和 實 現 既 符 合 一 般 標 準 又 具 有 特 色 的 界 面 。 界 面 設 計 的 原 則 界 面 設 計 具 有 一 般 性 的 原 則 , 最 為 重 要 的 有:
界 面 要 具 有 一 致 性 。 一 致 性 原 則 在 界 面 設 計 中 最 容 易 被 違 反 , 同 時 也 最 容 易 修 改 和 避 免 。 例 如 , 在 菜 單 和 聯 機 幫 助 中 必 須 使 用 相 同 的 術 語; 對 話 框 必 須 具 有 相 同 的 風 格 。
常 用 操 作 要 有 捷 徑 。 常 用 操 作 的 使 用 頻 度 大 , 應 該 減 少 操 作 序 列 的 長 度 。 例 如 , 為 文 件 的 常 用 操 作 如 打 開 、 存 盤 、 另 存 等 設 置 快 捷 鍵 。 使 常 用 操 作 具 有 捷 徑 , 不 僅 會 提 高 用 戶 的 工 作 效 率 , 還 使 得 界 面 在 功 能 實 現 上 簡 潔 和 高 效 。
提 供 簡 單 的 錯 誤 處 理 。 系 統 要 有 錯 誤 處 理 的 功 能 。 在 出 現 錯 誤 時 , 系 統 應 該 能 檢 測 出 錯 誤 , 并 且 提 供 簡 單 和 容 易 理 解 的 錯 誤 處 理 的 功 能 。 錯 誤 出 現 后 系 統 的 狀 態 不 發 生 變 化 , 或 者 系 統 要 提 供 錯 誤 恢 復 的 指 導 。
提 供 信 息 反 饋 。 對 操 作 人 員 的 重 要 操 作 要 有 信 息 反 饋 。 對 常 用 操 作 和 簡 單 操 作 的 反 饋 可 以 不 作 要 求 , 但 是 對 不 常 用 操 作 和 至 關 重 要 的 操 作 , 系 統 應 該 提 供 信 息 的 反 饋 。
操 作 可 逆 。 操 作 應 該 可 逆 。 這 對 于 不 具 備 專 門 的 知 識 的 操 作 人 員 相 當 有 用 。 可 逆 的 動 作 可 以 是 單 個 的 操 作 , 或 是 者 一 個 相 對 獨 立 的 操 作 序 列 。
設 計 良 好 的 聯 機 幫 助 。 雖 然 對 于 熟 練 用 戶 來 說 , 聯 機 幫 助 并 非 必 不 可 少 , 但 是 對 于 大 多 數 不 熟 練 用 戶 來 說 , 聯 機 幫 助 具 有 非 常 重 要 的 作 用 。 菜 單 設 計 的 原 則 和 編 程 菜 單 設 計 有 如 下 的 一 般 性 原 則: 按 照 系 統 的 功 能 來 組 織 菜 單 。
要 選 用 廣 而 淺 的 菜 單 樹 , 而 不 是 窄 而 深 的 菜 單 樹 。
根 據 菜 單 選 項 的 含 義 進 行 分 組; 并 且 按 一 定 的 規 則 排 序 。 菜 單 選 項 的 標 題 要 力 求 簡 短 、 含 義 明 確 , 并 且 最 好 以 關 鍵 詞 開 始 。
常 用 選 項 要 設 置 快 捷 鍵 。 結 合 以 上 的 原 則 , 菜 單 編 程 有 以 下 幾 方 面 的 技 術 和 技 巧:
菜 單 選 項 的 分 組 在VB 中 , 菜 單 選 項 的 分 組 是 通 過 菜 單 欄 分 隔 橫 線 實 現 的 。 在 菜 單 的 一 定 位 置 增 加 一 個Caption 屬 性 為“ ” 的 菜 單 項 , 它 在 菜 單 上 就 表 現 為 一 條 橫 線 。 在 許 多 情 況 下 , 同 一 個 功 能 菜 單 下 又 可 以 按 照 菜 單 選 項 的 功 能 分 為 幾 組 , 這 時 就 可 以 用 分 隔 橫 線 來 實 現 菜 單 項 的 分 組 。 常 用 選 項 快 捷 鍵 的 設 置 打 開 菜 單 設 計 窗 口(Menu Design Window) , 應 對 于 每 個 菜 單 選 項 有 相 應 的 快 捷 鍵(Shortcut) 列 表 , 在 該 表 中 選 擇 一 個 即 可 。 需 要 注 意 的 是 , 具 有 子 菜 單 的 菜 單 或 者 頂 層 菜 單 的 快 捷 鍵 不 能 這 樣 定 義 。 按 照Windows 的 界 面 設 計 原 則 , 頂 層 菜 單 的 快 捷 鍵 的 形 式 是Alt+ 字 母 鍵 。 它 的 實 現 方 法 在 后 文 另 敘 。 對 于 一 些 常 用 的 功 能 菜 單 項 , 有 約 定 俗 成 的 快 捷 鍵 。 例 如 , 文 件 打 開 用CTRL+O , 文 件 存 盤 用CRTL+S , 打 印 用CTRL+P , 等 等 。
為 菜 單 選 項 定 義 好 快 捷 鍵 之 后 , 菜 單 上 該 選 項 的 后 面 就 出 現 了 快 捷 鍵 的 文 字 表 示 。
菜 單 選 項 的 使 能 與 禁 止 、 可 見 與 隱 藏 為 了 表 示 菜 單 選 項 的 一 些 特 殊 功 能 , 可 能 要 用 到 菜 單 選 項 的 使 能 與 禁 止 、 可 見 與 隱 藏 屬 性 。 當 因 為 某 種 原 因 使 得 某 個 選 項 所 代 表 的 功 能 不 能 被 實 現 時 , 就 應 該 禁 止 該 選 項 被 選 中 。 菜 單 選 項 的 使 能 與 禁 止 是 通 過 改 變 改 選 項 的Enabled 屬 性 實 現 的 。 舉 例 來 說 , 假 設 菜 單 選 項 名 為nmuName , 則 禁 止 該 選 項 可 以 如 下 實 現:
mnuName.Enabled=False 同 理 , 隱 藏 一 個 選 項 可 以 用 mnuName.Visible=False 來 實 現 , 而 使 一 個 隱 藏 的 選 項 恢 復 可 見 則 用 mnuName.Visible=True 實 現 。 菜 單 項 的 隱 藏 與 恢 復 可 見 常 常 用 在 動 態 菜 單 的 實 現 中 。 菜 單 項 的 動 態 裝 入 菜 單 項 的 動 態 裝 入 是 指 菜 單 項 的 個 數 不 固 定 , 并 且 能 夠 在 需 要 時 動 態 地 裝 入 。 最 簡 單 的 例 子 就 是 文 件 菜 單 中 最 近 打 開 的 文 件 的 列 表 。 在 第 一 次 打 開 文 件 之 前 , 該 列 表 是 空 的 , 并 且 不 在 文 件 菜 單 中 出 現; 打 開 一 個 文 件 后 , 該 列 表 不 再 是 空 的 , 并 且 文 件 菜 單 中 出 現 代 表 被 打 開 文 件 的 菜 單 項 。
在 上 面 的 例 子 里 , 就 綜 合 運 用 了 菜 單 項 的 下 標 屬 性(Index) 、 標 題 屬 性(Caption) 、 可 見 屬 性 (Visible) 以 及 菜 單 項 的 裝 入 方 法(Load Method) 。
具 體 的 實 現 過 程 如 下:
在 文 件 菜 單 里 增 加 一 個 菜 單 項 , 標 題 任 意 , 并 假 設 菜 單 項 的Name 屬 性 是opened_files_list;
更 改 菜 單 項opened_files_list 的 可 見 屬 性 , 使 opened_files_list.Visible=False
更 改 菜 單 項opened_files_list 的 下 標 屬 性 , 使 opened_files_files_list.Index=0
在 程 序 中 控 制 菜 單 項opened_files_list 的 動 態 裝 入 。 假 設 要 顯 示 打 開 過 的 第 二 文 件 的 文 件 名 , 并 且 該 文 件 名 存 放 在 一 個 文 件 名 數 組opened_file_ name 里 。 以 下 的 代 碼 就 實 現 了 這 一 功 能: Load opened_files_list(1) opened_files_lise(1).Caption="&2"+opened_file_name(1) opened_files_list(1).Visible=True 需 要 注 意 的 是 , 對 于 下 標 為0 的 菜 單 項 , 不 能 用Load 方 法 。 因 為 在 程 序 執 行 時 , 該 菜 單 項 就 已 經 被 裝 入 到 內 存 里 了; 另 外 , 在 菜 單 項 的 標 題 屬 性 字 符 里 的“&” 字 符 具 有 特 殊 的 含 義 , 它 的 作 用 是 在 顯 示 該 屬 性 字 符 串 的 同 時 , 并 不 顯 示“&” 本 身 , 而 緊 跟“&” 的 字 符 在 顯 示 時 具 有 下 劃 線 , 并 且 該 字 符 成 為 熱 鍵 。
如 果 下 標 不 為0 的 菜 單 項 不 再 需 要 , 為 了 減 少 對 內 存 資 源 的 占 用 , 可 以 用Unload 方 法 把 它 從 內 存 卸 出; 同 樣 地 , 不 能 用Unload 卸 出 下 標 為0 的 菜 單 項 。
彈 出 式 菜 單 的 實 現(PopupMenu Method) VB 中 在 菜 單 設 計 窗 口(Menu Design Window) 中 設 計 的 菜 單 是 下 拉 式 菜 單 。 下 拉 式 菜 單 是 用 戶 在 任 何 時 候 都 可 以 在 頂 端 菜 單 條 上 選 擇 后 拉 出 的 菜 單 , 而 彈 出 式 菜 單 則 是 在 程 序 界 面 的 一 定 區 域 內 點 按 鼠 標 鍵 后 出 現 的 菜 單 。 在 某 些 情 況 下 , 彈 出 式 菜 單 會 使 系 統 功 能 的 實 現 更 加 簡 潔 和 高 效 , 使 用 起 來 更 加 得 心 應 手 。 Widnows 程 序 的 彈 出 式 菜 單 一 般 是 當 用 戶 在 程 序 的 桌 面 上 點 按 鼠 標 鍵 時 出 現 的 。 彈 出 式 菜 單 多 用 于 實 現 系 統 的 附 加 或 增 強 功 能 。 彈 出 式 菜 單 的 內 容 , 可 以 隨 點 按 鼠 標 鍵 的 位 置 不 同 而 變 化 。 由 于 彈 出 的 菜 單 要 覆 蓋 屏 幕 的 一 部 分 , 所 以 應 盡 量 縮 短 菜 單 里 的 文 字 。
在VB 中 , 彈 出 式 菜 單 的 實 現 要 用 到 下 拉 式 菜 單 設 計 的 技 術 和PopupMenu 方 法 。 具 體 的 做 法 是:
在 菜 單 設 計 窗 口(Menu Design Window) 里 設 計 好 相 應 窗 體 的 彈 出 式 菜 單 。 要 注 意 的 是 , 要 彈 出 的 菜 單 必 須 至 少 有 一 個 子 菜 單; 因 而 這 個 菜 單 不 能 有 快 捷 鍵 , 并 且Checked 屬 性 必 須 是False 。 再 把 彈 出 式 菜 單 的Visible 屬 性 改 為False 。
在 具 有 設 計 好 的 彈 出 式 菜 單 的 窗 體 的Form_Click 中 加 入 以 下 代 碼( 假 設 彈 出 式 菜 單 的Name 屬 性 是mnuExample): Sub Form_Click() PopupMenu mnuExample End Sub 如 果 要 求 只 有 按 下 鼠 標 左 鍵 或 者 右 鍵 才 能 激 活 菜 單 , 就 必 須 在Form_MouseDown 里 加 入 如 下 代 碼: Sub Form_MouseDown(Button As Integer,Shift As Integer,x As Single,y As Single) If Button=2 then Button=2 表 示 鼠 標 右 鍵 PopupMenu mnuExample End If PopupMenu 的 完 整 句 法 是: [Form.]PopupMenu menuname[flags[,x[,y]]]
改 變flags 的 值 可 以 控 制 彈 出 式 菜 單 的 表 現 形 式 。flags 有 兩 組 值 。 第 一 組 值 用 來 控 制 菜 單 的 顯 示 方 式 , 包 括POPUPMENU_LEFTALIGNPOPUPMENU_CENTERALIGN,POPUPMENU_RIGHTALIGN , 分 別 表 示 以x 為 左 邊 界 , 以x 為 中 心 和 以x 為 右 邊 界 的 顯 示 方 式 , 并 且 以x 為 左 邊 界 是 缺 省 的 方 式; 另 外 一 組 值 用 來 控 制 菜 單 項 的 選 中 方 式 , 包 括POPUPMENU_LEFTBUTTON 和POPUPMENU_RIGHTBUTTON , 分 別 表 示 左 鍵 選 中 和 左/ 右 鍵 選 中 均 可 , 并 且 左 鍵 選 中 是 缺 省 的 方 式 。flags 的 值 由 上 面 的 兩 組 值 經 過OR 運 算 得 出 。 例 如 , 要 求 左 對 齊 顯 示 并 且 左 鍵 選 中 為 準 , 則 應 有:
flags=POPUPMENU_LEFTALIGN OR POPUPMENU_LEFTBUTTON
x 和y 用 來 定 義 菜 單 彈 出 的 位 置 、 缺 省 是 鼠 標 點 中 的 位 置 。
菜 單 項 的 其 他 屬 性 用ALT+ 字 母 鍵 激 活 頂 層 菜 單 , 或 者 在 菜 單 激 活 后 用 字 母 鍵 激 活 一 個 菜 單 項 , 必 須 學 會 使 用& 。& 用 在 菜 單 項 的 標 題 屬 性(Caption) 里 。 它 的 用 法 和 作 用 與 在 用C 語 言 編 制 的Windows 程 序 中 的 用 法 和 作 用 相 同 。 有 時 希 望 頂 層 菜 單 之 間 的 間 隔 大 一 些 , 或 者 某 個 頂 層 菜 單 出 現 在 菜 單 條 的 最 右 端 , 這 時 就 要 用 到 標 題 屬 性 是 空 格 的 菜 單 。 如 果 一 個 菜 單 的 標 題 是 由 多 個 空 格 組 成 的 , 那 么 這 個 菜 單 在 菜 單 條 上 就 占 用 跟 空 格 的 個 數 相 應 的 空 間 , 并 且 它 后 面 的 菜 單 也 順 序 地 后 移; 如 果 這 個 菜 單 的Visible 屬 性 是False , 那 么 它 就 跟 不 存 在 一 樣 。
窗 口 設 計 的 原 則 和 舉 例 下 面 是 一 個 浮 動 窗 口 技 術 的 例 子 。 為 了 引 起 用 戶 的 注 意 , 或 者 必 須 保 證 含 有 重 要 信 息 的 窗 口 不 被 其 他 窗 口 覆 蓋 , 就 要 用 到 浮 動 窗 口 技 術 , 建 立 一 個“ 總 在 最 前 面”(TopMost) 的 窗 口 。 具 體 的 做 法 是: (1) 在VB 程 序 中 加 入 如 下 的 聲 明:
Declare Function SetWindowPos Lib"user"(Byval h%,Byval hb%,Byval x%,Byval y%,By val cx%,Byval cy%,Byval f%)As Integer Global Const SWP_NOMOVE=2 Global Const SWP_NOSIZE=1 Global Const HWND_TOPMOST= 1 Global Const HWND_NOTOPMOST= 2 Global Const FLAGS=SWP_NOMOVE Or SWP_NOSIZE
(2) 假 設 要 把 窗 體frmExample 設 置 成 總 在 最 前 面 的 窗 口 , 只 要 在frmExample 窗 體 的Form_Load
過 程 里 加 入 以 下 代 碼:
Dim success%
success=SetWindowPos(frmExample.hWnd,HWND_TOPMOST,0,0,0,0,FLAGS)
如 果 要 取 消 總 在 最 前 面 的 特 性 , 則 可 以 執 行 如 下 的 代 碼:
success=SetWindowPos(frmExample.hWnd,HWND_NOTOPMOST,0,0,0,0,FLAGS)
success 不 等 于0 表 示SetWindowPos 執 行 成 功 。
在MDI 程 序 里 , 有 一 個 窗 口 是 所 有 其 他 窗 口 的 父 窗 口 , 各 個 子 窗 口 完 成 相 對 獨 立 的 功 能 , 就 像 是 多 個 獨 立 的 工 具 組 合 起 來 一 樣 。 在 這 方 面 ,MS Word 和Windows 的File Manager 是 最 好 的 例 子 。
|