Tuesday, June 12, 2012

Memberi Batas Minimal - Maksimal Sebuah Aplikasi - VB6

Merancang sebuah interface yang baik, terkadang tidak semudah yang dibayangkan (download codejock dan selesai). Beberapa hal yang sering diutamakan diantaranya, tampilan yang menarik, kemudahan akses (dapat digunakan secara sempurna tanpa menggunakan mouse), navigasi antar form yang mudah dan tidak membingungkan, pemilihan ActiveX Third Party yang memiliki kualitas kode yang baik (tidak mengandung bug atau mudah crash), dsb (banyak). Nah, diantara sekian yang banyak itu salah satunya adalah memberi batas minimal ukuran sebuah aplikasi. Di bawah ini merupakan modul untuk memberi batas minimal sebuah aplikasi, sumber kodenya dari Microsoft.
Option Explicit 

Private Const
GWL_WNDPROC = -4
Private Const WM_GETMINMAXINFO = &H24

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

Global lpPrevWndProc As Long
Global gHW As Long

Private Declare Function
DefWindowProc Lib "user32" Alias _
"DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private 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
Private Declare Function
SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Sub
CopyMemoryToMinMaxInfo Lib "kernel32" Alias _
"RtlMoveMemory" (hpvDest As MINMAXINFO, ByVal hpvSource As Long, _
ByVal cbCopy As Long)
Private Declare Sub CopyMemoryFromMinMaxInfo Lib "kernel32" Alias _
"RtlMoveMemory" (ByVal hpvDest As Long, hpvSource As MINMAXINFO, _
ByVal cbCopy As Long)

Public Sub
Hook()
'Start subclassing.
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
AddressOf WindowProc)
End Sub

Public Sub
Unhook()
Dim temp As Long

'Cease subclassing.
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub

Function
WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim
MinMax As MINMAXINFO

'Check for request for min/max window sizes.
If uMsg = WM_GETMINMAXINFO Then
'Retrieve default MinMax settings
CopyMemoryToMinMaxInfo MinMax, lParam, Len(MinMax)

'Specify new minimum size for window.
MinMax.ptMinTrackSize.X = 750 'untuk ukuran minimal aplikasi
MinMax.ptMinTrackSize.Y = 550

'Specify new maximum size for window.
' MinMax.ptMaxTrackSize.x = 900 'untuk ukuran maksimal aplikasi
' MinMax.ptMaxTrackSize.y = 600

'Copy local structure back.
CopyMemoryFromMinMaxInfo lParam, MinMax, Len(MinMax)

WindowProc = DefWindowProc(hw, uMsg, wParam, lParam)
Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, _
wParam, lParam)
End If
End Function

Contoh penggunaan pada MDI form:
Private Sub MDIForm_Load() 
gHW = Me.hwnd 'Save handle to the form.
Hook 'Begin subclassing.
End Sub

Private Sub
MDIForm_Unload(Cancel As Integer)
Unhook 'Stop subclassing.
End Sub

Catatan penting: karena menggunakan teknik subclassing, tempatkan kode di atas setelah aplikasi selesai dibuat (final), pastikan seluruh kode berjalan dengan baik, pastikan pula seluruh error terhandle dengan baik. Mengapa? CRASH! dan kita akan kesulitan mentrace dan mendebug aplikasi yang sedang kita buat.