CAFE

vb6 api

폼 크기제한GetWindowLong,SetWindowLong ,CopyMemory ,CallWindowProc

작성자올란도|작성시간09.01.29|조회수272 목록 댓글 1

1. 모듈에 다음의 API 함수 및 상수를 선언합니다.

Public OldWindowProc As Long

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
              (ByVal hwnd As Long, _
               ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
              (ByVal hwnd As Long, _
               ByVal nIndex As Long, _
               ByVal dwNewLong As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
              (pDest As Any, _
               pSource As Any, _
               ByVal ByteLen As Long)
Public 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
Public Const GWL_WNDPROC = (-4)

Public Type POINTAPI
    x As Long
    y As Long
End Type

Public 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
    Dim MinMax As MINMAXINFO
   
    If Msg = WM_GETMINMAXINFO Then
        CopyMemory MinMax, ByVal lp, Len(MinMax)
        ' 폼의 최소 크기를 300 X 200 으로 제한한다.
        MinMax.ptMinTrackSize.x = 300
        MinMax.ptMinTrackSize.y = 200
        ' 폼의 최대 크기를 600 X 400 으로 제한한다.
        MinMax.ptMaxTrackSize.x = 600
        MinMax.ptMaxTrackSize.y = 400
        CopyMemory ByVal lp, MinMax, Len(MinMax)
        SubClass1_WndMessage = 1
        Exit Function
    End If
   
    SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
End Function

2. 폼에서 폼의 Load 와 Unload 이벤트에 다음과 같이 코딩합니다.

Private Sub Form_Load()
    OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
    Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)
End Sub

 

Private Sub ShowTbox_Click()
    Dim ret As Integer
   
    If doShow = False Then
        ' 폼을 Floating 으로 0, 0 좌표에 띄운다
        ret = SetParent(Form2.hWnd, Me.hWnd)
        Form2.Left = 0
        Form2.Top = 0
        Form2.Show
       
        doShow = True
        Showtbox.Caption = "Hide Toolbox"
    Else
        Form2.Hide
        doShow = False
        Showtbox.Caption = "Show Toolbox"
    End If
End Sub

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자꼭미남강유 | 작성시간 09.04.10 resize 를 써서 If 문으로 제어하니까 일단 작아지거나 커졌다 지정한 크기로 바뀌던데 이건 아에 움직이질 못하는군요.
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼