Hlavnφ
Hlavnφ strana
Seznam Φlßnk∙
NejΦten∞jÜφ Φlßnky
Progres e-mailem
Visual C++ FAQ

Serißly
COM
ISAPI

banner2.gif (2546 bytes)

Nenechte si ujφt
NeobdΘlnφkovß okna
Tisk bez Preview
MFC a DLL
Logo v MDI ploÜe
Kouzla s kombo-boxem
V²jimky v C++

banner.gif (3305 bytes)

Kouzla s kombo-boxem dφl 3. Jan Odvßrko
22.10.1999
[Hlavnφ strßnka]  |  [Rubrika]  |  [Download]

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

 


PodobnΘ Φlßnky: Subclassing - pod°izovßnφ oken,

<<P°edchozφ
Kouzla s kombo-boxem dφl 2.
╚lßnek je za°azen do serißlu Nßsledujφcφ>>
Kouzla s kombo-boxem dφl 4.

Kdo Otßzka nebo p°ipomφnka

Prohlφ₧enφ p°φsp∞vk∙ nebo nov² p°φsp∞vek

O firm∞... Kontakt Ostatnφ