Private Sub Form_Resize()
Frame1.Width = Me.ScaleWidth
Frame2.Width = Me.ScaleWidth
Frame3.Width = Me.ScaleWidthFrame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.HeightFrame2.Top = Frame1.Height
Frame3.Top = Frame1.Height + Frame2.HeightMSFlexGrid1.Left = 20
MSFlexGrid1.Width = Frame3.Width - 40
MSFlexGrid1.Height = Frame3.Height - 160Label1.Left = Frame1.Width / 2 - Label1.Width / 2End Sub
以上代码能够实现当窗体变化时,控件能够自动调整其自身大小和位置,可是现在我要控制如何使窗体缩小到一定大小时不能再缩小,因为缩小到只剩下标题栏,如下语句会出现错误,程序崩溃
Frame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.Height
Frame3.Top = Frame1.Height + Frame2.Height请问如何实现呀
Frame1.Width = Me.ScaleWidth
Frame2.Width = Me.ScaleWidth
Frame3.Width = Me.ScaleWidthFrame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.HeightFrame2.Top = Frame1.Height
Frame3.Top = Frame1.Height + Frame2.HeightMSFlexGrid1.Left = 20
MSFlexGrid1.Width = Frame3.Width - 40
MSFlexGrid1.Height = Frame3.Height - 160Label1.Left = Frame1.Width / 2 - Label1.Width / 2End Sub
以上代码能够实现当窗体变化时,控件能够自动调整其自身大小和位置,可是现在我要控制如何使窗体缩小到一定大小时不能再缩小,因为缩小到只剩下标题栏,如下语句会出现错误,程序崩溃
Frame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.Height
Frame3.Top = Frame1.Height + Frame2.Height请问如何实现呀
解决方案 »
- vb 我写了一个函数,在一个按扭中调用,又在timer为1秒的时间控件中调用,请问是不是他们一定会等一个结束了另一个才运行?
- vb中打印的问题?
- 一个简单的语法问题
- VB里有一个图表的控件,它在部件里叫什么?
- 在此网站中下载了GS84坐标转北京54坐标工具,里面的参数不知道怎么算出来的,请教?
- 求助:VB修改用户密码的代码有错误,请高手帮忙修改...
- 在线求救!如何在OCX控件中加入“关于”的属性项目?
- 菜鸟提问api
- datagrid的标题背景颜色怎么改变?十万火急。
- 在form load事件里的程序总在把程序运行完以后才显示form,我要先显示form,再运行程序,怎么办?
- JPG文件
- 怎样动态添加用户控件,而且可以添加多个相同的用户控件
if Frame3.Top< 数据 then exit sub
On Error Resume NextFrame1.Width = Me.ScaleWidth
Frame2.Width = Me.ScaleWidth
Frame3.Width = Me.ScaleWidthFrame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.HeightFrame2.Top = Frame1.Height
Frame3.Top = Frame1.Height + Frame2.HeightMSFlexGrid1.Left = 20
MSFlexGrid1.Width = Frame3.Width - 40
MSFlexGrid1.Height = Frame3.Height - 160Label1.Left = Frame1.Width / 2 - Label1.Width / 2End Sub
'加上判断
If Me.WindowState = 1 Then '最小化
Exit Sub
End IfFrame1.Width = Me.ScaleWidth
Frame2.Width = Me.ScaleWidth
Frame3.Width = Me.ScaleWidthFrame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.HeightFrame2.Top = Frame1.Height
Frame3.Top = Frame1.Height + Frame2.HeightMSFlexGrid1.Left = 20
MSFlexGrid1.Width = Frame3.Width - 40
MSFlexGrid1.Height = Frame3.Height - 160Label1.Left = Frame1.Width / 2 - Label1.Width / 2End Sub
利用子类处理技术限制窗体的大小
' * * * * * * * * * * 警告 * * * * * * * * * * * * *
' 对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的VB崩溃!
' 在VB IDE环境中运行本程序之前请先保存您的修改
' 不要使用断点调试模式,这将导致VB崩溃!
' * * * * * * * * * * 注意 * * * * * * * * * * * * *
模块:
Option ExplicitPublic OldWindowProc As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
'从指定的窗口结构中取得信息
'参数/类型 说明
'hwnd(long): 欲为其获取信息的窗口的句柄
'nIndex(long): 欲取回的信息,可以是下述任何一个常数
'GWL_EXSTYLE:扩展窗口样式
'GWL_STYLE:窗口样式
'GWL_WNDPROC:该窗口的窗口函数的地址
'GWL_HINSTANCE:拥有窗口的实例的句柄
'GWL_HWNDPARENT:该窗口之父的句柄.不要用 SetWindowWord 来改变这个值
'GWL_ID:对话框中一个子窗口的标识符
'GWL_USERDATA:含义由应用程序规定
'对话框亦可指定下列常数
'DWL_DLGPROC:这个窗口的对话框函数地址
'DWL_MSGRESULT:在对话框函数中处理的一条消息返回的值
'DWL_USER:含义由应用程序规定
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'在窗体结构中为指定的窗口设置信息
'参数/类型 说明
'hwnd(long) 欲为其获取信息的窗口的句柄
'nIndex(long) 参考GetWindowLong函数
'dwNewLong(long) 由nIndex指定的窗口信息的新值
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
'这就是在VisualBasic中处理指针的"短柄斧"--CopyMemory.你可能在API文档中找不到它,但它确实存在,并且功能异常强大
'参数/类型 说明
'pDest 你想写入字节到其中的任何变量的ByRef参数(地址)
'pSource 要从其中进行复制的ByRef变量
'ByteLen 要复制的字节数
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'把控制权传回给原来的窗口过程
Public Const WM_GETMINMAXINFO = &H24
Type POINTAPI
x As Long
y As Long
End Type
' This is the structure that is passed by reference(ByRef)(ie an address) to your message handler(消息侦听器)
' The key items in this structure are ptMinTrackSize and ptMaxTrackSize
Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
' Watch for the pertinent message to come in
If Msg = WM_GETMINMAXINFO Then
Dim MinMax As MINMAXINFO
' This is necessary because the structure was passed by its address and there
' is currently no intrinsic way to use an address in Visual Basic
CopyMemory MinMax, ByVal lp, Len(MinMax)
' This is where you set the values of the MinX,MinY,MaxX, and MaxY
' The values placed in the structure must be in pixels. The values
' normally used in Visual Basic are in twips. The conversion is as follows:
' pixels = twips\twipsperpixel
MinMax.ptMinTrackSize.x = 3975 \ Screen.TwipsPerPixelX
MinMax.ptMinTrackSize.y = 1740 \ Screen.TwipsPerPixelY
MinMax.ptMaxTrackSize.x = Screen.Width \ Screen.TwipsPerPixelX \ 2
MinMax.ptMaxTrackSize.y = 3480 \ Screen.TwipsPerPixelY
' Here we copy the datastructure back up to the address passed in the parameters
' because Windows will look there for the information.
CopyMemory ByVal lp, MinMax, Len(MinMax)
' This message tells Windows that the message was handled successfully
SubClass1_WndMessage = 1
Exit Function
End If
' Here, we forward all irrelevant messages on to the default message handler.
SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
End Function窗体代码:
Option ExplicitPrivate Const GWL_WNDPROC = (-4)
Private Sub Form_Load()
' First, we need to store the address of the existing Message Handler
OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
' Now we can tell windows to forward all messages to out own Message Handler
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
End SubPrivate Sub Form_Unload(Cancel As Integer)
' We must return control of the messages back to windows before the program exits
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)
End Sub
On Error Resume NextIf Me.ScaleWidth < 11000 Then Me.Width = 11000
If Me.ScaleHeight < 8250 Then Me.Height = 8250Frame1.Width = Me.ScaleWidth
Frame2.Width = Me.ScaleWidth
Frame3.Width = Me.ScaleWidthFrame3.Height = Me.ScaleHeight - Frame1.Height - Frame2.HeightFrame2.Top = Frame1.Height
Frame3.Top = Frame1.Height + Frame2.HeightMSFlexGrid1.Left = 20
MSFlexGrid1.Width = Frame3.Width - 40
MSFlexGrid1.Height = Frame3.Height - 160Label1.Left = Frame1.Width / 2 - Label1.Width / 2
End Sub