Subclassing II. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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):

Tématické zařazení:

 » Rubriky  » Visual Basic  

 » Rubriky  » Windows  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: