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 2. Jan Odvßrko
19.10.1999
[Hlavnφ strßnka]  |  [Rubrika]  |  [Download]

1.2 Zm∞na barev
╚ast²m po₧adavkem je zm∞na barev ovlßdacφch prvk∙ (pozadφ, text, ...). Pro vy°eÜenφ tohoto problΘmu mßme dv∞ mo₧nosti. Barvu m∙₧e nastavovat rodiΦ ovlßdacφho prvku (nejΦast∞ji dialog), nebo ovlßdacφ prvek sßm. Druhß mo₧nost je vhodnß tam, kde chceme vytvo°it specißlnφ prvek u₧ivatelskΘho rozhranφ a nechceme opakovat k≤d zm∞ny barvy v ka₧dΘm pou₧itΘm dialogu. Na nßsledujφcφm p°φklad∞ je demonstrovßna prvnφ varianta.

2.2 A¥ se sna₧φ rodiΦ
V dialogu, je₧ obsahuje dan² ovlßdacφ prvek musφme reagovat na zprßvu WM_CTLCOLOR, kterou svΘmu rodiΦi zasφlajφ vÜechny ovlßdacφ prvky. Pomocφ tΘto zprßvy dßvß prvek svΘmu rodiΦi k dispozici sv∙j obrazov² kontext (device context), kter² tak m∙₧e m∞nit jeho atributy - nap°. barvy. HlaviΦka metody, kterß bude obsluhovat tuto zprßvu je nßsledujφcφ.

HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd,
	UINT nCtlColor );

pDC           Ukazatel na obrazov² kontext d∞tskΘho okna.
pWnd         Ukazatel na okno, kterΘ zasφlß zprßvu (je₧ se dotazuje na barvu).
nCtlColor   Typ d∞tskΘho okna.

Nßvratovou hodnotou tΘto metody je Üt∞tec, kter² se pou₧ije pro vypln∞nφ pozadφ okna. PozornΘho Φtenß°e jist∞ napadne, ₧e zm∞nou tohoto Üt∞tce lze m∞nit barvu pozadφ dialogu..

V nßsledujφcφ tabulce si jeÜt∞ uve∩me, jak²ch hodnot m∙₧e poslednφ parametr - nCtlColor nab²vat.

CTLCOLOR_BTN   
CTLCOLOR_DLG   
CTLCOLOR_EDIT  
CTLCOLOR_LISTBOX   
CTLCOLOR_MSGBOX   
CTLCOLOR_SCROLLBAR   
CTLCOLOR_STATIC   
Button control
Dialog box
Edit control
List-box ontrol
Message box
Scroll-bar control
Static control

Pokud tedy budeme chtφt zm∞nit barvu textu ve vÜech editaΦnφch °ßdcφch, vΦetn∞ editaΦnφch °ßdk∙ kombo-box∙, bude implementace tΘto metody nßsledujφcφ.

HBRUSH CColorComboDlg::OnCtlColor(CDC* pDC, CWnd* pWnd,
	UINT nCtlColor) 
{
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd,
	nCtlColor);
  
  switch (nCtlColor)
  {
  case CTLCOLOR_EDIT:
    pDC->SetTextColor(RGB(25500));
    break;
  }
  
  return hbr;
}

jo_15101999_magiccombo2_obr1.gif (2309 bytes)

3.2 Jß sßm
Pokud nechceme m∞nit barvu u vÜech ovlßdacφch prvk∙ stejnΘho typu, nebo pot°ebujeme vytvo°it takov² prvek, kter² si bude barvy m∞nit sßm (nemusφme pak opakovat k≤d v dialogu, kde je pou₧it²) pou₧ijeme druh² zp∙sob, kter² souvisφ s mechanismem Message Reflection.

Ve Windows obvykle zasφlajφ d∞tskß okna sv²m rodiΦ∙m notifikaΦnφ zprßvy. Od verze MFC 4.0 je vÜak implementovßn specißlnφ mechanismus message reflection, kter² umo₧≥uje zpracovat tuto zprßvu p°φmo v d∞tskΘm okn∞. Uka₧me si pou₧itφ tohoto mechanismu nejd°φve na zm∞n∞ barev v editaΦnφm °ßdku.

3.2.1 P°φklad zm∞ny barev v editaΦnφm °ßdku
Pomocφ ClassWizardu si vygenerujeme t°φdu PRO_ColorEdit, kterß bude reprezentovat nßÜ obarven² editaΦnφ °ßdek. Tato t°φda bude d∞dit ze t°φdy CEdit. Ve t°φd∞ zalo₧φme dv∞ ΦlenskΘ prom∞nnΘ, kterΘ budou definovat barvu textu (m_clrText) a barvu pozadφ  (m_brBkgnd), typ t∞chto prom∞nn²ch je vid∞t na nßsledujφcφ ΦßsteΦnΘ ukßzce zdrojovΘho k≤du.

class PRO_ColorEdit : public CEdit
{
// ...

// Attributes
public:
  COLORREF m_clrText;
  CBrush m_brBkgnd;

// ...
};

V konstruktoru naÜφ t°φdy ob∞ prom∞nnΘ inicializujeme...

PRO_ColorEdit::PRO_ColorEdit()
{
  m_clrText = RGB(02550);
  m_brBkgnd.CreateSolidBrush(RGB(0255255));
}

Op∞t pomocφ ClassWizardu vygenerujeme reakci na notifikaΦnφ (odra₧enou) zprßvu =WM_CTLCOLOR. Pozor neplΘst se zprßvou WM_CTLCOLOR, kterß je zasφlßna rodiΦi! V tΘto metod∞ pak m∙₧eme jednoduch²m zp∙sobem nastavit atributy obrazovΘho kontextu editaΦnφho °ßdku. Podφvejme se op∞t na nßsledujφcφ ukßzku.

HBRUSH PRO_ColorEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
{
  pDC->SetTextColor(m_clrText);
  pDC->SetBkMode(TRANSPARENT);
  return m_brBkgnd;
}

Do p°ipravenΘ dialogovΘ Üablony vlo₧φme kombo-box a pomocφ ClassWizardu (op∞t) na tento ovlßdacφ prvek "namapujeme" Φlenskou prom∞nnou m_oComboBox. Tato prom∞nnß bude nßle₧et do kategorie Control a jejφ typ bude PRO_ColorEdit.

3.2.1 P°φklad zm∞ny barev v combo-boxu
Nynφ si ukß₧eme zm∞nu barev v kombφΦku. Zde je situace pon∞kud slo₧it∞jÜφ, proto₧e kombo (combo-box) je prvek slo₧en² s editaΦnφho °ßdku (edit) a seznamu (list-box). Musφme tedy tuto architekturu brßt v ·vahu. Podobn∞ jako v p°edchozφ kapitole vygenerujeme t°φdu PRO_ColorComboBox, kterß bude reprezentovat obarvenΘ kombφΦko. Tato t°φda bude op∞t obsahovat dv∞ ΦlenskΘ prom∞nnΘ, kterΘ definujφ barvy a jsou inicializovanΘ v konstruktoru.

Vygenerujeme reakci na zprßvu WM_CTLCOLOR (ne notifikaci). Pozor, zde nevyu₧φvßme mechanismu message reflection, proto₧e kombo-box (jako rodiΦ) obdr₧φ tuto standardnφ zprßvu od sv²ch d∞tsk²ch oken - editaΦnφho °ßdku a list-boxu. Obarven² tedy bude jak list-box, tak i editaΦnφ °ßdek kombo-boxu.

Nßsledujφcφ k≤d ukazuje implementaci naÜφ metody.

HBRUSH PRO_ColorComboBox::OnCtlColor( CDC* pDC,
  CWnd* pWnd, UINT nCtlColor ) 
{
  HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd,
	nCtlColor);
  
  switch (nCtlColor)
  {
  case CTLCOLOR_EDIT:
  case CTLCOLOR_LISTBOX:
    pDC->SetTextColor(m_clrText);
    pDC->SetBkMode(TRANSPARENT);
    break;
  }

  return m_brBkgnd;
}

Do p°ipravenΘ dialogovΘ Üablony m∙₧eme nynφ vlo₧it ovlßdacφ prvek kombo a "namapovat" prom∞nnou nap°. m_oColorCombo, kterß nale₧φ do kategorie Control a je typu PRO_ColorComboBox. NaÜe barevnΘ kombo mß vÜak v tuti chvφli jeÜt∞ jeden drobn² nedostatek. Pokud spustφte testovacφ aplikaci uvidφte nßsledujφcφ detail.

jo_15101999_magiccombo2_obr2.gif (1498 bytes)

Vnit°nφ okraj kombφΦka z∙stal neobarven² (bφl²). To je zp∙sobeno tφm, ₧e editaΦnφ °ßdek nezabφrß celou vnit°nφ plochu komba a Φßst je viditelnß (okraj). Musφme, nynφ ji₧ s pou₧itφm mechanismu message reflection obarvit jeÜt∞ pozadφ kombo-boxu. Princip je stejn² jako v p°edchozφ kapitole, tak₧e vygenerujeme reakci na notifikaΦnφ zprßvu =WM_CTLCOLOR. Implementace tΘto metody bude nßsledujφcφ.

HBRUSH PRO_ColorComboBox::CtlColor(CDC* pDC,
	UINT nCtlColor) 
{
  return m_brBkgnd;
}

Nynφ je ji₧ vÜechno jak mß b²t.

jo_15101999_magiccombo2_obr3.gif (2259 bytes)

 


PodobnΘ Φlßnky: Jak obarvit dialog?,

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

Kdo Otßzka nebo p°ipomφnka

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

O firm∞... Kontakt Ostatnφ