Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Visual Basic
Subclassing II.
22. května 2000, 00.00 | V tomto díle o subclassingu se naučíte používat komponentu "SUBCLASSER 2". Jde o volnou komponentu která vám ulehčí práci..
(práce s komponentou Subclasser2 + příklad jak nastavit max/min velikost okna)V tomto díle o subclassingu se naučíte používat komponentu "SUBCLASSER 2", kterou si můžete stáhnout zde ( http://vbasic.zde.cz - v sekci Projects, či přímo z Buildera). Zdrojový kód je přiložen a je volný, takže můžete nakládat s komponentou podle své libosti (je určena pouze pro nekomerční využití).
Použití Subclasseru 2. Ve Visual Basicu si vytvořte nový Form a přidejte na něj komponentu Subclasser 2. (v nabídce Project vyberte Components (Ctrl - T) a tam vyhledejte komponentu jksoft_SubClasser2).
funkce Subclasseru 2
Attach (hwnd as long, msg as long)
- subclasser začne zachycovat zprávu (msg) posílané oknu jehož handle je hwnd. Zpávy jsou posílány události WindowProc. Poté co je úspěšně aktivováno zachycování zprávy (msg) aktivuje se událost OnAttach.
Detach (hwnd as long, msg as long)
- ukončí zachycování zpráv (msg) příslušného okna. Poté co je úspěšně deaktivováno zachycování zpráv se aktivuje událost OnDetach.
IsSubclassed (hwnd as long) as Boolean
- zjišťuje, zda-li je okno s handle (hwnd) subclassnuto. Je-li subclassnuto vrací hodnotu True, jinak False
IsAttached (hwnd as long, msg as long) as Boolean
- zjišťuje je-li zpráva (msg) zachycována či ne. Vrací hodnoty True, nebo False.
CallOldWndProc (hwnd as long, msg as long, wParam as long, lParam as long)
- volá původní funkci.
události Subclasseru 2
OnAttach (hwnd as long, msg as long)
- funkce je volána, poté co bylo úspěšně spuštěno zachytávání zprávy (msg) okna (hwnd)
OnDetach (hwnd as long, msg as long)
- funkce je volána, poté co bylo úspěšně zastaveno zachytávání zprávy (msg) okna (hwnd)
WindowProc (hwnd as long, msg as long, wParam as long, lParam as long)
- funkce je volána, poté co okno obdrží zprávu, kterou uživatel nastavil k zachycování funkcí Attach.
Příklad práce se Subclasserem 2.
Nastavení maximální a minimální velikosti okna pomocí subclassingu.
- vytvořte Form a jeden Modul. Na Form vložte komponentu Subclasser 2. Do kódu Formu přidejte tento kód:
'==============
Option Explicit
Private Sub Form_Load()
' subclassni hlavni okno a posilej zpravu WM_GETMINMAXINFO SubClasser1.Attach Me.hwnd, WM_GETMINMAXINFO End Sub
Private Sub Form_Unload(Cancel As Integer)
' zrus subclassing SubClasser1.Detach Me.hwnd, WM_GETMINMAXINFO End Sub
Private Sub SubClasser1_WindowProc(hwnd As Long, Msg As Long, wParam As Long, lParam As Long) Dim mMINMAX As MINMAXINFO
Select Case Msg Case WM_GETMINMAXINFO ' okno meni svoji velikost ' lParam obsahuje max/min velikost okna CopyMemory mMINMAX, ByVal lParam, Len(mMINMAX) With mMINMAX .ptMaxTrackSize.x = 500 ' maximalni velikost okna .ptMaxTrackSize.y = 400 .ptMinTrackSize.x = 300 ' minimalni velikost okna .ptMinTrackSize.y = 200 .ptMaxSize.x = 700 ' maximalni velikost pri maximalizaci .ptMaxSize.y = 500 ' pozice okna pri maximalizaci (levy horni roh) .ptMaxPosition.x = 0 .ptMaxPosition.y = 0 End With 'prekopiruj hodnoty z mMINMAX do lParamu CopyMemory ByVal lParam, mMINMAX, Len(mMINMAX) End Select End Sub
'=================
a do kódu Modulu vložte toto:
'=================
Option Explicit
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Public Const WM_GETMINMAXINFO = &H24
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
'=================
uložte si Project a spusťte. Vaše okno bude mít při zvětšování maximální velikost 500x400px. Při zmenšování 300x200px. Při stisku maximalizačního tlačítka bude levý horní roh na pozici [0,0] a velikost bude 700x500px.
Další příklady najdete na mé stránce ( http://vbasic.zde.cz - v sekci Tips/Tricks - Subclassing).
Důležité funkce při subclassingu jsou:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
- tako funkce slouží k překopírování hodnoty jedné proměnné do hodnoty druhé proměnné (nezáleží na typu proměnné). Často se využívá při kopírování parametrů, které jsou typu Long do definovaných typů (RECT, POINTAPI,...)
Public Function Lo(ByVal param As Long) As Long Lo = param And &HFFFF& End Function
- získá z hodnoty typu Long hodnotu na nižším bitu
Public Function Hi(ByVal param As Long) As Long Hi = param \ &H10000 End Function
- získá z hodnoty typu Long hodnotu na vyšším bitu
V příštím díle rozeberu nejdůležitější zprávy, které byste mohli využít ve Vašich programech.
Obsah seriálu (více o seriálu):
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007