在 運 行 時 刻 創 建 可 改 變 尺 寸 的 控 件

來源:互聯網
上載者:User
我 們 可 以 將 許 多 不 同 的 控 件, 例 如 文 本 框 控 件, 添 加 到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 來 運 行 該 樣 例 程 序, 單 擊 命 令 按 鈕, 可 以 將 文 本 框 的 大 小 按 照 需 要 進 行 改 變.



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。