VB编程中控件在窗体的位置是如何来定位的?也就是能用什么方法取得当前窗体里控件的坐标的,然后又是如何使窗体中的控件随着鼠标拖拉窗体的大小而变化的,请各位大侠帮忙,最好有实例做参考

解决方案 »

  1.   

    一个最简单例子
    Private Sub Form_Resize()
    Command1.Left = Me.Width / 2
    Command1.Top = Me.Height / 2
    End Sub
      

  2.   

    Option Explicit
    Private FormOldWidth As Long
    Private FormOldHeight As LongPublic Sub ResizeInit(FormName As Form)
    Dim Obj As Control
    FormOldWidth = FormName.ScaleWidth
    FormOldHeight = FormName.ScaleHeight
    On Error Resume Next
    For Each Obj In FormName
    Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
    Next Obj
    On Error GoTo 0
    End Sub
    Public Sub ResizeForm(FormName As Form)
    Dim Pos(4) As Double
    Dim I As Long, TempPos As Long, StartPos As Long
    Dim Obj As Control
    Dim ScaleX As Double, ScaleY As DoubleScaleX = FormName.ScaleWidth / FormOldWidth
    ScaleY = FormName.ScaleHeight / FormOldHeight
    On Error Resume Next
    For Each Obj In FormName
    StartPos = 1
    For I = 0 To 4TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
    If TempPos > 0 Then
    Pos(I) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
    StartPos = TempPos + 1
    Else
    Pos(I) = 0
    End If
    Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
    Next I
    Next Obj
    On Error GoTo 0
    End SubPrivate Sub Form_Load()
    Call ResizeInit(Me)
    End SubPrivate Sub Form_Resize()
    Call ResizeForm(Me)
    End Sub
      

  3.   

    Private FormOldWidth As Long
       '保存窗体的原始宽度
    Private FormOldHeight As Long
       '保存窗体的原始高度Public Sub ResizeInit(FormName As Form)
      Dim Obj As Control
       FormOldWidth = FormName.ScaleWidth
       FormOldHeight = FormName.ScaleHeight
       On Error Resume Next
       For Each Obj In FormName
         Obj.Tag = Obj.Left & " " & Obj.Top & " " _
               & Obj.Width & " " & Obj.Height & " "
       Next Obj
       On Error GoTo 0
    End Sub
    Public Sub ResizeForm(FormName As Form)
       Dim Pos(4) As Double
       Dim i As Long, TempPos As Long, StartPos As Long
       Dim Obj As Control
       Dim ScaleX As Double, ScaleY As Double   ScaleX = FormName.ScaleWidth / FormOldWidth
       ScaleY = FormName.ScaleHeight / FormOldHeight
       On Error Resume Next
       For Each Obj In FormName
         StartPos = 1
         For i = 0 To 4
           TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
           If TempPos > 0 Then
             Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
             StartPos = TempPos + 1
           Else
             Pos(i) = 0
           End If       Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, _
                   Pos(2) * ScaleX, Pos(3) * ScaleY
         Next i
       Next Obj
       On Error GoTo 0
    End Sub
    Private Sub Form_Resize()
       'Call ResizeForm(Me)'确保窗体改变时控件随之改变
    End Sub
    Private Sub Form_Load()
    Call ResizeInit(Me) '在程序装入时加入
    End Sub
      

  4.   

    DemonLoveLizzy(魑魅魍魉)和 aohan(陈景升) 回答的几乎一样哦,是不是网上有这方面的资料啊,我一开始也有找到过,但在调试时出了问题,大家帮我看看吧Dim frmWidth As Integer '窗体在设计状态下的比例宽度Dim frmHeight As Integer '窗体在设计状态下的比例高度Dim ctrWidth(1 to n) As Integer '设计状态下窗体上所有控件的宽度Dim ctrHeight(1 to n) As Integer '设计状态下窗体上所有控件的高度Dim ctrTop(1 to n) As Integer '设计状态下所有控件最顶端在窗体上的纵坐标Dim ctrLeft(1 to n) As Integer '设计状态下所有控件最顶端在窗体上的纵坐标Dim blnResizeOk As Boolean '控件自动调整的开始标记Private Sub Form_Load()Dim I as IntegerDim ix as integerDim mControl as controlOn Error GoTo ERR_HANDLEBlnResizeOk=false '控件自动调整设置为假Me.width=Me![txtFormWidth].text '将窗体的宽度设定为具体要求的宽度Me.height= Me![txtFormHeight].text '将窗体的高度设定为具体要求的宽度frmWidth=Me.scalewidthfrmHeight=Me.scaleheightI=1'x1、y1表示该控件的位置,x2、y2表示相应的宽度和高度For Each mcontrol In Me.ControlsIx=mcontrol.x1  <---(运行到这里编译就出了问题,说"run-time error 438 "object doesn't support this property or method)'如果没有发生错误        If err.number=0 then           CtrWidth(I)=mControl.x2           CtrHeight(I)=mControl.y2           CtrTop(I)= mControl.y1           CtrLeft(I)= mControl.x1        '如果发生了错误        Else           CtrWidth(I)=mControl. Width           CtrHeight(I)=mControl. Height           CtrTop(I)= mControl. Top           CtrLeft(I)= mControl. Left        End if        I=I+1    Next    BlnResizeOk=true '控件自动调整设置为真    Exit sub    '出错处理    ERR_HANDLE:      MsgBox "发生错误,请重试", 1 + vbExclamation    End SubPrivate Sub Form_Resize()      Dim I as Integer      Dim ix as integer      Dim hScale as Double      Dim vScale as Double      Dim mControl as control      On Error GoTo ERR_HANDLE      If blnResizeOk=true then'控件自动调整标志为真      '利用窗体的新尺寸和原始尺寸相除得到窗体的横向变化比例和纵向变化比例       Hscale= scalewidth/frmWidth       vScale =scaleheight/frmHeight       I=1       For Each mcontrol In Me.Controls         Ix=mcontrol.x1         '如果没有发生错误            If err.number=0 then               mControl.x1= CtrLeft(I)* hScale                mControl.Y1= CtrTop(I)* vScale               mControl.X2= CtrWidth(I)* hScale               mControl.Y2= CtrHeight(I)* vScale            '如果发生了错误            Else               mControl. Width =CtrWidth(I) * hScale                mControl. Height= CtrHeight(I) * vScale               mControl. Top= CtrTop(I) * vScale               mControl. Left= CtrLeft(I) * hScale            End if            I=I+1        Next    End if    Exit sub    '出错处理    ERR_HANDLE:      MsgBox "发生错误,请重试", 1 + vbExclamation    End Sub
      

  5.   

    //Ix=mcontrol.x1  <---(运行到这里编译就出了问题,说"run-time error 438 "object doesn't support this property or method)X1是什么?没听说过哪个控件有这样的属性或方法。
      

  6.   

    对啊,我也纳闷,X1不是mcontrol的有效方法和属性,导致我程序不能正常运行了,但这X1在前面的程序里很关键,是为了取得当前控件位置的,所以我想知道有什么方法能代替mcontrol.X1的作用,或是知道mcontrol.X1的意思,怎么解决此类问题啊?大家帮忙啦,关键时刻哦
      

  7.   

    yingziyu_vb(影子鱼/菜鱼)什么控件那么好用啊,能按比例缩放窗体内所有控件啊?推荐一个吧
      

  8.   

    zyl910(910:分儿,我又来了!) 如果按你的方法,具体怎么实施啊?最好给个实例便于理解,谢谢
      

  9.   

    同意zyl910(910:分儿,我又来了!) 意见如居右的按钮:
    Private Sub Form_Resize()
    command1.left = me.width - command1.width - 90
    end sub
      

  10.   

    我给你个很好的实例你看看。
    http://www.96116.net/6/autoresize.zip
      

  11.   

    给你做个参考:'--------------------引自-------------------
    '一 劳 永 逸 让VB 自 动 改 变 控 件 大 小
    '深 圳 市 东 门 茂 业 百 货11 楼
    '邓 勇
    '-------------------------------------------
    Option Explicit
    '定义 FormOldWidth, FormOldHeight 为全局变量,这样其他模块才能调用它
    Global FormOldWidth, FormOldHeight'在调用ResizeForm前先调用本函数
    Public Sub ResizeInit(FormName As Form)
     
     'Control是一个对象,表示所有 Visual Basic 内部控件的类名。
     '可以将一个变量标为 Control 对象,象引把控件放到窗体上的一样来引用它。例如:
     'Dim C As Control
     'Set C = Command1
     Dim Obj As Control
     FormOldWidth = FormName.ScaleWidth
     FormOldHeight = FormName.ScaleHeight
     On Error Resume Next
     
     'Each是一个关键字,作用是针对一个数组或集合中的每个元素,重复执行一组语句。
     '语法
     'For Each element In Group
     For Each Obj In FormName
       'Tag返回或设置一个表达式用来存储程序中需要的额外数据。
       Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
     Next Obj
     On Error GoTo 0End Sub'按比例改变表单内各元件的大小,
    '在调用ReSizeForm前先调用ReSizeInit函数
    Public Sub ResizeForm(FormName As Form)
     Dim Pos(4) As Double
     Dim i As Long, TempPos As Long, StartPos As Long
     Dim Obj As Control
     Dim ScaleX As Double, ScaleY As Double
     
     '保存窗体宽度缩放比例
     ScaleX = FormName.ScaleWidth / FormOldWidth
     '保存窗体高度缩放比例
     ScaleY = FormName.ScaleHeight / FormOldHeight
       
     On Error Resume Next
     
     For Each Obj In FormName
       StartPos = 1
       
       '读取控件的原始位置与大小
       For i = 0 To 4
         'InStr函数,返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。语法:InStr([start, ]string1, string2[, compare])
         TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
         If TempPos > 0 Then
           'Mid函数,返回Variant (String),其中包含字符串中指定数量的字符。语法:Mid(string, start[, length])
           Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
           StartPos = TempPos + 1
         Else
           Pos(i) = 0
         End If
         
         '根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
         'Move方法,用以移动 MDIForm、Form 或控件。语法:object.Move Left, Top, Width, Height
         Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
       
       Next i
     Next Obj
     On Error GoTo 0End Sub
    '--------------------------------------
    '           自 动 改 变 控 件 大 小
    '--------------------------------------
    '            洪恩在线 求知无限
    '--------------------------------------
    '本例实现一个控件大小随窗体大小改变而自动改变的文本编辑器
    '------名称-------------作用------------
    '       Form1           主窗体
    '       CmdOpen         通用对话框
    '       RichTextBox1    RichTextBox
    '       mnuNew          “新建”菜单项
    '       mnuOpen         “打开”菜单项
    '       mnuSave         “保存”菜单项
    '       mnuExit         “退出”菜单项
    '       mnuFont         “字体”菜单项
    '       mnuPrint        “打印”菜单项
    '       mnuFind         “查找”菜单项
    '       mnuNext         “查找下一个”菜单项
    '------变量-------------作用-------------
    '       sFind           待查找的字符串
    '---------------------------------------
    Option Explicit
    Private FormOldWidth As Long
        '保存窗体的原始宽度
    Private FormOldHeight As Long
        '保存窗体的原始高度
    Public sFind As String'在程序装入时必须加入
    Private Sub Form_Load()
    Call ResizeInit(Me)
    End Sub'当“退出”菜单项被点击时
    Private Sub mnuExit_Click()
    Unload Me
    End
    End Sub'当“查找”菜单项被点击时
    Private Sub mnuFind_Click()
    'InputBox("弹出的输入框的标题",[默认值], [返回的值])
    '语法:InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
    sFind = InputBox("Find what?", , sFind)
    'RichTextBox1.Find 是一个方法,根据给定的字符串,在 RichTextBox 控件中搜索文本
    RichTextBox1.Find sFind
    End Sub'当“字体”菜单项被点击时
    Private Sub mnuFont_Click()
    '显示“字体”对话框
    '使用指定的方法,CommonDialog 控件能够显示下列对话。
    '----------------------------------------
    '方法         所显示的对话框
    '----------------------------------------
    'ShowOpen    显示“打开”对话框
    'ShowSave    显示“另存为”对话框
    'ShowColor   显示“颜色”对话框
    'ShowFont    显示“字体”对话框
    'ShowPrinter 显示“打印”或“打印选项”对话框
    'ShowHelp    调用 Windows 帮助引擎
    '----------------------------------------
    CmdOpen.Flags = cdlCFBoth + cdlCFEffects
    CmdOpen.ShowFont
    '将RichTextBox1的属性根据“字体”对话框的变化作相应设置
    '----------------------------------------
    '要改变 RichTextBox 控件中的字体特性,可以使用
    'SelFontName、SelFontSize 和 SelFontColor 属性。
    '----------------------------------------
    With RichTextBox1
        .SelFontName = CmdOpen.FontName
        .SelFontSize = CmdOpen.FontSize
        .SelBold = CmdOpen.FontBold
        .SelItalic = CmdOpen.FontItalic
        .SelStrikeThru = CmdOpen.FontStrikethru
        .SelUnderline = CmdOpen.FontUnderline
    End With
    End Sub'当“新建”菜单项被点击时,设置为空
    Private Sub mnuNew_Click()
    RichTextBox1.Text = ""
    End Sub'当“查找下一个”菜单项被点击时
    Private Sub mnuNext_Click()
    'SelStart属性-返回或设置所选择的文本的起始点;如果没有文本被选中,则指出插入点的位置。
    RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1
    'object.Find(string, start, end, options)
    '------------------------------------------
    'Find 方法的语法包含下面部分:
    '部分        描述
    '-----------------------------------------
    'object     必需的。对象表达式,其值是“应用于”列表中的一个对象。
    'string     必需的。要在控件中查找的字符串表达式。
    'start      可选的。决定从哪儿开始搜索的整数字符索引。控件中的每一个字符都有一个可唯一标识的整数索引。控件中文本的第一个字符的索引是 0。
    'end        可选的。决定在哪儿结束搜索的整数字符索引。
    'options    可选的。用来指定一个或多个可选功能常数的和。所指定的功能如“设置值”中所述。
    '-----------------------------------------
    RichTextBox1.Find sFind, , Len(RichTextBox1)
    End Sub'当“打开”菜单项被点击时
    Private Sub mnuOpen_Click()
    '参看上面CommonDialog方法
    CmdOpen.ShowOpen
    'RichTextBox的LoadFile方法
    RichTextBox1.LoadFile (CmdOpen.FileName)
    End Sub'当“打印”菜单项被点击时
    Private Sub mnuPrint_Click()
    CmdOpen.Flags = cdlPDReturnDC + cdlPDNoPageNums
    If RichTextBox1.SelLength = 0 Then
        CmdOpen.Flags = CmdOpen.Flags + cdlPDAllPages
    Else
        CmdOpen.Flags = CmdOpen.Flags + cdlPDSelection
    End If
    '参看上面CommonDialog方法
    CmdOpen.ShowPrinter
    '将 RichTextBox 控件中格式化文本发送给设备进行打印。
    '语法
    'object.SelPrint (hDC)
    'SelPrint 方法的语法包含下面部分:
    '部分         描述
    '-----------------------------------------------
    'object       对象表达式,其值是“应用于”列表中的一个对象。
    'hdc          设备描述体,是准备用来打印控件内容的设备。
    '-----------------------------------------------
    RichTextBox1.SelPrint CmdOpen.hDC
    End Sub'当“保存”菜单项被点击时
    Private Sub mnuSave_Click()
    CmdOpen.ShowSave
    'RichTextBox的SaveFile方法,保存文本
    RichTextBox1.SaveFile (CmdOpen.FileName)
    End Sub'确保窗体改变时控件随之改变
    Private Sub Form_Resize()
     Call ResizeForm(Me)
    End Sub
      

  12.   

    FormSize.ocx好象叫这个,以前一个人介绍给我的。不过你已经解决了,恭喜你