Subclassing: Hlavní okno

Založte si nový projekt a přidejte do něj i nový modul, takže byste v Project Exploreru měli mít Form1 a Module1. Otevřete modul a zapište následující deklaraci:

Public Const GWL_WNDPROC = (-4)
Public Declare Function SetWindowLong Lib "user32"_
   Alias "SetWindowLongA" (ByVal hwnd As Long, _
   ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Tato API funkce Vám umožňuje přesměrovat zprávy, které se vztahují k Vašemu formuláři do modulu, a to ještě před tím, než jsou formulářem zpracovány. Parametry API funkce mohou vypadat trochu děsivě, ale nejsou zase tak nepochopitelné:

hwnd

Argument typu Long Integer, který specifikuje unikátní ID pro okno nebo formulář. V podstatě se jedná o ukazatel, který umožňuje API funkci manipulovat s objektem, aniž by se do ní musel zasílat celý objekt jako argument.

nIndex
Identifikuje typ operace, která se má provést. Protože v našem případě budeme modifikovat proces, tak budeme používat konstantu GWL_WNDPROC

dwNewLong
Specifikuje adresu nové funkce nebo procedury, kterou použijeme pro zpracování zprávy zasílané z Windows (v našem případě GWL_WNDPROC)

Funkce, která bude zpracovávat zprávy, musí být poměrně přesně definována, tak aby akceptoval všechny argumenty, které Windows zasílají ve svých zprávách. Musí být také schopna přeposílat zprávy, které nebudeme modifikovat. Do modulu přidejte ještě následující deklarace:

Public oldWindowProc 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

A do modulu také přidejte následující routinu:

Public Function NewWindowProc(ByVal hWnd As Long, _
                              ByVal uMsg As Long, _
                              ByVal wParam As Long, _
                              ByVal lParam As Long) As Long

    Debug.Print "&H" & Hex(uMsg), wParam, lParam
    NewWindowProc = CallWindowProc(oldWindowProc, hWnd, _
      uMsg, wParam, lParam)

End function

Tato funkce nedělá nic jiného, než že vypisuje zprávy do Debug okna, tak jak přichází z Windows. Funkce se momentálně zprávy jen předává zpět do původního procesu z Windows. Argumenty, zasílané do "NewWindowProc" jsou ukazatel na okno, které mělo původně zprávu obdržet (hWnd), vlastní zpráva (uMsg) a dva argumenty s parametry (wParam a lParam). Později se na tyto argumenty podíváme detailně.

Pokud byste projekt nyní spustili, tak neuvidíte nic. Respektive uvidíte formulář, ale nic se nebude dít, protože ještě není spuštěn subclassing a žádná ze zpráv, zasílaných z Windows se v okně Debug neobjeví.

Myslím, že z toho, co je tu uvedeno už je jasné, o co v subclassingu jde - chytíme si zprávu, přesměrujeme řízení jejího procesu někam jinam, tam si to zpracujeme a upravíme a pošleme dál, ovšem již změněné.

Před tím, než spustíme subclassing okna a začneme "poodhrnovat záclonu tajemství", tak znovu musím upozornit na to, abyste nepoužívali tlačítko STOP!!! A vždy se před spuštěním ujistěte, že jste si projekt uložili.

Zpět Další

Autor: The Bozena