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