delphi鼠标拖动窗口 改变大小 如何让其中的控件随之改变 :比如说dbrid控件随窗口变化按比例变化 ,Button控件位置随窗口改变而改变..................
解决方案 »
- 【求助】普通函数与类函数的区别?
- 关于dbgrid的简单问题,马上给分!
- 一匹"黑马",想升星(*)的来!,不要怕分不够!
- 求救.一个cmd line小程序.
- 谁提供或知道哪有双机通迅的源代码(并串口的不要),加100分。
- 上午问了个问题,语句如下,运行出错
- 如何删除中文目录,在线等待!
- 请教大侠,高手们,!!!!!!!!!!!!
- 产生一个报表失败!??!只要能解决问题,分不是重要的,可以下次给!!!OK!
- 请问哪位高手有多用户管理系统登录窗口的源程序,急需!!![email protected]
- 如何获取DBLookupComboBox中的值到SQL语句中使用
- 高分诚恳请教关于Delphi调java做的Webservice 的问题!!!
这时你也知道了窗体的height和width
只要由它来控制其控件的尽寸就可以了...
Option Explicit
Private FormOldWidth As Long
'保存窗体的原始宽度
Private FormOldHeight As Long
'保存窗体的原始高度 '在调用ResizeForm前先调用本函数
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 '按比例改变表单内各元件的大小,
'在调用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
'读取控件的原始位置与大小 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_Load()
Call ResizeInit(Me) '在程序装入时必须加入
End Sub Private Sub Form_Resize()
Call ResizeForm(Me) '确保窗体改变时控件随之改变
End Sub
本例中给出了二个函数:ResizeInit和ResizeForm,在调用ResizeForm之前必须先调用ResizeInit...
设置控件的Align属性即可,例如设置为alClient如果是窗口大小改变的时候,所有空间都自动重新排列,一个方式是编写onsize事件处理代码,代码里面获取窗口大小,按照比例调整所有内部空间位置和大小。另外的办法是把控件按照一定的布局存放,合理的设置Align属性。
最常用的方法就是设置控件的Align属性,但是你会发现,对于ActiveX控件,会出现问题.
在网上很多贴子,有设置WindowsMediaPlayer控件的焦点的,有使用DoObjectVerb (-1)办法的。
这两种办法在2000以下的操作系统中没有问题,但是在XP以上的系统中,因为其默认设置的效果是“拖动
时改变窗口大小”,这样会不让你改变窗口大小。但是最大化、最小化的时候,没问题。最后在一个国外的论坛上找到了解决办法,方法如下:一劳永逸的解决办法是:1、先在窗口里定义一个类型:TLocOleCtrl = Class (TOleControl);2、在窗口的OnResize事件里加上:TLocOleCtrl (WindowsMediaPlayer1).OnPosRectChange (Rect (0, 0, ClientWidth, ClientHeight));通过以上两点设置,一切OK~~~~~