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(255, 0, 0));
break;
}
return hbr;
}
|
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(0, 255, 0);
m_brBkgnd.CreateSolidBrush(RGB(0, 255, 255));
}
|
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.
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.
|