窗体控件大小随窗体大小变化而变化

原创 2004年04月26日 12:59:00

有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。

在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如:

Private Sub Form_Resize()
Dim H, i As Integer
On Error Resume Next
Resize_ALL Me   'Me是窗体名,Form1,Form2等等都可以

End Sub

在模块中添加以下代码:

Public Type ctrObj
       Name As String
       Index As Long
       Parrent As String
       Top As Long
       Left As Long
       Height As Long
       Width As Long
       ScaleHeight As Long
       ScaleWidth As Long
End Type

Private FormRecord() As ctrObj
Private ControlRecord() As ctrObj
Private bRunning As Boolean
Private MaxForm As Long
Private MaxControl As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ReleaseCapture Lib "USER32" () As Long
Function ActualPos(plLeft As Long) As Long


              If plLeft < 0 Then
                     ActualPos = plLeft + 75000
              Else
                     ActualPos = plLeft
              End If

End Function


Function FindForm(pfrmIn As Form) As Long

       Dim i As Long
       FindForm = -1

              If MaxForm > 0 Then

                            For i = 0 To (MaxForm - 1)

                                          If FormRecord(i).Name = pfrmIn.Name Then
                                                 FindForm = i
                                                 Exit Function
                                          End If

                            Next i

              End If

End Function


Function AddForm(pfrmIn As Form) As Long

       Dim FormControl As Control
       Dim i As Long
       ReDim Preserve FormRecord(MaxForm + 1)

              FormRecord(MaxForm).Name = pfrmIn.Name

                            FormRecord(MaxForm).Top = pfrmIn.Top

                                          FormRecord(MaxForm).Left = pfrmIn.Left

                                                        FormRecord(MaxForm).Height = pfrmIn.Height

                                                                      FormRecord(MaxForm).Width = pfrmIn.Width
                                                                                    FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight

                                                                                                  FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth
                                                                                                         AddForm = MaxForm
                                                                                                         MaxForm = MaxForm + 1

                                                                                                                For Each FormControl In pfrmIn
                                                                                                                       i = FindControl(FormControl, pfrmIn.Name)

                                                                                                                              If i < 0 Then
                                                                                                                                     i = AddControl(FormControl, pfrmIn.Name)
                                                                                                                              End If

                                                                                                                Next FormControl

                                                                                                  End Function


Function FindControl(inControl As Control, inName As String) As Long

       Dim i As Long
       FindControl = -1

              For i = 0 To (MaxControl - 1)

                            If ControlRecord(i).Parrent = inName Then
                                          If ControlRecord(i).Name = inControl.Name Then
                                                 On Error Resume Next

                                                        If ControlRecord(i).Index = inControl.Index Then
                                                               FindControl = i
                                                               Exit Function
                                                        End If

                                                 On Error GoTo 0
                                          End If

                            End If

              Next i

End Function


Function AddControl(inControl As Control, inName As String) As Long

       ReDim Preserve ControlRecord(MaxControl + 1)
       On Error Resume Next
       ControlRecord(MaxControl).Name = inControl.Name
       ControlRecord(MaxControl).Index = inControl.Index
       ControlRecord(MaxControl).Parrent = inName

              If TypeOf inControl Is Line Then
                     ControlRecord(MaxControl).Top = inControl.Y1
                     ControlRecord(MaxControl).Left = ActualPos(inControl.X1)
                     ControlRecord(MaxControl).Height = inControl.Y2
                     ControlRecord(MaxControl).Width = ActualPos(inControl.X2)
              Else
                     ControlRecord(MaxControl).Top = inControl.Top
                     ControlRecord(MaxControl).Left = ActualPos(inControl.Left)
                     ControlRecord(MaxControl).Height = inControl.Height
                     ControlRecord(MaxControl).Width = inControl.Width
              End If

       inControl.IntegralHeight = False
       On Error GoTo 0
       AddControl = MaxControl
       MaxControl = MaxControl + 1
End Function


Function PerWidth(pfrmIn As Form) As Long

       Dim i As Long
       i = FindForm(pfrmIn)

              If i < 0 Then
                     i = AddForm(pfrmIn)
              End If

       PerWidth = (pfrmIn.ScaleWidth * 100) / FormRecord(i).ScaleWidth
End Function


Function PerHeight(pfrmIn As Form) As Double

       Dim i As Long
       i = FindForm(pfrmIn)

              If i < 0 Then
                     i = AddForm(pfrmIn)
              End If

       PerHeight = (pfrmIn.ScaleHeight * 100) / FormRecord(i).ScaleHeight
End Function


Public Sub ResizeControl(inControl As Control, pfrmIn As Form)

       On Error Resume Next
       Dim i As Long
       Dim widthfactor As Single, heightfactor As Single
       Dim minFactor As Single
       Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long
       yRatio = PerHeight(pfrmIn)
       xRatio = PerWidth(pfrmIn)
       i = FindControl(inControl, pfrmIn.Name)

              If inControl.Left < 0 Then
                     lLeft = CLng(((ControlRecord(i).Left * xRatio) / 100) - 75000)
              Else
                     lLeft = CLng((ControlRecord(i).Left * xRatio) / 100)
              End If

       lTop = CLng((ControlRecord(i).Top * yRatio) / 100)
       lWidth = CLng((ControlRecord(i).Width * xRatio) / 100)
       lHeight = CLng((ControlRecord(i).Height * yRatio) / 100)
              If TypeOf inControl Is Line Then

                            If inControl.X1 < 0 Then
                                   inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) / 100) - 75000)
                            Else
                                   inControl.X1 = CLng((ControlRecord(i).Left * xRatio) / 100)
                            End If

                     inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) / 100)

                            If inControl.X2 < 0 Then
                                   inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) / 100) - 75000)
                            Else
                                   inControl.X2 = CLng((ControlRecord(i).Width * xRatio) / 100)
                            End If

                     inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) / 100)
              Else
                     inControl.Move lLeft, lTop, lWidth, lHeight
                     inControl.Move lLeft, lTop, lWidth
                     inControl.Move lLeft, lTop
              End If

End Sub

Public Sub ResizeForm(pfrmIn As Form)

       Dim FormControl As Control
       Dim isVisible As Boolean
       Dim StartX, StartY, MaxX, MaxY As Long
       Dim bNew As Boolean

              If Not bRunning Then
                     bRunning = True

                            If FindForm(pfrmIn) < 0 Then
                                   bNew = True
                            Else
                                   bNew = False
                            End If


                            If pfrmIn.Top < 30000 Then
                                   isVisible = pfrmIn.Visible
                                   On Error Resume Next

                                          If Not pfrmIn.MDIChild Then
                                                 On Error GoTo 0
                                                 '     ' pfrmIn.Visible = False
                                          Else

                                                        If bNew Then
                                                               StartY = pfrmIn.Height
                                                               StartX = pfrmIn.Width
                                                               On Error Resume Next

                                                                      For Each FormControl In pfrmIn

                                                                                    If FormControl.Left + FormControl.Width + 200 > MaxX Then
                                                                                           MaxX = FormControl.Left + FormControl.Width + 200
                                                                                    End If


                                                                                    If FormControl.Top + FormControl.Height + 500 > MaxY Then
                                                                                           MaxY = FormControl.Top + FormControl.Height + 500
                                                                                    End If


                                                                                    If FormControl.X1 + 200 > MaxX Then
                                                                                           MaxX = FormControl.X1 + 200
                                                                                    End If


                                                                                    If FormControl.Y1 + 500 > MaxY Then
                                                                                           MaxY = FormControl.Y1 + 500
                                                                                    End If

                                                                                    If FormControl.X2 + 200 > MaxX Then
                                                                                           MaxX = FormControl.X2 + 200
                                                                                    End If


                                                                                    If FormControl.Y2 + 500 > MaxY Then
                                                                                           MaxY = FormControl.Y2 + 500
                                                                                    End If

                                                                      Next FormControl

                                                               On Error GoTo 0
                                                               pfrmIn.Height = MaxY
                                                               pfrmIn.Width = MaxX
                                                        End If

                                                 On Error GoTo 0
                                          End If


                                          For Each FormControl In pfrmIn
                                                 ResizeControl FormControl, pfrmIn
                                          Next FormControl

                                   On Error Resume Next

                                          If Not pfrmIn.MDIChild Then
                                                 On Error GoTo 0
                                                 pfrmIn.Visible = isVisible
                                          Else

                                                        If bNew Then
                                                               pfrmIn.Height = StartY
                                                               pfrmIn.Width = StartX

                                                                      For Each FormControl In pfrmIn
                                                                             ResizeControl FormControl, pfrmIn
                                                                      Next FormControl

                                                        End If

                                          End If

                                   On Error GoTo 0
                            End If

                     bRunning = False
              End If

End Sub


Public Sub SaveFormPosition(pfrmIn As Form)

       Dim i As Long

              If MaxForm > 0 Then

                            For i = 0 To (MaxForm - 1)

                                          If FormRecord(i).Name = pfrmIn.Name Then

                                                        FormRecord(i).Top = pfrmIn.Top

                                                                      FormRecord(i).Left = pfrmIn.Left

                                                                                    FormRecord(i).Height = pfrmIn.Height

                                                                                                  FormRecord(i).Width = pfrmIn.Width
                                                                                                         Exit Sub
                                                                                                  End If

                                                                                    Next i

                                                                             AddForm (pfrmIn)
                                                                      End If

                                                        End Sub


Public Sub RestoreFormPosition(pfrmIn As Form)

       Dim i As Long
              If MaxForm > 0 Then

                            For i = 0 To (MaxForm - 1)

                                          If FormRecord(i).Name = pfrmIn.Name Then

                                                        If FormRecord(i).Top < 0 Then
                                                               pfrmIn.WindowState = 2
                                                        ElseIf FormRecord(i).Top < 30000 Then
                                                               pfrmIn.WindowState = 0
                                                               pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height
                                                        Else
                                                               pfrmIn.WindowState = 1
                                                        End If

                                                 Exit Sub
                                          End If

                            Next i

              End If

End Sub
Public Sub Resize_ALL(Form_Name As Form)

Dim OBJ As Object
For Each OBJ In Form_Name
    ResizeControl OBJ, Form_Name
Next OBJ

 

End Sub

Public Sub DragForm(frm As Form)

On Local Error Resume Next
Call ReleaseCapture
Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)

End Sub

C# winform 窗体控件随窗体大小改变

http://www.cnblogs.com/jason-liu-blogs/archive/2012/10/28/2743243.html private void setTag(C...
  • junjian8811
  • junjian8811
  • 2016年06月08日 09:54
  • 1527

窗体控件随窗体大小改变(包括字体大小)

文章参考:http://blog.csdn.net/loveme1204/archive/2007/12/24/1964577.aspx是一篇vb编写的,我只是把它翻译成c#的.其实Anchor和Do...
  • baihe_591
  • baihe_591
  • 2008年05月30日 09:11
  • 3704

窗体控件大小随窗体大小变化而变化(VB.NET)

有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。在Form的Resize事件中调用函数Resize_All就能...
  • sysdzw
  • sysdzw
  • 2009年06月29日 11:16
  • 3154

c#实现窗体大小改变时,控件大小也跟着改变,实现窗体拉伸重绘

public partial class Form1 : Form { float xvalues; float yvalues; public...
  • qywl2014
  • qywl2014
  • 2017年09月15日 16:06
  • 325

【.Net码农】WPF下怎么让控件大小跟着窗口的大小变化而变化

如果在XAML里设置: 设置控件的 HorizontalAlignment="Stretch",VerticalAlignment="Stretch", 且不要显式设置控件的Width和Heigh...
  • CrackLibby
  • CrackLibby
  • 2014年10月30日 11:33
  • 2577

简单是实现winform控件随窗体的大小改变而改变(坐标+大小)

着急写的不用Anchor和Dock实现的一个关于窗体控件随窗体大小改变的代码.  命名有点不规范..  哪里写的不好.还请各位大神批评哈..嘿嘿 ///         /// 帮助类.用于保存第...
  • dyllove98
  • dyllove98
  • 2013年06月17日 21:44
  • 932

VB中对象随窗体而改变大小的方法总结

VB中对象随窗体而改变大小的方法总结L0ftFC      前些时在做VB的编程研究时,发现一个问题:针对某一窗体(FORM),若它在运行过程中人为改变其大小(即Resize),如何让该窗体内的对象也...
  • wcn1990
  • wcn1990
  • 2009年05月15日 17:41
  • 4325

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比...
  • lyh03601
  • lyh03601
  • 2014年08月20日 10:07
  • 1798

vs2013 窗体应用编程—控件大小随窗体变化(通过代码实现)

在form.cs:添加变量记录窗体大小,每次窗体大小变化时记录放缩比并且更改大小数据(通过窗体的Resize事件触发),对于控件则是同控件标签Tag来记录大小并且控制变化。具体代码如下: namesp...
  • emoheithree
  • emoheithree
  • 2016年04月11日 23:15
  • 803

C#巧用anchor和dock设计复杂界面(控件随着窗体大小的变化而变化)

 程序界面如上各部分简要说明: 整个窗体上覆盖一个splitcontainer。splitcontainer的panel1上放置一个label与一个treeview.splitcontainer的pa...
  • zkqwalkon
  • zkqwalkon
  • 2009年11月17日 10:03
  • 2579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:窗体控件大小随窗体大小变化而变化
举报原因:
原因补充:

(最多只允许输入30个字)