[ Pobierz całość w formacie PDF ]
.}end;Jak wspomnia³em wczeœniej, rekord mapuj¹cy zawiera wszelkie parametry niezbêdnedo obs³u¿enia komunikatu.Rekord mapuj¹cy dla komunikatu WM_ERASEBKGND wygl¹danastêpuj¹co:TWMEraseBkgnd = recordMsg : Cardinal;DC : HDC;Unused : Longint;Result : Longint;end;Wszystkie rekordy mapuj¹ce posiadaj¹ dwa wspólne pola: Msg i Result [9Odzwierciedlaj¹cym tê ideê najprostszym rekordem mapuj¹cym jest nastêpuj¹cyrekord:TWMNoParams = recordMsg: Cardinal;Unused: array[0.3] of Word;Result: Longint;end;(przyp.red.)].Pole Msg zawiera przes³any komunikat.Parametr ten jestwykorzystywany przez VCL i w zwi¹zku z tym nie le¿y w krêgu naszychzainteresowañ.Natomiast istotnym dla nas elementem jest Result.Pole to s³u¿y do ustawieniawartoœci zwracanej przez komunikat, który obs³ugujemy.Wartoœæ zwracana ró¿nisiê w zale¿noœci od komunikatu.Przyk³adowo, funkcja obs³uguj¹ca komunikatWM_ERASEBKGND powinna zwracaæ wartoœæ True (czyli – ró¿n¹ od zera) je¿eli t³ojest czyszczone przed ponownym rysowaniem lub False (czyli zero) w przeciwnymprzypadku.(Zajmuj¹c siê samodzielnym przetwarzaniem indywidualnych komunikatówsprawdŸ w systemie pomocy Win32 API jakie wartoœci nale¿y nadaæ polu Result.)Ustaw pole Result zgodnie z w³asnymi potrzebami:procedure TMainForm.WmEraseBkgnd(var Msg : TWMEraseBkgnd);begin…{ Przeprowadzenie niezbêdnych operacji }…Msg.Result : = 0;end;Inne pola rekordu mapuj¹cego posiadaj¹ znaczenie specyficzne dla danegokomunikatu.Czasami oprócz samodzielnego przetworzenia komunikatu niezbêdne okazuje siêrównie¿ wywo³anie domyœlnej funkcji obs³uguj¹cej okreœlony komunikat.Wtedymo¿na u¿yæ funkcji DefaultHandler.Przyk³adowo, w pewnych warunkach mo¿ezachodziæ potrzeba rysowania na tle okna, podczas gdy w innych ju¿ nie.Je¿elinie pomalujemy t³a samodzielnie, bêdziemy chcieli, aby VCL wykona³ to w sposóbdomyœlny.Wtedy nale¿a³oby zrobiæ rzecz nastêpuj¹c¹:procedure TMainForm.WmEraseBkgnd(var Msg : TWMEraseBkgnd);beginif LetVCLHandle.Checked then beginDefaultHandler(Msg);Exit;end;…{ Przeprowadzenie innych operacji rysunkowych }…Msg.Result := 1;end;W innych przypadkach funkcjê DefaultHandler wykorzystasz do przeprowadzeniapewnych standardowych operacji na w³asne potrzeby.To, czy funkcjaDefultHandler powinna zostaæ wywo³ana przed, czy po naszym w³asnym kodziezale¿y ponownie od tego, co chcemy osi¹gn¹æ.Komunikaty definiowane przez u¿ytkownikaOprócz swych w³asnych komunikatów Windows honoruje równie¿ komunikatydefiniowane przez u¿ytkownika (ang.user-defined messages).Komunikat definiowany przez u¿ytkownika to nic wiêcej jak prywatny komunikat,który mo¿na wysy³aæ do w³asnej aplikacji lub jednego z jej okien.Implementowanie i przechwytywanie komunikatów zdefiniowanych przez u¿ytkownikajest niemal identyczne z obs³ug¹ standardowych komunikatów Windows.Jedynymwyj¹tkiem jest to, ¿e komunikat taki trzeba najpierw zdefiniowaæ.Definicjikomunikatu dokonuje siê poprzez zdefiniowanie jego identyfikatora, naprzyk³ad:constMoj_Komunikat = WM_USER +1;W powy¿szym przyk³adzie zadeklarowany zosta³ komunikat u¿ytkownika o nazwieMoj_Komunikat.Je¿eli wrócisz na chwilê do programu 14.4., zauwa¿ysz tam deklaracjê komunikatuu¿ytkownika.Po zdefiniowaniu komunikatu mo¿na zadeklarowaæ metodê, którabêdzie go obs³ugiwaæ:procedure MojKomunikat(var Msg : TMessage); message Mój_Komunikat;Zauwa¿, ¿e rekord mapuj¹cy przekazywany jako parametr jest typu TMessage.Jestto doœæ uniwersalny rekord zdefiniowany nastêpuj¹co:TMessage = recordMsg: Cardinal;case Integer of0: (WParam: Longint;LParam: Longint;Result: Longint);WM_USER jest specjalnym symbolem wyznaczaj¹cym pocz¹tek zakresu liczb, któremog¹ zostaæ u¿yte jako identyfikatory komunikatów u¿ytkownika.Górna granicatego zakresu odpowiada wartoœci WM_USER + 31734 (ja zazwyczaj wybieramidentyfikatory w okolicy WM_USER + 100)
[ Pobierz całość w formacie PDF ]