3.1 D∞tskß okna kombo-boxu
Ve t°etφm dφle naÜeho serißlu o kombφΦku pou₧ijeme mechanismu subclassing
pro p°φm² p°φstup k d∞tsk²m okn∙m kombo-boxu. V p°edchozφm dφle jsme se
dozv∞d∞li, ₧e t∞mito d∞tsk²mi okny jsou edit a list-box. Pokud
m∞nφme chovßnφ t∞chto d∞tsk²ch oken (nejen barvy) ve v∞tÜφ mφ°e, je ideßlnφ
mφt vlastnφ t°φdy, kterΘ reprezentujφ vÜechny t°i Φßsti tohoto kombinovanΘho
prvku (obvykle mßme pouze t°φdu, kterß p°edstavuje cel² kombo-box). Tato konstrukce
nßm pak dovoluje, jednoduÜe reagovat na vÜechny zprßvy p°ichßzejφcφ vÜem t°em
okn∙m.
3.2 P°φklad
Pomocφ ClassWizardu si vygenerujeme t°i t°φdy, kterΘ budou reprezentovat
jednotlivß okna. Nßsledujφcφ tabulka uvßdφ jejich v²Φet a p°edky.
JmΘno t°φdy |
P°edek |
PRO_CustomEdit |
CEdit |
PRO_CustomListBox |
CListBix |
PRO_CustomComboBox |
CComboBox |
Jedin²m v∞tÜφm problΘmem, kter² musφme v naÜem p°φkladu
°eÜit je zφskßnφ HWND obou zmφn∞n²ch d∞tsk²ch oken. Pro
vy°eÜenφ tohoto problΘmu pou₧ijeme zprßvy WM_CTLCOLOR, kterΘ tato
okna posφlajφ svΘmu rodiΦi. P°i prvnφm v²skytu tΘto zprßvy pak provedeme subclassing.
V prvnφm kroku provedeme subclass rodiΦe (tzn. vlastnφho komba).
Vytvo°φme dialogovou Üablonu (samoz°ejm∞ takΘ vygenerujeme odpovφdajφcφ
dialogovou t°φdu) a vlo₧φme do nφ ovlßdacφ prvek u₧ivatelskΘho rozhranφ combo-box.
Nßsledn∞ na tento prvek ClassWizardem "namapujeme" Φlenskou
prom∞nnou, kterß bude z kategorie Control a jejφ typ bude PRO_CustomComboBox
(tento postup jsme ji₧ n∞kolikrßt opakovali v p°edchozφch dφlech).
Ve t°φd∞ PRO_CustomComboBox zalo₧φme dv∞ ΦlenskΘ
prom∞nnΘ - instance t°φd PRO_CustomEdit a PRO_CustomListBox. Tyto
prom∞nnΘ budou reprezentovat d∞tskß okna. Nßsledujφcφ ukßzka zdrojovΘho k≤du
znßzor≥uje stav naÜφ t°φdy
class PRO_CustomComboBox : public CComboBox
{
// ...
// Attributes
protected:
PRO_CustomEdit m_oEdit;
PRO_CustomListBox m_oListBox;
// ...
}; |
Nynφ m∙₧eme ve t°φd∞ PRO_CustomComboBox vygenerovat
reakci na zprßvu WM_CTLCOLOR, ve kterΘ budeme provßd∞t sublassing
d∞tsk²ch oken. Nov∞ implementovanΘ t∞lo metody OnCtlColor m∙₧ete vid∞t na dalÜφ
ukßzce zdrojovΘho k≤du.
HBRUSH PRO_CustomComboBox::OnCtlColor( CDC* pDC, CWnd* pWnd,
UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_EDIT)
{
if (m_oEdit.GetSafeHwnd() == NULL)
m_oEdit.SubclassWindow(pWnd->GetSafeHwnd());
}
else if (nCtlColor == CTLCOLOR_LISTBOX)
{
if (m_oListBox.GetSafeHwnd() == NULL)
m_oListBox.SubclassWindow(pWnd->GetSafeHwnd());
}
return hbr;
} |
Pozorn² Φtenß° si jist∞ uv∞domφ, ₧e k subclassingu dojde v
dob∞ prvnφho vykreslovßnφ d∞tsk²ch oken. V p°φpad∞ list-boxu je to tedy
v okam₧iku prvnφho zobrazenφ pomocφ tlaΦφtka.
Abychom se p°esv∞dΦili, ₧e nßÜ mechanismus skuteΦn∞ funguje
vygenerujeme ve t°φdßch PRO_CustomEdit a PRO_CustomListBox reakci na
zprßvu WM_LBUTTONDBLCLK a vyvolßme v reakci na ni textovΘ okno pomocφ AfxMessageBox.
Podφvejme se zdrojov² k≤du, kter² ukazuje ob∞ tyto metody.
void PRO_CustomEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
{
AfxMessageBox("PRO_CustomEdit::OnLButtonDblClk");
CEdit::OnLButtonDblClk(nFlags, point);
} void PRO_CustomListBox::OnLButtonDblClk(UINT nFlags, CPoint point)
{
AfxMessageBox("PRO_CustomListBox::OnLButtonDblClk");
CListBox::OnLButtonDblClk(nFlags, point);
} |
Pokud spustφte naÜi testovacφ aplikaci a pokusφte se poklepat na
editaΦnφ °ßdek, nebo na seznam, objevφ se naÜe textovΘ okno.
D∙le₧itou vlastnostφ naÜich t°φd, je jejich samostatnß
pou₧itelnost. To znamenß, ₧e t°φdy PRO_CustomEdit a PRO_CustomListBox, lze pou₧φt
pro vytvo°enφ instancφ, kterΘ jsou "namapovanΘ" na odpovφdajφcφ prvky
u₧ivatelskΘho rozhranφ (tj. edit a list-box).
|