通 常 我 們 在 設(shè) 計 應(yīng) 用 程 序 時 可 以 任 意 改 變 控 件 的 大 小( 除 去 象Timer 這 樣 的 運(yùn) 行 時 不 可 顯 示 的 控 件), 以 使 其 滿 足 我 們 的 實 際 需 要, 使 界 面 友 好 而 且 美 觀 大 方。 但 有 些 時 候, 我 們 為 了 方 便 用 戶, 需 要 提 供 在 運(yùn) 行 時 刻 能 夠 改 變 控 件 大 小 的 功 能, 使 用 戶 能 夠 根 據(jù) 程 序 顯 示, 輸 出 的 需 要 通 過 鼠 標(biāo) 的 拖 放 改 變 控 件 的 大 小, 從 而 方 便 用 戶 的 閱 讀 瀏 覽 等。 本 文 就 此 向 諸 位 介 紹 兩 種 方 法 來 達(dá) 到 此 目 的。
---- 我 們 知 道, 運(yùn) 行 時 刻 可 見 的 控 件 都 具 有Top,Left,Height,Width 等 屬 性, 用 以 定 位 其 在 窗 體 上 的 位 置 及 大 小, 在 運(yùn) 行 時 刻 改 變 控 件 大 小 的 原 理 也 基 于 此。 通 過 鼠 標(biāo) 的 拖 放 等 操 作, 動 態(tài) 改 變 控 件 的Top,Left,Bottom,Height 屬 性 值, 從 而 定 制 控 件 的 大 小, 甚 至 拖 動 整 個 控 件。
---- 第 一 種 方 法 需 要Win32 API 函 數(shù)。 所 用 到 的API 函 數(shù) 有:
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As- POINTAPI) As Long
---- 獲 得 鼠 標(biāo) 的 屏 幕 坐 標(biāo) 放 在lpPoint 中。
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
---- 將 屏 幕 坐 標(biāo) 轉(zhuǎn) 化 成 客 戶 區(qū) 坐 標(biāo) 系 統(tǒng) 的 坐 標(biāo), 轉(zhuǎn) 換 后 的 坐 標(biāo) 仍 在lpPoint 中。
---- 新 開 一 個 工 程, 在Form1 上 放 一 個TextBox 控 件, 命 名 為Text1。 在Form 的MouseMove 事 件 中 捕 獲 鼠 標(biāo) 坐 標(biāo), 如 果 鼠 標(biāo) 的 位 置 與Text1 的 邊 界 相 距 很 近( 比 如 說50 Twips,150 效 果 比 較 好), 根 據(jù) 需 要 將 Form1 的MousePointer 屬 性 值 為vbSizeNS( 垂- 直 尺 寸 線), 或vbSizeWE( 水- 平 尺 寸 線), 或vbSizeNESW( 右 上- 左 下 尺 寸 線), 或vbSizeNWSE( 左 上- 右 下 尺 寸 線)。 用 戶 一 看 就 知 道 可 以 改 變 該 控 件 的 尺 寸。 而 在 其 余 區(qū) 域 則 將Form1 的MousePointer 屬 性 設(shè) 成 缺 省 值(vbDefault)。 當(dāng) 用 戶 按 下 鼠 標(biāo) 鍵 并 拖 動 鼠 標(biāo) 時 根 據(jù) 當(dāng) 前 的MousePointer 進(jìn) 行 判 斷 該 如 何 改 變 控 件 的 大 小。 具 體 操 作 可 參 看 附 帶 的 例 程。
---- 第 二 中 方 法 不 需 要 調(diào) 用API 函 數(shù), 但 需 要 額 外 的 控 件。 同 樣 新 開 一 個 工 程, 在Form1 上 放 一 個TextBox 控 件, 命 名 為Text1。 然 后 緊 靠Text1 的 右 側(cè) 放 一 個 高 度 與Text1 相 同 但 寬 度 盡 量 小 的PictureBox 控 件, 命 名 為Picture1。 寬 度 要 小 到 看 不 見 立 體 效 果。 將Picture1 的MousePointer 屬 性 設(shè) 置 成9 (vbSizeWE) 。
---- Picture1 的MouseMove 事 件 如 下:
Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, x As Single, y-As Single)
If Button< >1 Then Exit Sub
Picture1.Left=Picture1.Left+X
‘Move Picture
Text1.Width=Picture1.Left-Text1.Left
’Change TextBox’s size
End Sub
---- 運(yùn) 行 程 序, 將 鼠 標(biāo) 移 到Text1 的 右 邊 緣, 這 時 鼠 標(biāo) 變 成 水- 平 尺 寸 線 的 樣 式, 按 住 鼠 標(biāo) 左 鍵 左 右 移 動 鼠 標(biāo), 你 會 看 到Text1 的 大 小 可 以 自 由 改 變。
---- 以 上 只 是 舉 一 些 簡 單 的 例 子 說 明 定 制 控 件 尺 寸 的 基 本 方 法, 起 到 拋 磚 引 玉 的 作 用, 讀 者 可 以 根 據(jù) 需 要 增 強(qiáng) 相 應(yīng) 的 功 能, 但 要 注 意 建 立 錯 誤 陷 阱 捕 獲 錯 誤。
---- 附:
---- 第 一 種 方 法 的 源 程 序:
’API Function declare
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint _As POINTAPI) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Type POINTAPI
x As Long
y As Long
End Type
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, - y As Single)
Dim Pnt As POINTAPI
Dim CurX As Long
Dim CurY As Long
Dim DistX As Long
Dim DistY As Long
Const mDist = 150 ’150 twips
GetCursorPos Pnt
’Get mouse position
ScreenToClient Me.hwnd, Pnt
’Convert to client coordinate
CurX = Pnt.x * Screen.TwipsPerPixelX
’Pixels to Twips
CurY = Pnt.y * Screen.TwipsPerPixelY
DistX = Abs(CurX - (Text1.Left + Text1.Width))
’distance to text1’s
DistY = Abs(CurY - (Text1.Top + Text1.Height))
If DistX < = mDist And DistY < = mDist Then
’set mouse pointer
’according to distance
Form1.MousePointer = vbSizeNWSE
ElseIf DistX < = mDist And DistY > mDist Then
Form1.MousePointer = vbSizeWE
ElseIf DistX > mDist And DistY < = mDist Then
Form1.MousePointer = vbSizeNS
Else
Form1.MousePointer = vbDefault
End If
If Button < > 1 Then Exit Sub
If Form1.MousePointer = vbSizeNWSE Then
’change text1’ size
Text1.Width = CurX - Text1.Left
---- 我 們 知 道, 運(yùn) 行 時 刻 可 見 的 控 件 都 具 有Top,Left,Height,Width 等 屬 性, 用 以 定 位 其 在 窗 體 上 的 位 置 及 大 小, 在 運(yùn) 行 時 刻 改 變 控 件 大 小 的 原 理 也 基 于 此。 通 過 鼠 標(biāo) 的 拖 放 等 操 作, 動 態(tài) 改 變 控 件 的Top,Left,Bottom,Height 屬 性 值, 從 而 定 制 控 件 的 大 小, 甚 至 拖 動 整 個 控 件。
---- 第 一 種 方 法 需 要Win32 API 函 數(shù)。 所 用 到 的API 函 數(shù) 有:
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As- POINTAPI) As Long
---- 獲 得 鼠 標(biāo) 的 屏 幕 坐 標(biāo) 放 在lpPoint 中。
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
---- 將 屏 幕 坐 標(biāo) 轉(zhuǎn) 化 成 客 戶 區(qū) 坐 標(biāo) 系 統(tǒng) 的 坐 標(biāo), 轉(zhuǎn) 換 后 的 坐 標(biāo) 仍 在lpPoint 中。
---- 新 開 一 個 工 程, 在Form1 上 放 一 個TextBox 控 件, 命 名 為Text1。 在Form 的MouseMove 事 件 中 捕 獲 鼠 標(biāo) 坐 標(biāo), 如 果 鼠 標(biāo) 的 位 置 與Text1 的 邊 界 相 距 很 近( 比 如 說50 Twips,150 效 果 比 較 好), 根 據(jù) 需 要 將 Form1 的MousePointer 屬 性 值 為vbSizeNS( 垂- 直 尺 寸 線), 或vbSizeWE( 水- 平 尺 寸 線), 或vbSizeNESW( 右 上- 左 下 尺 寸 線), 或vbSizeNWSE( 左 上- 右 下 尺 寸 線)。 用 戶 一 看 就 知 道 可 以 改 變 該 控 件 的 尺 寸。 而 在 其 余 區(qū) 域 則 將Form1 的MousePointer 屬 性 設(shè) 成 缺 省 值(vbDefault)。 當(dāng) 用 戶 按 下 鼠 標(biāo) 鍵 并 拖 動 鼠 標(biāo) 時 根 據(jù) 當(dāng) 前 的MousePointer 進(jìn) 行 判 斷 該 如 何 改 變 控 件 的 大 小。 具 體 操 作 可 參 看 附 帶 的 例 程。
---- 第 二 中 方 法 不 需 要 調(diào) 用API 函 數(shù), 但 需 要 額 外 的 控 件。 同 樣 新 開 一 個 工 程, 在Form1 上 放 一 個TextBox 控 件, 命 名 為Text1。 然 后 緊 靠Text1 的 右 側(cè) 放 一 個 高 度 與Text1 相 同 但 寬 度 盡 量 小 的PictureBox 控 件, 命 名 為Picture1。 寬 度 要 小 到 看 不 見 立 體 效 果。 將Picture1 的MousePointer 屬 性 設(shè) 置 成9 (vbSizeWE) 。
---- Picture1 的MouseMove 事 件 如 下:
Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, x As Single, y-As Single)
If Button< >1 Then Exit Sub
Picture1.Left=Picture1.Left+X
‘Move Picture
Text1.Width=Picture1.Left-Text1.Left
’Change TextBox’s size
End Sub
---- 運(yùn) 行 程 序, 將 鼠 標(biāo) 移 到Text1 的 右 邊 緣, 這 時 鼠 標(biāo) 變 成 水- 平 尺 寸 線 的 樣 式, 按 住 鼠 標(biāo) 左 鍵 左 右 移 動 鼠 標(biāo), 你 會 看 到Text1 的 大 小 可 以 自 由 改 變。
---- 以 上 只 是 舉 一 些 簡 單 的 例 子 說 明 定 制 控 件 尺 寸 的 基 本 方 法, 起 到 拋 磚 引 玉 的 作 用, 讀 者 可 以 根 據(jù) 需 要 增 強(qiáng) 相 應(yīng) 的 功 能, 但 要 注 意 建 立 錯 誤 陷 阱 捕 獲 錯 誤。
---- 附:
---- 第 一 種 方 法 的 源 程 序:
’API Function declare
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint _As POINTAPI) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Type POINTAPI
x As Long
y As Long
End Type
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, - y As Single)
Dim Pnt As POINTAPI
Dim CurX As Long
Dim CurY As Long
Dim DistX As Long
Dim DistY As Long
Const mDist = 150 ’150 twips
GetCursorPos Pnt
’Get mouse position
ScreenToClient Me.hwnd, Pnt
’Convert to client coordinate
CurX = Pnt.x * Screen.TwipsPerPixelX
’Pixels to Twips
CurY = Pnt.y * Screen.TwipsPerPixelY
DistX = Abs(CurX - (Text1.Left + Text1.Width))
’distance to text1’s
DistY = Abs(CurY - (Text1.Top + Text1.Height))
If DistX < = mDist And DistY < = mDist Then
’set mouse pointer
’according to distance
Form1.MousePointer = vbSizeNWSE
ElseIf DistX < = mDist And DistY > mDist Then
Form1.MousePointer = vbSizeWE
ElseIf DistX > mDist And DistY < = mDist Then
Form1.MousePointer = vbSizeNS
Else
Form1.MousePointer = vbDefault
End If
If Button < > 1 Then Exit Sub
If Form1.MousePointer = vbSizeNWSE Then
’change text1’ size
Text1.Width = CurX - Text1.Left