Option Explicit
Private ObjOldWidth As Long   '保存窗体的原始宽度
Private ObjOldHeight As Long '保存窗体的原始高度
Private ObjOldFont As Single '保存窗体的原始字体比
Dim DisplayX As Integer, DisplayY As Integer, DisplayColor As Integer'在调用ResizeForm前先调用本函数
Public Sub ResizeInit(FormName As Form)
   Dim Obj As Control
   
   ObjOldWidth = FormName.ScaleWidth
   ObjOldHeight = FormName.ScaleHeight
   ObjOldFont = FormName.Font.Size / ObjOldHeight
   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'按比例改变表单内各元件的大小,
'在调用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 / ObjOldWidth
   '保存窗体宽度缩放比例
   ScaleY = FormName.ScaleHeight / ObjOldHeight
   '保存窗体高度缩放比例
   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
       Obj.Font.Size = ObjOldFont * FormName.ScaleHeight
     Next i

  
   Next Obj
  
   On Error GoTo 0
End SubPrivate Sub Form_Resize()
   '确保窗体改变时控件随之改变
   Call ResizeForm(Me)
End SubPrivate Sub Form_Load()
   '在程序装入时必须加入
   Call ResizeInit(Me)
End Sub
上面是我找到一段关于自适应分辨率的代码,但是不对的地方在于程序已运行的时候窗体就已经超出界面了
大家能不能帮我看看(问题应该在红色的那段吧)

解决方案 »

  1.   

    你这代码是改变控件位置的,根本没有改窗口大小的。For Each Obj In FormName 遍历的是窗口内的控件,没有窗口大小调整。
      

  2.   

    LZ,给你一个我个人的自动缩放的控件,给你配了一个例子。
    http://d.download.csdn.net/down/1763009/flyingdragon168
    对于ComboBox控件,你要使用Microsft Forms 2.0 Object Library也就是fm20.dll动态库中控件。
    日期控件,需要通过字体来控制,我是使用自己写的日期控件。
      

  3.   

    除了高度不能修改的控件,所有控件都是可以的(主要是ComboBox),所以让你使用fm20.dll中ComboBox。
    我目前所有的项目,所有控件都基本OK了。字体大小,控件有个选项,是否缩放字体,当然,字体想完全按比例去调整,有点难,因为字体与高度或宽度根本没有一个准确的比例公式。
      

  4.   

    Enabled:表示控件是否有效.
    SizeFont表示字体缩放,
    ExcludeFonts:表示那些控件字体不用缩放:||控件名1||控件名2||,这样表示控件1与控件2字体不变化。
    ExcludeControls:表示那些控件不用缩放: ||控件1||控件2||,这样表示控件1与控件2不缩放尺寸。
      

  5.   

    flyingdragon168,用了你的控件 不过就是感觉还不对,我用起来感觉整个窗体的比例还是比协调的。特别是当拉小窗体的时候,那个ToolBar上的图片都不是缩小而是叠加在一起。不知道是不是我不会用。
    不过还是很谢谢你!
      

  6.   

    既然是函数,将Sub改成Function。
      

  7.   

    Sub和Function他们最终带来的效果都是一样的吧
      

  8.   

    有些控件是不支持缩放的。
    像ToolBar控件。不放在窗体底部PictureBox中。
    我都是放在窗体顶部,不去缩放它,因为缩放不缩放ToolBar,影响不大。
      

  9.   

    我所有窗体,在布局上都是这样:
    最顶上,一个ToolBar控件,这个控件不用缩放。
    再下面,放一个Picture控件,这个控件随窗体缩放,缩放的高度要去掉ToolBar的高度。然后把窗体所有录入,显示的控件放在Picture控件中。然后调用缩放控件来缩放Picture中的控件即可。我现在都是这样使用的,窗体也不是很难看。
      

  10.   

    ok,其实我主要还是要满足分辨率的变化,因为我们的用户一般不需要去调整窗体的大小(都是最大化的)
    所以在不同的分辨率下面ToolBar还是要变的
      

  11.   

    这是一个比较麻烦的问题
    楼主可以准备一个控件数组,为不同的分辨率各准备一个,启动时在Main中先判断是什么分辨率,根据分辨率来启动窗体。呵呵办法老土了些,但应该有用。
      

  12.   

    其实分辨率的变化,也就是窗体尺寸的变化了。因为不同分辨率下,其窗体大小是不相同的,也就只各个控件尺寸需要变化,所以楼主所要想是的,如何让ToolBar尺寸变化,其实楼主可以参照360卫士或瑞星那样,自己设计类似ToolBar功能控件,什么事都解决了。
    除非就是像上楼所讲,每种分辨率做一个窗体,但现在显示器种类太多,分辨率不只就是几种而已。