Subclassing I. - 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 I.

10. května 2000, 00.00 | Co je to subclassing, k čemu slouží a jak jej použít?

co je to vlastně subclassing? Subclassing je technika, která dovoluje aplikaci zadržet a zpracovat zprávy poslané určitému oknu dříve než okno má šanci je zpracovat. Procedura která toto umožňuje se nazývá subclass procedure, je definována aplikací a nahrazuje originální proceduru okna (procedura okna je funkce definovaná operačním systémem, která kontroluje vzhled a chování asociovaného okna. Procedura přijímá a zpracovává zprávy poslané těmto oknům)

Dost už teorie. K čemu mě to poslouží? "Subclasnu"-li nějaké okno získám plnou kontrolu nad vším co je s oknem prováděno. Visual Basic mi umožňuje zpracovat pouze zprávy (události) jako MouseMove, MouseDown, KeyDown, Click, DblClick, KeyPress... ale už mi nedovoluje je pozdržet, či úplně zrušit, nebo upravit. Pomocí subclassingu mám nad všemi těmito a mnoho dalšími zprávami úplnou kontrolu.

Jak, ale tyto zprávy zachytávat? Není to nic těžkého, ale má to i svá úskalí. Takto vypadá nejjednodušší způsob zachytávání těchto zpráv, které zachycuje procedura WndProc(hwnd as long, msg as long, wParma as long, lParam as long) a dále posílá zpět oknu (samozřejmě lze zabránit dalšímu zpracování)

'===================
Public Sub InitSubclass(hWnd As Long)

If sOldProc = 0 Then
shWnd = hWnd
sOldProc = SetWindowLong(shWnd, GWL_WNDPROC, AddressOf WndProc)
End If
End Sub

Public Sub ReleaseSubclass()

If Not sOldProc = 0 Then
SetWindowLong shWnd, GWL_WNDPROC, sOldProc
sOldProc = 0
End If
End Sub
Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

' zde si vybírám, zprávu a tu pak budu dále zpracovávat
Select Case Msg
Case WM_* ' WM_* konstanty zprav (více v druhém díle)
End Select

' zde posílám zprávu dál oknu (v některých případech by mohl dojít ke komplikacím, kdybych to zpravu zadržel)
WndProc = CallWindowProc(sOldProc, hWnd, Msg, wParam, lParam)

End Function
‚========================

Podívám-li se blíže na funkce/procedury:

InitSubclass (hwnd) 'subclasne' okno určené hwnd a posílá zprávy funkci WndProc


ReleaseSubclass() zruší subclassing okna. Je potřeba vždy ukončit subclassing před ukončením aplikace.


WndProc (hwnd as long, msg as long, wParam as long, lParam as long) zachytává zprávy vyslané oknu. Dále je už zprávy musím zpracovat sám, nebo posílat dál. Každou zprávu doprovází proměnné lParam a wParam, které uchovávají ostatní informace.

POZOR: nastane-li chyba v programu (špatně napsaný kód...) celá aplikace se nejen diky subclassingu zhroutí, ale zhroutí se i IDE Visual Basicu a neuložené informace jsou fuč. Takže i pozor na klikání na tlačítko STOP.

Další omezení subclassingu ve Visual Basicu je to, že nelze žádnou komponentu/kód napsaný čistě ve Visual Basicu použít k tzv. system wide subclassingu. System wide subclassing je vlastně to samé, akorát se neomezuje pouze na aplikaci, která tento kód zpracovává, ale na celé windows. (můžete subclassnout třeba Notepada. To ve VB nejde.) Toto řeší různé knihovny napsané v C++. Lze je najít na Internetu.

Tento základní model programu na subclassing má mnohé nevýhody. Nelze zachytávat pouze mnou určené zprávy, ale prochází jím všechny a nelze přes jednu funkci zachytávat zprávy více oken. Toto řeší moje komponenta na subclassing "SUBCLASSER 2", která je volně k použití a naleznete ji na mých stránkách o Visual Basicu (adresa http://vbasic.zde.cz), v sekci Projects. Nápověda je v angličtině. Základní funkce a příklady nalezne na zmiňované stránce v sekci Tips/Tricks

V příštím díle tohoto článku se dozvíte jak pracovat s komponentou Subclasser 2 a naučíte se zachytávat a zpracovávat základní zprávy.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Visual Basic  

 » Rubriky  » Windows  

 

 

 

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

 

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

Uživatelské jméno:

Heslo: