如何在程序中使窗口中的某个控件,比如说textbox可以拖动也可以用鼠标改变大小呢?请说的详细一些,谢谢!

解决方案 »

  1.   

    第 一 种 方 法 需 要Win32 API 函 数。 所 用 到 的API 函 数 有: Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As- POINTAPI) As Long---- 获 得 鼠 标 的 屏 幕 坐 标 放 在lpPoint 中。 
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long---- 将 屏 幕 坐 标 转 化 成 客 户 区 坐 标 系 统 的 坐 标, 转 换 后 的 坐 标 仍 在lpPoint 中。 
    ---- 新 开 一 个 工 程, 在Form1 上 放 一 个TextBox 控 件, 命 名 为Text1。 在Form 的MouseMove 事 件 中 捕 获 鼠 标 坐 标, 如 果 鼠 标 的 位 置 与Text1 的 边 界 相 距 很 近( 比 如 说50 Twips,150 效 果 比 较 好), 根 据 需 要 将 Form1 的MousePointer 属 性 值 为vbSizeNS( 垂- 直 尺 寸 线), 或vbSizeWE( 水- 平 尺 寸 线), 或vbSizeNESW( 右 上- 左 下 尺 寸 线), 或vbSizeNWSE( 左 上- 右 下 尺 寸 线)。 用 户 一 看 就 知 道 可 以 改 变 该 控 件 的 尺 寸。 而 在 其 余 区 域 则 将Form1 的MousePointer 属 性 设 成 缺 省 值(vbDefault)。 当 用 户 按 下 鼠 标 键 并 拖 动 鼠 标 时 根 据 当 前 的MousePointer 进 行 判 断 该 如 何 改 变 控 件 的 大 小。 具 体 操 作 可 参 看 附 带 的 例 程。 ---- 第 二 中 方 法 不 需 要 调 用API 函 数, 但 需 要 额 外 的 控 件。 同 样 新 开 一 个 工 程, 在Form1 上 放 一 个TextBox 控 件, 命 名 为Text1。 然 后 紧 靠Text1 的 右 侧 放 一 个 高 度 与Text1 相 同 但 宽 度 尽 量 小 的PictureBox 控 件, 命 名 为Picture1。 宽 度 要 小 到 看 不 见 立 体 效 果。 将Picture1 的MousePointer 属 性 设 置 成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---- 运 行 程 序, 将 鼠 标 移 到Text1 的 右 边 缘, 这 时 鼠 标 变 成 水- 平 尺 寸 线 的 样 式, 按 住 鼠 标 左 键 左 右 移 动 鼠 标, 你 会 看 到Text1 的 大 小 可 以 自 由 改 变。 
    ---- 以 上 只 是 举 一 些 简 单 的 例 子 说 明 定 制 控 件 尺 寸 的 基 本 方 法, 起 到 抛 砖 引 玉 的 作 用, 读 者 可 以 根 据 需 要 增 强 相 应 的 功 能, 但 要 注 意 建 立 错 误 陷 阱 捕 获 错 误。 ---- 附: ---- 第 一 种 方 法 的 源 程 序: '注释:API Function declareprivate Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint _As POINTAPI) As Long
    private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongType POINTAPI
    x As Long
    y As Long
    End TypePrivate 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 LongConst mDist = 150 '注释:150 twipsGetCursorPos 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 IfIf Button < > 1 Then Exit Sub 
    If Form1.MousePointer = vbSizeNWSE Then
    '注释:change text1注释: size
    Text1.Width = CurX - Text1.Left
    Text1.Height = CurY - Text1.Top
    End If
    If Form1.MousePointer = vbSizeWE Then
    Text1.Width = CurX - Text1.Left
    End If
    If Form1.MousePointer = vbSizeNS Then
    Text1.Height = CurY - Text1.Top
    End If
    End SubPrivate Sub Text1_MouseMove(Button As Integer, Shift As Integer, x As -Single, y As Single)
    Form1.MousePointer = vbDefault
    '注释:set default mouse pointer
    End Sub