我想写一个编辑程序,就像VB的设计阶段时的窗体,(当把一个控件添加到这个窗体上时,可以改变其上的任意一个控件的大小),就是说怎样去获得一个控件的托动句柄?(即得到这个托动句柄后,便可以改变窗体上控件的大小)

解决方案 »

  1.   

    一定需要用句柄吗?
    dim ctr as Control
    for each ctr in me
        ....
    next
    如果只是想改变控件的外形,我想,这样也可以做到吧!
      

  2.   

    通过回调,判断mouse_click,通过activecontrol获得当前点中的控件
    拖动的代码
    Option Explicit
    Private Const GWL_STYLE = (-16)
    Private Const WS_THICKFRAME = &H40000
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOZORDER = &H4
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_DRAWFRAME = &H20Private 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 LongPrivate Sub ControlSize(ControlName As Control, SetTrue As Boolean)
        Dim dwStyle As Long
        dwStyle = GetWindowLong(ControlName.hwnd, GWL_STYLE)
        If SetTrue Then
          dwStyle = dwStyle Or WS_THICKFRAME
        Else
          dwStyle = dwStyle - WS_THICKFRAME
        End If
        dwStyle = SetWindowLong(ControlName.hwnd, GWL_STYLE, dwStyle)
        SetWindowPos ControlName.hwnd, ControlName.Parent.hwnd, 0, 0, 0, 0, SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME
    End Sub
      

  3.   

    兄台:你的这个想法我也知道:我以前写的代码如下:
    'Option Explicit
    'Public Const SWP_NOSIZE = &H1
    'Public Const SWP_NOZORDER = &H4
    'Public Const SWP_NOMOVE = &H2
    'Public Const SWP_FRAMECHANGED = &H20        '  The frame changed: send WM_NCCALCSIZE
    'Public Const GWL_STYLE = (-16)
    'Public Const WS_THICKFRAME = &H40000
    'Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED
    'Public n As Long
    '
    'Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    'Public 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
    'Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    ''Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    ''****************************************************************************
    ''GetWindowLong函数
    ''说明
    ''从指定窗口的结构中取得信息
    ''返回值
    ''Long,由nIndex决定。零表示出错。会设置GetLastError
    ''参数表
    ''参数 类型及说明
    ''hwnd Long,欲为其获取信息的窗口的句柄
    ''nIndex Long,欲取回的信息,可以是下述任何一个常数:
    '    'GWL_EXSTYLE 扩展窗口样式
    '    'GWL_STYLE 窗口样式
    '    'GWL_WNDPROC 该窗口的窗口函数的地址
    '    'GWL_HINSTANCE 拥有窗口的实例的句柄
    '    'GWL_HWNDPARENT 该窗口之父的句柄?不要用SetWindowWord来改变这个值
    '    'GWL_ID 对话框中一个子窗口的标识符
    '    'GWL_USERDATA 含义由应用程序规定
    '    'DWL_DLGPROC 这个窗口的对话框函数地址
    '    'DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值
    '    'DWL_USER 含义由应用程序规定
    ''函数功能:动态改变窗体中的控件尺寸,注意API的调用
    'Public Sub ResizeControl(ctlName As Control, frmName As Form)
    '  Dim NewStyle As Long
    ''  Dim n As Long
    '  '获取控件当前风格
    '  NewStyle = GetWindowLong(ctlName.hwnd, GWL_STYLE)
    ''  n = NewStyle
    '  '将控件的当前风格与风格WS_THICKFRAME进行OR操作,以便为控件的边界绘制粗框
    '  NewStyle = NewStyle Or WS_THICKFRAME
    '  '修改控件的风格属性
    '  NewStyle = SetWindowLong(ctlName.hwnd, GWL_STYLE, NewStyle)
    '  '固定控件的最新尺寸
    '  SetWindowPos ctlName.hwnd, frmName.hwnd, 0, 0, 0, 0, SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME
    'End Sub
    像这种办法,还是不好,在程序运行时,一担控件附加上框后,就不能去框?再者,我想像VB一样,在一个控件上加上8个点?你有什么办法吗?
      

  4.   

    兄台:你的方法是可以,以前我也写了相似的一段代码,我写在上面,您看看!
       我最想的是,能否用一个API,在程序运行时,能像VB一样,在一个控件的上面加上8个点(鼠标的托动方向)?如果能的话,兄台可告诉一声否?谢了!