怎样使datagird 等控件按照窗口的比例变化. 如我用800*600时的外观datagird 在窗体的中间,  但我用1024* 768时, 它的位置就已经明显偏了.

解决方案 »

  1.   

    先获的系统的分辨率(API函数),然后重新设置控件的属性
      

  2.   

    MsgBox "分辩率:" + Str(Screen.Width / Screen.TwipsPerPixelX) + "X" + Str(Screen.Height / Screen.TwipsPerPixelY) + "象素"
      

  3.   

    Private Sub Form_Load()
    wid = Screen.Width '/ Screen.TwipsPerPixelX
    hei = Screen.Height ' / Screen.TwipsPerPixelY
    MsgBox "分辩率:" + Str(Screen.Width / Screen.TwipsPerPixelX) + "X" + Str(Screen.Height / Screen.TwipsPerPixelY) + "象素"
    Form1.Left = 0: Form1.Top = 0
    Form1.Width = wid
    Form1.Height = hei
    Command1.Left = 0.3 * Form1.Width
    Command1.Top = 0.3 * Form1.Height
    '0.3可以按分扁率算出
    End Sub
      

  4.   

    Dim a(), g(1) As Single
    Dim t As Integer, dt As Integer
    Private Sub Check1_Click()
     Form_Resize
    End Sub
    Private Sub Command1_Click()
     If t = 0 Then t = 0: dt = 100: Timer1.Enabled = True
    End SubPrivate Sub Form_Activate()
    If g(0) = 0 Then '原始值只記錄一次
     g(0) = Form1.ScaleWidth: g(1) = Form1.ScaleHeight '一開始表單的大小
     ReDim a(Form1.Controls.Count - 1, 5)
     j = 0
     For Each i In Form1.Controls '記錄每個物件的資料
       a(j, 0) = i.Name
       On Error Resume Next '避免某些物件沒有指定的屬性而錯誤
       a(j, 1) = i.Left:  a(j, 2) = i.Top
       a(j, 3) = i.Width:  a(j, 4) = i.Height
       a(j, 5) = i.FontSize
       On Error GoTo 0 '取消錯誤處理
      j = j + 1
     Next i
    t = 0: dt = 100: Timer1.Enabled = True
    End If
    End SubPrivate Sub Form_Resize()
    If Form1.WindowState <> 1 And g(0) > 0 And g(1) > 0 Then
    '重算物件的新位置
     For i = 0 To Form1.Controls.Count - 1
      Set b = Controls(a(i, 0))
       On Error Resume Next
       b.Left = a(i, 1) / g(0) * Form1.ScaleWidth
       b.Top = a(i, 2) / g(1) * Form1.ScaleHeight
       b.Width = a(i, 3) / g(0) * Form1.ScaleWidth
       b.Height = a(i, 4) / g(1) * Form1.ScaleHeight
       If Form1.ScaleWidth / g(0) < Form1.ScaleHeight / g(1) Then
        b.FontSize = a(i, 5) / g(0) * Form1.ScaleWidth
        Else
        b.FontSize = a(i, 5) / g(1) * Form1.ScaleHeight
       End If
       On Error GoTo 0
       If TypeOf b Is PictureBox Then
        If Check1.Value = 1 Then b.PaintPicture b.Picture, 0, 0, b.ScaleWidth, b.ScaleHeight Else b.Cls
       End If
      Set b = Nothing
     Next i
    End If
    End Sub
    Private Sub Timer1_Timer()
     t = t + Sgn(dt)
     If t > 15 Then dt = -dt
     If Form1.WindowState = 2 Then Form1.WindowState = 0: Timer1.Interval = 100: GoTo kk
     If t = 16 Then Form1.WindowState = 2 - Form1.WindowState: Timer1.Interval = 1000: GoTo kk
     Form1.Move (Screen.Width - Form1.Width - dt * 3) / 2, (Screen.Height - Form1.Height - dt) / 2
     Form1.Move Form1.Left, Form1.Top, Form1.Width + dt * 3, Form1.Height + dt
    kk:
    If dt < 0 And t < 1 Then t = 0: Timer1.Enabled = False
    End Sub'後記:
    '某些物件的長寬會有自動微調的功能,如 ListBox會以能顯示完整行的方式呈現
    '另外如 PictureBox 的.picture並不像Image有Stretch縮放的功能,必要時須重繪!
    '還要注意某些物件並不允許被重設位置!如 Timer,所以 On Error 的運用也是關鍵之一
    '最好能限定表單長寬的最小值!避免某些物件因太小而不可見!
      

  5.   

    最简单的方式
    在窗体Resize的时候,
    用Screen判断屏幕尺寸,
    再代码里写每个状态的不同尺寸