Szabóné Nacsa Rozália nacsa@inf.elte.hu
Eseményvezérelt alkalmazások A Windows alkalmazások eseményvezérelt alkalmazások Esemény: egér kattintás billenty leütés stb.
Üzenetkezelés Operációs rendszer kódja 1. A Windows érzékeli az eseményt. 2. A Windows meghatározza, hogy az esemény mely ablak(ok)ra vonatkozik. 3. A Windows meghívja az adott ablak ablakkezel függvényét (WndProc). 4. A WndProc függvény meghatározza az esemény/üzenet típusát, majd átadja a vezérlést az adott üzenetet lekezel függvénynek. MFC/Üzenettábla 5. A függvény feldolgozza a kapott üzenetet. Esemény/üzenet kezel függvény
Feladat Adjunk meg két számot, és a Számol gomb lenyomása után jelenítsük meg a két szám összegét. A Vége gomb lenyomásakor lépjünk ki az alkalmazásból. A párbeszédablak címkesorában jelenjen meg a Számolási gyakorlatok felirat.
Microsoft Foundation Classes Osztálykönyvtár Alkalmazás keretrendszer
Információk az MFC osztályokról: Help
Információk az MFC osztályokról: Help
Információk az MFC osztályokról: Help
Projekt összeállítása MFC AppWizard Osztályvarázsló Projekt csontváza Dialógustervez Programozó
Új project váz létrehozása
Project típusa: MFC App Wizard(exe) 3 2 1 4 MFC_AppWizard(exe)
MFC AppWizard Step 1 Dialog based Minta
Minta MFC AppWizard Step 2
Comments MFC AppWizard Step 3
MFC AppWizard Step 4
New Project Information Summary type classes features
Generált osztályok Classes to be created: Application CSzamolApp in Szamol.h and Szamol.cpp. Dialog: CSzamolDlg in SzamolDlg.h and SzamolDlg.cpp
Projekt fordítása/szerkesztése/futtatása Rebuild all
Az alkalmazásvarázsló által generált osztályok CWinApp CDialog CSzamolApp CSzamolDlg InitInstance()
Az alkalmazásvarázsló által generált osztályok megvalósítása CWinApp CDialog CSzamolApp CSzamolDlg InitInstance() Szamol.h Szamol.cpp SzamolDlg.h SzamolDlg.cpp
Workspace, Output view Workspace Output View
Workspace, Output view Workspace A Workspace és az Output View megjelenítését a View menüpontban szabályozhatjuk.
Class View Class View
Resource View ResourceView
File View FileView
Szamol.h - részlet //{{AFX_ //}}AFX_
Szamol.cpp - részlet
SzamolDlg.h - részlet
SzamolDlg.cpp - részlet
Példa dialógusablakra
Dialógusablak tervezése 2 3 1 4
Text box Text Box
Edit box Edit Box
Radio button Radio Button
Group Box Csak keret! Group box
Button Button
Egy egyszer feladat Adjunk meg két számot, és a Számol gombra kattintva jelenítsük meg a két szám összegét. A Vége gombra kattintva lépjünk ki az alkalmazásból. A párbeszédablak címkesorában jelenjen meg a Számolási gyakorlatok felirat.
A Szamol alkalmazás osztálydiagramja CWinApp CDialog CSzamolApp InitInstance() adattagok eseménykezel k CSzamolDlg int m_op1; int m_op2; int m_eredmeny; OnSzamolButton(); OnVegeButton();
IDC_OP2_EDIT Vezérl elemek IDC_OP1_EDIT IDC_EREDMENY_EDIT IDC_SZAMOL_BUTTON IDC_VEGE_BUTTON IDC_STATIC IDC_STATIC
m_op2 Vezérl elemek + változók IDC_OP2_EDIT m_op1 m_eredmeny IDC_OP1_EDIT IDC_EREDMENY_EDIT IDC_SZAMOL_BUTTON IDC_VEGE_BUTTON IDC_STATIC IDC_STATIC
Párbeszédablak - Properties Címkesor szövegének beállítása 1 Jobb egérgombbal hívjuk el a helyi menüt, majd válasszuk ki a Properties menüpontot. 2
Párbeszédablak - Címke A Properties ablakban megadhajuk az ablak cimkesorát.
Vezérl k törlése Töröljük le a generált párbeszédablak vezérl it.
Els operandus elhelyezése Válasszuk ki az Edit Box eszközt, majd jelöljük ki az els operandus helyét.
Jellemz k (properties) beálítása A kiválasztott szövegdoboz felett jobb egérgombbal hívjuk el a helyi menüt, majd válasszuk ki a Properties menüpontot.
General Properties Styles Extended styles IDC_OP1_EDIT
Adattag - Vezérl CDialog IDC_OP1_EDIT CSzamolDlg int m_op1; Adattag Vezérl elem Ha az adattagot az osztályvarázslóval hozzuk létre, akkor a kapcsolattartás jól m ködik.
Class Wizard Adattag hozzáadása 1 2 4 3 View/Class Wizard (Ctrl+W) vagy Ctrl+dupla klikk.
Adattag specifikálása 1 3 2 4 5 6 7
class CSzamolDlg : public CDialog {... // Dialog Data //{{AFX_DATA(CSzamolDlg) enum { IDD = IDD_SZAMOL_DIALOG }; } int //}}AFX_DATA m_op1; SzamolDlg.h Az AddVariable eredménye. CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) { //{{AFX_DATA_INIT(CSzamolDlg) m_op1 = 0; } //}}AFX_DATA_INIT... SzamolDlg.cpp
Az Op1-hez hasonlóan elkészíthetjük az Op2 és az Eredmeny szövegdobozokat is. Vezérl azonosító: IDC_OP1_EDIT Változó: int m_op1 Vezérl azonosító: IDC_OP2_EDIT Változó: int m_op2 Vezérl azonosító: IDC_EREDMENY_EDIT Változó: int m_eredmeny
A kiválasztott szövegdoboz felett jobb egérgombbal hívjuk el a helyi menüt, majd válasszuk ki a Properties menüpontot. Text Box
Text Box Jobb egérgomb + Properties Nem egyedi név
Jobb egérgomb + Properties Button
Jobb egérgomb + Properties Button
IDC_OP1_EDIT IDC_OP2_EDIT CDialog IDC_EREDMENY_EDIT CSzamolDlg int m_op1; int m_op1; int m_eredmeny;
Class Wizard: Member variables
CSzamolDlg osztály - SzamolDlg.h class CSzamolDlg : public CDialog { // Construction public: CSzamolDlg(CWnd* pparent = NULL); SzamolDlg.h // standard constructor // Dialog Data //{{AFX_DATA(CSzamolDlg) enum { IDD = IDD_SZAMOL_DIALOG }; int int int m_op1; m_op2; m_eredmeny;... } //}}AFX_DATA
CSzamolDlg osztály SzamolDlg.cpp CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) { //{{AFX_DATA_INIT(CSzamolDlg) SzamolDlg.cpp m_op1 = 0; m_op2 = 0; m_eredmeny = 0; } //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Változók feltöltése a vezérl kb l IDC_OP1_EDIT IDC_OP2_EDIT CDialog IDC_EREDMENY_EDIT CSzamolDlg int m_op1; int m_op1; int m_eredmeny; UpdateData() vagy UpdateData(TRUE)
Vezérl k feltöltése az adattagokból IDC_OP1_EDIT IDC_OP2_EDIT CDialog IDC_EREDMENY_EDIT CszamolDlg int m_op1; int m_op1; int m_eredmeny; UpdateData(FALSE)
Adatcsere void CSzamolDlg::DoDataExchange(CDataExchange* pdx) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSzamolDlg) DDX_Text(pDX, IDC_OP1_EDIT, m_op1); DDX_Text(pDX, IDC_OP2_EDIT, m_op2); DDX_Text(pDX, IDC_EREDMENY_EDIT, m_eredmeny); } //}}AFX_DATA_MAP Ebbe a táblába csak azok a változók kerülnek be, akiket az osztályvarázslóval hoztunk létre.
Eseménykezelés - Számol CSzamolDlg int m_op1; int m_op1; int m_eredmeny; A Számol gombra kattintva hajtsuk végre a következ ket: UpdateData(); 1
Eseménykezelés - Számol CsSzamolDlg int m_op1; int m_op1; int m_eredmeny; A Számol gombra kattintva hajtsuk végre a következ ket: UpdateData(); m_eredmeny = m_op1 + m_op2; 2
Eseménykezelés - Számol CSzamolDlg int m_op1; int m_op1; int m_eredmeny; A Számol gombra kattintva hajtsuk végre a következ ket: UpdateData(); m_eredmeny = m_op1 + m_op2; UpdateData(FALSE); 3
A Számol gombra kattintva,?
Eseménykezelés - konvenciók Vezérl azonosító: IDC_SZAMOL_BUTTON Üzenet: BN_CLICKED Eseménykezel metódus: OnSzamolButton() Az eseménykezel metódus vázát osztályvarázslóval hozzuk létre.
Eseménykezelés: Számol gomb View/Class Wizard 1 2 3
Eseménykezelés: Számol gomb View/Class Wizard 1 2 5 4 7 3 6
Eseménykezelés: Számol gomb
OnSzamolButton() - kód Az eseménykezel váza
OnSzamolButton()
Eseménykezelés: Számol gomb void CSzamolDlg::OnSzamolButton() { // TODO: Add your control notification handler code here } UpdateData(); m_eredmeny = m_op1 + m_op2; UpdateData(FALSE); Itt adjuk meg, mit kell tenni, ha a Számol gombra kattintott valaki.
Eseménykezelés:Vége gomb Feladat: A Vége gombra kattintva lépjünk ki az alkalmazásból.
Control ID: IDC_VEGE_BUTTON Message handler: onvegebutton Az eseménykezel metódus vázát osztályvarázslóval hozzuk létre.
1 2 5 4 7 3 6
void CSzamolDlg::OnVegeButton() { // TODO: Add your control notification handler code here } OnOK();
SzamolDlg.cpp (részlet) void CSzamolDlg::OnSzamolButton() { // TODO: Add your control notification handler code here UpdateData(); m_eredmeny = m_op1 + m_op2; UpdateData(FALSE); } SzamolDlg.cpp (részlet) void CSzamolDlg::OnVegeButton() { // TODO: Add your control notification handler code here OnOK(); }
Massege Map - Deklaráció
Message Map Implementáció
Alkalmazás fordítása
Alkalmazás fordítása
Alkalmazás futtatása