Je sice
hezkΘ, ₧e p°φklad pracuje jak mß, ale jist∞ Vßs napadß jedna otßzka: PRO╚
??? Podφvejme se te∩ na n∞kterΘ aspekty k≤du, kter² jme vytvo°ili.
Bod 1
Zpracovßvali jsme si zprßvu WM_CTLCOLORLISTBOX. Detailnφ popis tohoto
parametru najdete ve Windows Platform SDK Reference, zkrßcen∞ se dß °φci, ₧e
je to zprßva, kterß je zasφlßna nad°φzenΘmu oknu ListBoxu p°ed tφm, ne₧
systΘm ListBox p°ekreslφ. Pokud si tuto zprßvu zpracujeme d°φve, m∙₧eme tak
zm∞nit barvu textu a pozadφ ListBoxu za pomocφ ukazatele na specifick² obsah
v²stupnφho za°φzenφ (teda to je v∞ta :)))).
Windows
obdr₧φ tento parametr p°es WindowProc funkci:
LRESULT CALLBACK
WindowProc(
HWND hwnd, // ukazatel na okno
UINT uMsg, // WM_CTLCOLORLISTBOX
WPARAM wParam, // ukazatel na DC (HDC)
LPARAM lParam // ukazatel na ListBox (HWND)
);
Parametry:
wParam - ukazatel na obsah za°φzenφ pro ListBox
lParam - ukazatel na ListBox
NßvratovΘ hodnoty:
Pokud si aplikace zpracovßvß tuto zprßvu, pak musφ vracet ukazatel na brush.
SystΘm pak tento brush pou₧ije pro vykreslenφ pozadφ ListBoxu.
Vlastn∞ se
dß °φci, ₧e nejd∙le₧it∞jÜφ v∞c je a₧ na konci - NßvratovΘ hodnoty, kterß nßm
°φkß, ₧e pokud vrßtφme ukazatel na objekt Brush jako hodnotu z "NewWindowProc",
tak Windows tento Brush pou₧ijφ pro vykreslenφ pozadφ ListBoxu.
Kdy₧ je zprßva WM_CTLCOLORLISTBOX zpracovßvßna pomocφ funkce "NewWindowProc",
tak potom jako parametr vrßtφme ukazatel na Brush objekt "gBGBrush" mφsto
p∙vodnφ hodnoty. VÜechny ostatnφ zprßvy jsou zpracovßvßny normßln∞ pomocφ
API CallWindowLong().
Bod 2
Vytvo°ili jsme si objekt Brush - tento objekt byl vytvß°en pomocφ API
CreatePatternBrush() na udßlosti Load formulß°e Form1 jeÜt∞ p°ed tφm, ne₧
byl spuÜt∞n subclassing. Funkce CreatePatternBrush pot°ebuje pouze jeden
vstupnφ parametr, kter²m je ukazatel na objekt Image. V naÜem p°φpad∞ jsme
pou₧ili ukazatel pro Image1.Picture.
Bod 3
UkonΦili jsem subclassing a smazali objekt Brush kdy₧ se uzavφrß formulß°.
Smazßnφ objektu Brush je velice d∙le₧itΘ, proto₧e GDI32 si neumφ automaticky
spravovat zdroje a velice brzo byste m∞li nedostatek pam∞ti. Zrovna tak je
d∙le₧itΘ ukonΦenφ subclassingu, proto₧e jinak by se formulß° nezav°el
korektn∞. |