热情软件屋

 

在VB中可以限制窗体的最小值吗


编号:QA000410
建立日期: 1999年1月25日 最后修改日期:2000年8月27日
所属类别:

Gia:
    操作系统:WIN95、WINNT
    工具:VB5、VB6
    请问,在VB中如何在改变窗体大小时,可以限制窗体的最小值?(比如说,窗体最小只能是2000×2000,最大不限)

回答:

    你可以在Resize事件中进行限制。如:
    Private Sub Form_Resize()
     If WindowState The Exit Sub
     If Width < 2000 Then Width = 2000
     If Height < 2000 Then Width = 2000
    End Sub
    如果你要是熟悉MsgBlaster这样的控件(可以在QA000580 "VB5中动态建立带子菜单的菜单"下载),你还可以截取Windows的WM_WINDOWPOSCHANGING这样的消息,这样可以使程序的外观上更好看。具体的做法参考QA000727 "在msgblst中如何处理指向结构变量的地址"
    wgr的意见:
    下列代码可以锁定窗口大小:
    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&)
    Private Declare Function CallWindowProc& Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
    Private Declare Function SetWindowLong& Lib "User32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)
    Private Type POINTAPI
     x As Long
     y As Long
    End Type
    Private Type MINMAXINFO
     ptReserved As POINTAPI
     ptMaxSize As POINTAPI
     ptMaxPosition As POINTAPI
     ptMinTrackSize As POINTAPI
     ptMaxTrackSize As POINTAPI
    End Type
    Private procOld As Long
    Private udtMMI As MINMAXINFO
    
    Private Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     Select Case iMsg
     Case &H24 'WM_GETMINMAXINFO=&H24
     Dim udtMINMAXINFO As MINMAXINFO
     CopyMemory udtMINMAXINFO, ByVal lParam, 40&
     With udtMINMAXINFO
     .ptMaxSize.x = udtMMI.ptMaxSize.x
     .ptMaxSize.y = udtMMI.ptMaxSize.y
     .ptMaxPosition.x = 0
     .ptMaxPosition.y = 0
     .ptMaxTrackSize.x = .ptMaxSize.x
     .ptMaxTrackSize.y = .ptMaxSize.y
     .ptMinTrackSize.x = udtMMI.ptMinTrackSize.x
     .ptMinTrackSize.y = udtMMI.ptMinTrackSize.y
     Debug.Print .ptMaxSize.x & "," & .ptMaxSize.y
     End With
     CopyMemory ByVal lParam, udtMINMAXINFO, 40&
     WindowProc = False
     Exit Function
     End Select
     WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
    End Function
    
    Public Function LockWindow(hWnd As Long, Optional MinWidth As Long, Optional MinHeight As Long, Optional MaxWidth As Long, Optional MaxHeight As Long) As Boolean
     With udtMMI
     '指定窗体最小宽度
     If MinWidth = 0 Then .ptMinTrackSize.x = 0 Else .ptMinTrackSize.x = MinWidth
     '指定窗体最小高度
     If MinHeight = 0 Then .ptMinTrackSize.y = 0 Else .ptMinTrackSize.y = MinHeight
     '指定窗体最大宽度
     If MaxWidth = 0 Then .ptMaxSize.x = Screen.Width \ Screen.TwipsPerPixelX Else .ptMaxSize.x = MaxWidth
     '指定窗体最大高度
     If MaxHeight = 0 Then .ptMaxSize.y = Screen.Width \ Screen.TwipsPerPixelX Else .ptMaxSize.y = MaxHeight
     End With
     procOld = SetWindowLong(hWnd, -4, AddressOf WindowProc)
    End Function
    
    相关问题:
    QA003257 "如何禁止窗口改变大小,同时允许最小化、最大化"

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio