Subclassing: Pozadφ ListBoxu

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∞.

Zp∞t DalÜφ

Autor: The Bozena