V tomto dφle se koneΦn∞ podφvßme na dialogy. Vytvo°φme si aplikaci jejφ₧ hlavnφ okno bude dialog, p°idßme do nφ druh² dialog, kter² se potom nauΦφme zobrazovat jako modßlnφ i nemodßlnφ a samoz°ejm∞ nezapomeneme na t°etφ typ dialogu MessageBox. K tomu vyu₧ijeme prvnφ z dialogov²ch prvk∙ - tlaΦφtko.
ZaΦneme vytvo°enφm aplikace na zßklad∞ dialogu. Kostru aplikace op∞t vytvo°φme pomocφ AppWizardu stejn∞ jako v prvnφm dφle, ale v prvnφm kroku vybereme mφsto mo₧nosti Single document mo₧nost Dialog based. DalÜφ kroky pr∙vodce se potom od popisovan²ch v dφlu 1 liÜφ.
V druhΘm kroku si m∙₧eme zvolit zda bude mφt naÜe aplikace dialog o aplikaci (1), kter² m∙₧eme zobrazit ze systΘmovΘ nabφdky, kterß se zobrazφ po kliknutφ na ikonu aplikace v levΘm hornφm rohu okna, zda bude naÜe aplikace obsahovat nßpov∞du (2), ale soubor .hlp musφme vytvo°it sami a zda bude mφt naÜe aplikace 3D vzhled (3). Tato poslednφ mo₧nost ve skuteΦnosti nemß na aplikaci ₧ßdn² vliv.
V tomto kroku si jeÜt∞ m∙₧eme zvolit titulek apliace (4), ale to nedoporuΦuji, proto₧e AppWizard nastavuje jako jazyk dialogu angliΦtinu a tudφ₧ se vßm sprßvn∞ nezobrazφ hßΦky a Φßrky. To samoz°ejm∞ pozd∞ji zm∞nφme a zßrove≥ nastavφme po₧adovan² titulek dialogu.
T°etφ krok pr∙vodce odpovφdß pßtΘmu kroku pr∙vodce z prvnφho dφlu a Φtvrt² krok odpovφdß ÜestΘmu z prvnφho dφlu. Tentokrßt se nßm generujφ jen dv∞ t°φdy CMfcApp - t°φda aplikace a CMfcDlg - t°φda dialogu, kterß se starß o chovßnφ dialogu, ale vφce o nφ pozd∞ji.
Po dokonΦenφ AppWizardu by se vßm m∞la v okn∞ zobrazit Üablona dialogu se statick²m textem (1), ten hned sma₧te. Z Üablony sma₧ete dialogovΘ prvky tak, ₧e je kliknutφm vyberete a stisknete klßvesu Delete. P°esouvat je m∙₧ete takΘ pomocφ myÜi. Dßle vßm AppWizard vygeneroval dv∞ tlaΦφtka OK a Cancel (2). Pomocφ ·chyt∙ (3) m∙₧ete m∞nit velikost dialogu a kdy₧ kliknete na dialogov² prvek m∙₧ete stejn²m zp∙sobem m∞nit jeho velikost. Na pravΘ stran∞ mßte panel nßstroj∙ (4) se vÜemi dialogov²mi prvky, kterΘ m∙₧ete na dialog p°idat a to tak, ₧e jej v panelu nßstroj∙ vyberete a potom jej kliknutφm na dialog vlo₧φte. Jejich popis bude v tomto a nßsledujφcφ dφlech.
Ale jeÜt∞ ne₧ zaΦnete n∞co d∞lat, nastavte pro vÜechny zdroje jako jazyk ΦeÜtinu, uÜet°φ vßm to pozd∞ji vztekßnφ nad tφm, ₧e se vßm sprßvn∞ nezobrazuje diakritika. Postup je stejn² jako pro menu. (viz. 4. dφl)
Te∩ si do aplikace p°idßme jeÜt∞ jeden dialog. To ud∞lßte tak, ₧e prav²m tlaΦφtkem myÜi kliknete v okn∞ workspace na slo₧ku dialog∙ a z kontextovΘho menu vyberete insert.
Tφm zobrazφte dialog pro p°idßvßnφ zdroj∙. Tam vyberete dialog a stisknete tlaΦφtko New.
Tφm do aplikace vlo₧φte nov² dialog s identifikßtorem IDD_DIALOG1. Tento identifikßtor si zm∞nφme, a¥ nßm lΘpe vystihuje ·Φel tohoto dialogu a zßrove≥ zm∞nφme jeho titulek.
To se op∞t d∞lß ve vlastnostech dialogu. Ty zobrazφme tak, ₧e klikneme prav²m tlaΦφtkem myÜi kamkoli na dialog (hlavn∞ mimo dialogovΘ prvky) a z kontextovΘho menu vybereme Properties.
Ve vlastnostech dialogu zmenφme jeho identifikßtor (1) a titulek (2). Dßle m∙₧eme dialogu p°idat menu jednoduÜe tφm, ₧e vybereme jeho identifikßtor (3), ale dialog s menu se pou₧φvß jen vyjφmeΦn∞. TakΘ m∙₧eme zm∞nit pφsmo vÜech prvk∙ dialogu (4) a relativnφ pozici dialogu k jeho rodiΦovskΘmu oknu (5).
JeÜte ne₧ dialog s vlastnostmi dialogu zav°ete kliknutφm mimo n∞j, zatrhn∞te na kart∞ More Styles polo₧ku Visible. To nßm p°i zobrazovßnφ nemodßlnφho dialogu uÜet°φ volßnφ funkce ShowWindow.
Pro dokonΦenφ p°idßnφ dialogu do aplikace jeÜt∞ musφme p°idat t°φdu, kterß se bude starat o jeho zobrazenφ a funkΦnost. Z menu View vyberete polo₧ku Class Wizard. Class Wizard vßs upozornφ, ₧e naÜel nov² zdroj (jen pokud jste nezav°eli Üablonu dialogu) a zda pro n∞j mß vytvo°it novou t°φdu, nebo jej p°ipojit k ji₧ existujφcφ t°φd∞. Vyberte implicitnφ polo₧ku - Vytvo°it novou t°φdu.
Potom se vßs Class Wizard zeptß na jmΘno novΘ t°φdy (Name), v jak²ch zdrojov²ch souborech se ulo₧φ tato novß t°φda (File Name), jakß bude zßkladnφ t°φda tΘto novΘ t°φdy (Base class), tu nastavφ automaticky na sprßvnou volbu (CDialog) a jak² je identifikßtor Üablony dialogu, kterou chcete k tΘto t°φd∞ p°ipojit (Dialog ID), tu takΘ nastavφ sßm.
Jak vidφte nazval jsem novou t°φdu CModalNemodalDlg a bude ulo₧ena v souborech ModalNemodalDlg.h a ModalNemodalDlg.cpp. Po potvrzenφ tlaΦφtkem OK mßte t°φdu p°idßnu a m∙₧ete ClassWizard zav°φt (stiskem tlaΦφtka OK).
Te∩ p°idßme do hlavnφho dialogu (IDD_MFC_DIALOG) t°i tlaΦφtka. Otev°ete hlavnφ dialog tφm ₧e dvojkliknete na jeho identifikßtor v okn∞ workspace a v panelu dialogov²ch prvk∙ klikn∞te na tlaΦφtko (button). Je to t°etφ polo₧ka shora v pravΘm sloupci. Potom klikn∞te kamkoli do dialogu, kde chcete tlaΦφtko umφstit. Potom jej uchopenφm a p°eta₧enφm umφst∞te p°esn∞ tam kde jej chcete mφt. To opakujte jeÜt∞ dvakrßt pro dalÜφ dv∞ tlaΦφtka. Tφm jste do dialogu p°idali t°i tlaΦφtka se jmΘny Button1, Button2 a Button3. Tyto nßzvy vßm asi nevyhovujφ a takΘ budeme chtφt zm∞nit identifikßtor tohoto tlaΦφtka. Tak₧e zobrazφme vlastnosti tlaΦφtek a upravφme je. S vlastnostmi jste u₧ pracovali dost Φasto, tak₧e by vßs m∞lo napadnout jak. Ale pro jistotu. Klikn∞te prav²m tlaΦφtkem myÜi na tlaΦφtko jeho₧ vlastnosti chcete zm∞nit, z kontextovΘho menu vyberte Properties.
Tentokrßt nßs budou zajφmat jen dv∞ polo₧ky. ID co₧ je identifikßtor tlaΦφtka (jeho v²znam je obdobn² jako u menu a panelu nßstroj∙) a Caption, co₧ je text, kter² se na tlaΦφtku zobrazφ. Jejich hodnoty m∙₧ou b²t jakΘkoli, ale je zvykem, aby ID zaΦφnalo na IDC_ a bylo velk²mi pφsmeny. Jß je v ukßzkovΘ aplikaci (a dalÜφm vysv∞tlovßnφ) nastavil pro prvnφ tlaΦφtko na IDC_MESSAGE_BOX a MessageBox, pro druhΘ na IDC_MODALNI a Modßlnφ dialog a t°etφ IDC_NEMODALNI a Nemodßlnφ dialog.
Tφm jsme se dostali k vlastnφmu psanφ zdrojovΘho k≤du. Spus¥te ClassWizard. Pokud jste nezav°eli Üablonu dialogu, tak se vßs zeptß zda k nφ chcete p°ipojit t°φdu, proto₧e si myslφ, ₧e je to nov² zdroj. Ale pro tento dialog ji₧ t°φda existuje, tak₧e tento dotaz uzav°ete stiskem tlaΦφtka Cancel.
V polφΦku ClassName vyberte t°φdu dialogu, kter² obsahuje tlaΦφtka, jejich₧ obslu₧enΘ funkce chcete vytvo°it (CMfcDlg). V seznamu Object IDs vyberte identifikßtor tlaΦφtka. V seznamu Messages vyberte pro jakou akci chcete obslu₧nou funkci vytvo°it. Jsou dv∞ mo₧nosti: BN_CLICKED (kliknutφ) a BN_DOUBLECLICKED (dvojklik). My vybereme BN_CLICKED. Stiskn∞te tlaΦφtko AddFunction. ClassWizard se vßs zeptß na jmΘno obslu₧nΘ funkce. Pokud jste dob°e zvolili identifikßtory tlaΦφtek nebudete chtφt toto jmΘno m∞nit. Po potvrzenφ se obslu₧nß funkce p°idß do seznamu Member functions. Po zav°enφ ClassWizardu tlaΦφtkem OK se tyto funkce p°idajφ i do zdrojovΘho k≤du. Takto p°idejte obslu₧nΘ funkce pro vÜechna t°i tlaΦφtka jak vydφte na nßsledujφcφm obrßzku.
Na ka₧dou obslu₧nou funkci zobrazφme jeden typ dialogu. Ke zdrojovΘmu k≤du obslu₧nΘ funkce se dostanete stejn²m zp∙sobem jako k obslu₧nΘ funkci menu.
ZaΦneme nejjednoduÜÜφm typem - MessageBoxem. MessageBox zobrazφte pomocφ stejnojmennΘ funkce. Jeho vzhled ovlivnφte parametry tΘto funkce.
void CMfcDlg::OnMessageBox()
{
// TODO: Add your control notification handler code here
MessageBox("Toto je MessageBox.","Toto je titulek MessageBoxu.",MB_OK|MB_ICONINFORMATION);
}
Prvnφ parametr udßvß text zobrazen² v MessageBoxu, druh² jeho titulek a t°etφ jeho zobrazenφ a chovßnφ.
Nap°φklad:
MB_OK - MessageBox obsahuje jedinΘ tlaΦφtko - OK
MB_YESNO - MessageBox mß dv∞ tlaΦφtka Ano a Ne a nßvratovß hodnota funkce je bu∩ IDOK (MessageBox
byl uzav°en tlaΦφtkem OK) nebo IDNO (MessageBox byl uzav°en tlaΦφtkem Ne).
MB_ICONINFORMATION - ikona bublinky s pφsmenem i
a dalÜφ. (Podφvejte se do MSDN.)
V²sledn² MessageBox ze zdrojovΘho k≤du vypadß takto:
MessageBox je vhodn² pro zobrazovßnφ jednoduch²ch informacφ nebo pro jednoduchΘ rozhodovßnφ typu ano/ne(/zruÜit - MB_YESNOCANCEL).
Dßle se podφvßme na modßlnφ dialogy. Pro ty ji₧ je t°eba Üablona a t°φda, kterΘ jsme si vytvo°ili d°φve. Modßlnφ dialog se zobrazφ a zablokuje ostatnφ okna aplikace (krom∞ nemodßlnφch dialog∙ nebo t∞ch, kterß jsou zobrazena z n∞j.) dokud jej nezav°ete. (VyzkouÜejte si to.) Pro jeho zobrazenφ volßte funkci zßkladnφ t°φdy vÜech dialog∙ CDialog::DoModal(). Provßd∞nφ tΘto funkce neskonΦφ dokud nezav°ete dialog a jejφ nßvratovß hodnota odpovφdß tlaΦφtku, kterΘ jste pro jeho uzav°enφ pou₧ili. Zde je v²pis zdrojovΘho k≤du obslu₧nΘ funkce odpovφdajφcφho tlaΦφtka. (Nezapome≥te vlo₧it na zaΦßtek souboru mfcdlg.h hlaviΦkov² soubor modalnemodaldlg.h pomocφ direktivy #include. HlaviΦkov² soubor vklßdßte do hlaviΦkovΘho souboru kv∙li dßle vysv∞tlovanΘmu nemodßlnφmu dialogu.)
void CMfcDlg::OnModalni()
{
// TODO: Add your control notification handler code here
CModalNemodalDlg dlg; // Vytvo°φ objekt t°φdy dialogu
/*
Zobrazφ dialog a po jeho zav°enφ zkontroluje zda byl ukonΦen tlaΦφtkem OK - IDOK.
Pro tlaΦφtko Cancel by byla odpovφdajφcφ konstanta IDCANCEL.
*/
if (dlg.DoModal()==IDOK)
{
/*
Zdrojov² k≤d, kter² by jste vlo₧ili zde, by se provedl a₧ po zav°enφ zobrazenΘho
dialogu za p°edpokladu, ₧e by jste jej zav°eli pomocφ tlaΦφtka OK.
*/
}
}
Poslednφm typem dialogu je nemodßlnφ dialog. Od modßlnφho dialogu se liÜφ jedin∞ tφm, ₧e funkce, kterß jej vytvß°φ - CDialog::Create(...), skonΦφ ihned po vytvo°enφ dialogu, tak₧e nenφ ₧ßdn² jednoduch² zp∙sob jak zjistit kdy a jak²m tlaΦφtkem byl dialog uzav°en. Ale jeÜt∞ ne₧ zaΦneme psßt obslu₧nou funkci tlaΦφtka zobrazujφcφho nemodßlnφ dialog pot°ebujeme p°idat do hlaviΦkovΘho souboru hlavnφho dialogu aplikace ukazatel na t°φdu nemodßlnφho dialgu.
/////////////////////////////////////////////////////////////////////////////
// CMfcDlg dialog
#include "modalnemodaldlg.h"
class CMfcDlg : public CDialog
{
// Construction
public:
CMfcDlg(CWnd* pParent = NULL); // standard constructor
CModalNemodalDlg* pDlg; // uklazatel na t°φdu modßlnφho/nemodßlnφho dialogu
a v konstruktoru jej nastavte na NULL.
CMfcDlg::CMfcDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMfcDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMfcDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pDlg = NULL;
}
A te∩ ji₧ nßsleduje obslu₧nß funkce tlaΦφtka, kterΘ zobrazuje nemodßlnφ dialog.
void CMfcDlg::OnNemodalni()
{
// TODO: Add your control notification handler code here
/*
Pokud nenφ objek t°φdy dialogu vytvo°en, vytvo°φme ho.
*/
if (!pDlg) pDlg = new CModalNemodalDlg;
/*
Pokud prom∞nnß handle okna v t°φd∞ dialogu nemß hodnotu platnΘho okna,
tj. nenφ vytvo°en nemodßlnφ (nebo modßlnφ) dialog, vytvo°φme nemodßlnφ dialog.
Prvnφ parametr funkce Create je identifikßtor Üablony dialogu, kterß pat°φ
k t°φd∞ vytvß°enΘho nemodßlnφho dialogu a druh² parametr je ukazatel na
rodiΦovskΘ okno. V tomto p°φpad∞ je to ukazatel na objekt t°φdy hlavnφho
dialogu aplikace, ze kterΘ je nemodßlnφ dialog vytvß°en.
*/
if (!::IsWindow(pDlg->m_hWnd)) pDlg->Create(IDD_MODAL_NEMODAL,this);
/*
Nßsledujφcφ °ßdek kontoluje zda byl nemodßlnφ dialog zobrazen a pokud ne, zobrazφ
jej pomocφ funkce ShowWindow. Jejφ parametr udßvß jak²m zp∙sobem je nemodßlnφ dialog
zobrazen. Tato funkce je u vÜech oken a pomocφ nφ m∙₧ete ve sv²ch aplikacφch m∞nit
zp∙sob zobrazenφ okna.
U modßlnφho dialogu by se tato funkce provedla a₧ po uzav°enφ dialogu, ale u nemodßlnφho
dialogu funkce kterß jej vytvß°φ neΦekß na jeho uzav°enφ.
*/
if (!pDlg->IsWindowVisible()) pDlg->ShowWindow(SW_SHOW);
/*
Te∩ jeÜt∞ zm∞nφme titulek nemodßlnφho dialogu, aby byl na prvnφ pohled rozeznat od
modßlnφho dialogu, i kdy₧ je k jeho vytvo°enφ pou₧ita stejnß Üablona a t°φda dialogu
jako pro vytvo°enφ modßlnφho dialogu.
*/
pDlg->SetWindowText("Nemodßlnφ dialog");
}
Op∞t si vyzkouÜejte, ₧e tentokrßt dialog neblokuje ₧ßdnß okna aplikace. JeÜt∞ bychom m∞li zajistit smazßnφ pam∞ti alokovanΘ pro nemodßlnφ dialog (nejlΘpe v destruktoru), ale nenφ to t°eba, proto₧e se alokuje jen jednou p°i prvnφm stisku tlaΦφtka pro zobrazenφ nemodßlnφho dialogu a p°i ukonΦenφ aplikace, tj. uzav°enφ hlavnφho dialogu, se sma₧e automaticky. Ze stejnΘho d∙vodu by jste mohli namφtnout, ₧e nenφ t°eba pou₧φvat ukazatel na CModalNemodalDlg a ₧e mφsto n∞j m∙₧eme do deklarace t°φdy hlavnφho dialogu dßt p°φmo prom∞nnou typu CModalNemodalDlg. M∞li by jste pravdu, ale u nemodßlnφch dialog∙ je zvykem pou₧φvat ukazatel.
A to je pro dneÜek vÜe. P°φÜt∞ se podφvßme na dalÜφ dialogovΘ prvky a to editaΦnφ °ßdek a statick² text.
Zdrojov² k≤d tΘto lekce si m∙₧ete stßhnout zde.