Luați în considerare modul de creare a unei aplicații cu dialog ca fereastră principală, utilizând instrumentul de dezvoltare automată a aplicațiilor MFC AppWizard. Când creați un proiect utilizând acest instrument, trebuie să răspundeți la o serie de întrebări care determină tipul și capabilitățile aplicației pe care o creați.
Creați un șablon de aplicație
Mai întâi trebuie să selectați tipul de aplicație care urmează să fie creată din lista furnizată: "Document unic", "Document multiplu" sau "Dialog bazat" (aplicație bazată pe caseta de dialog fără fereastra principală). După selectarea tipului de aplicație "Dialog based", va apărea următoarea casetă de dialog, care este destinată să determine principalele proprietăți ale aplicației.
În acest panou, puteți specifica dacă aplicația pe care o creați va avea o casetă de dialog de informare, un subsistem de ajutor, controale tridimensionale, o tehnologie OLE și comunicare utilizând protocolul TCP / IP. Aici puteți seta și titlul casetei de dialog principale.
În ultima casetă de dialog, puteți specifica numele pentru clasele de aplicații pe care AppWizard le creează.
După ce ați definit toate proprietățile aplicației, aplicația MFC AppWizard va crea un proiect care poate fi imediat tradus și primit o aplicație complet gata de lansare. După lansarea aplicației, apare o casetă de dialog cu două butoane "OK" și "Anulare" și un câmp static.
Proiectul dlg include un număr de fișiere create de sistemul AppWizard (vezi apendicele 1). Luați în considerare scopul acestor fișiere:
Clasa principală de aplicații
Clasa principală a aplicației CDlgApp este definită în fișierul dlg.h și implementată în fișierul dlg.cpp.
Pentru clasa CDlgApp este descris un constructor fără parametri. Acest constructor este utilizat atunci când aplicația începe să creeze un obiect de clasă CDlgApp.
În plus față de constructor, în clasa CDlgApp, metoda InitInstance a clasei de bază CWinApp este redefinită. De fiecare dată când este lansată o nouă copie a aplicației, se numește această metodă. Aceasta este singura metodă a clasei principale, care trebuie neapărat să fie redefinită. Aplicația MFC AppWizard implementează metoda InitInstance pentru un alt tip de interfață de utilizator (într-o fereastră, pe mai multe ferestre, pe bază de dialog) în moduri diferite.
Apoi, metoda DoModal este apelată pentru obiectul dlg de clasă CDlgDlg. Creează o casetă de dialog și o afișează pe ecran. Valoarea furnizată de metoda DoModal. Puteți utiliza aceasta pentru a analiza rezultatul lucrării utilizatorului cu caseta de dialog.
Obiectul principal al aplicației
Obiectul global al clasei principale a aplicației este declarat în fișierul dlg.cpp. De la crearea acestui obiect începe lucrarea cererii.
Obiectul de clasă CWinApp (sau clasa moștenită de la acesta) este inclus în toate aplicațiile create folosind AppWizard-ul MFC, indiferent de interfața de utilizator a acestei aplicații.
Mesaj Clasă Mesaj
Tabelul de mesaje CDlgApp creat de instrumentul AppWizard constă din comenzile macro BEGIN_MESSAGE_MAP și END_MESSAGE_MAP. Între acestea există macrocomenzi care definesc mesajele procesate de această clasă. Inițial, în tabel este definit un singur mesaj de comandă cu ID_HELP. Pentru a le procesa, se numește metoda OnHelp a clasei de bază.
Mesajele neprelucrate sunt trimise la clasa de bază CWinApp pentru procesare. deoarece este specificat în al doilea parametru al macro BEGIN_MESSAGE_MAP.
Panoul de dialog
Clasa casetei de dialog principale este declarată în fișierul dlgDlg.h și este implementată în fișierul dlgDlg.cpp.
Clasa CDlgDlg este moștenită de la CDialog de clasă de bază. definite în biblioteca de clase MFC. Constructorul de clase are un parametru opțional, pParent, folosit pentru a trece indexul ferestrei principale a aplicației. Caseta de dialog în sine acționează ca fereastra principală, astfel că parametrul pParent nu este utilizat.
Aproape toate aplicațiile sunt asociate cu o pictogramă care va fi afișată când aplicația este minimizată. De obicei, această pictogramă este determinată la etapa de înregistrare a clasei ferestrei principale a aplicației. Aplicația dlg nu are o fereastră principală reală, ci o casetă de dialog. Prin urmare, afișarea pictogramei nu se realizează automat și, prin urmare, este necesar să se controleze afișarea acesteia (identificatorul pictogramei m_hIcon este definit în clasa CDlgDlg).
Constructorul de clasă CDlgDlg numește constructorul CDialog de clasă de bază. În același timp, ID-ul panoului de dialog și codul din fereastra principală a aplicației sunt trimise la acesta.
Blocul AFX_DATA_INIT este situat în corpul constructorului. În acesta, ClassWizard va adăuga codul de inițializare pentru elementele de date ale clasei CDlgDlg.
Constructorul inițializează de asemenea m_hIcon, scriind ID-ul IDR_MAINFRAME în el:
Metoda AfxGetAp returnează un cursor la obiectul clasei principale a aplicației (în acest caz, un pointer către obiectul App).
Caseta de dialog are doar butoane și nu are variabile asociate. Cu toate acestea, metoda DoDataExchange este suprascrisă. De fapt, el nu face nimic. Singurul lucru pe care îl face este numirea metodei DoDataExchange din clasa de bază CDialog.
Dacă adăugați comenzi noi în caseta de dialog și le asociați cu instrumentele ClassWizard cu elemente de date din clasa CDlgDlg, atunci blocul AFX_DATA_MAP va plasa apelurile la funcțiile DDX și DDV necesare pentru efectuarea schimbului de date.
Tabelul de mesaje CDlgDlg conține trei macrocomenzi care procesează mesajele WM_SYSCOMMAND, WM_PAINT și WM_QUERYDRAGICON. Ele sunt localizate în blocul AFX_MSG_MAP, astfel încât acestea sunt gestionate folosind ClassWizard.
Când se afișează caseta de dialog utilizând funcțiile DoModal, Create sau CreateIndirect. mesajul WM_INITDIALOG este trimis la funcția panoului interactiv. Nu există acces direct la funcția de dialog. Implementarea sa este inclusă în clasa CDialog.
Ca răspuns la mesajul WM_INITDIALOG, este apelată metoda OnInitDialog. declarată ca o metodă virtuală a clasei CDialog. Această metodă este apelată chiar înainte de afișarea panoului.
Aplicația MFC AppWizard în implementarea acestei metode a adăugat mai multe acțiuni: adăugarea unei linii în meniul sistemului pentru a apela o scurtă referință despre aplicație și utilizând metoda SetIcon a selectat o pictogramă pentru aplicație.
Dacă metoda OnInitDialog stabilește focalizarea de intrare la un alt control atunci când inițializați caseta de dialog, metoda trebuie să returneze FALSE.
Dacă specificați posibilitatea de a afișa o scurtă informație de referință la crearea unei aplicații șablon, atunci AppWizard va pregăti un fragment de cod care adaugă linia corespunzătoare în meniul sistemului, precum și metoda OnSysCommand a mesajelor din meniul sistemului.
Această metodă are doi parametri - identificatorul liniei de meniu a sistemului pe care utilizatorul l-a ales și parametrul care conține coordonatele mouse-ului, dacă alegerea este făcută de mouse.
Pentru a gestiona selecția elementelor de meniu standard, o metodă de suprascriere a apelurilor cere metoda de bază pentru clasa de bază (pentru prelucrarea mesajelor implicite), iar pentru anumite articole se efectuează o prelucrare specifică.
Caseta de dialog, spre deosebire de fereastra obișnuită, nu conține instrumente încorporate pentru afișarea pictogramei aplicației. Aplicația ar trebui să aibă grijă să afișeze pictograma în sine - aceasta este suprascrisă de metoda OnPaint. În această metodă se numește fie metoda OnPaint a clasei de bază, fie aplicația însăși afișează pictograma dacă este în prezent minimizată.
Utilizatorul poate "trage" miniaturile aplicației minimizate. Dacă utilizatorul efectuează această acțiune cu pictograma de fereastră, pentru clasa a cărei pictogramă nu este definită, este apelată metoda OnQueryDragIcon. Această metodă trebuie să returneze ID-ul cursorului mouse-ului care va fi afișat atunci când pictograma ferestrei este trasă.
În metoda override OnQueryDragIcon, instrumentul AppWizard returnează pur și simplu identificatorul pictogramei aplicației.