1. feladat Készítsünk programot kisdiákoknak összeadás gyakorlására. Legyenek az operandusok 0-10 véletlen számok. Az = jel utáni szövegdobozban a kisdiáknak kell begépelni a megoldást. Az Értékelés gomb lenyomása után a program ellen rizze a megoldás helyességét. A Következ gomb lenyomásával a program adjon új feladatot. Szabóné Nacsa Rozália nacsa@inf.elte.hu 1
IDC_OP1_EDIT A szürkével jelölt elemekkel az el z el adás anyagában foglalkoztunk. IDC_OP2_EDIT IDC_EREDMENY_EDIT ID: IDC_ERTEKELES_BUTTON Változó: nincs Üzenet: BN_CLICKED Metódus: OnErtekelesButton(); ID:IDC_KOVETKEZO_BUTTON Változó: nincs Üzenet: BN_CLICKED Metódus: OnKovetkezoButton(); ID: IDC_UZENET Változó: m_uzenet Üzenet: nincs Metódus: nincs Vezérl k változók - üzenetek Fejlesszük/módosítsuk tovább az el z óra Szamol alkalmazását. 2
Számol gomb törlése Töröljük le a Számol gombot a dialógusablakról Vezérl törlése 1. Eseménykezel törlése az osztályvarázsló nyilvántartásából. 2. Eseménykezel törlése a programból szövegszerkesztéssel. 3. Párbeszédelem törlése a párbeszédpanelr l A fenti lépéseket ebben a sorrendben kell végrehajtani!!! 3
1. Eseménykezel törlése a nyilvántartásból 1 2 3 5 4 6 Nincs aktív eseménykezel 4
Az osztályban már nem szerepel az OnSzamolButton(); A programkódból nekünk kell törölni a metódust!!! szövegszerkesztés 2. Eseménykezel törlése a programból szövegszerkesztéssel Csak a nyilvántartásból kivett kódrészeket töröljük. 5
3. Párbeszédelem törlése a párbeszédpanelr l DELETE Az operandusok legyenek véletlenszámok CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; m_eredmeny=0; Részlet! 6
Tegyük fel az Értékelés gombot! Tegyük fel az üzenetet tartalmazó Text box-ot! 7
Tegyük fel a Következ gombot. Rendeljünk változót az üzenethez! 1 2 3 5 4 6 7 8 8
1 2 3 6 4 5 OnErtekelesButton(); Osztályvarázslóval (!) készítsük el az Értékelés gomb üres eseménykezel jét. void CSzamolDlg::OnErtekelesButton() // TODO: Add your control notification handler code here Töltsük ki az OnErtekelesButton() üres metódusát. SzamolDlg.cpp UpdateData(); //Feltöltés a vezérl kb l. if(m_eredmeny = = m_op1 + m_op2) m_uzenet = "Helyes"; else m_uzenet = "Hibás!"; UpdateData(FALSE); //Kiírás a vezérl kbe Ne feledkezzünk meg a vezérl és a változók közötti ADATCSERÉR L!! 9
1 2 3 6 4 5 OnKovetkezoButton(); Az osztályvarázslóval készítsük el a Következ gomb üres eseménykezel jét. Töltsük ki az OnKovetkezoButton() üres metódusát. SzamolDlg.cpp void CSzamolDlg::OnKovetkezoButton() // TODO: Add your control notification handler code here m_uzenet = ; m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; m_eredmeny=0; UpdateData(FALSE); Ne feledkezzünk meg a vezérl és a változók közötti ADATCSERÉR L!! 10
Fordítás - Futtatás! 2. feladat - folytatás Készítsük listát a megoldott számolásokról. A listában jelöljük meg a helyes/hibás megoldásokat. 11
Szedjük le az üzenet komponenst és tegyünk fel egy list box vezérl elemet. IDC_LISTBOX Ne legyen rendezett a lista 1 2 3 5 4 6 7 8! Rendeljünk változót a listához 12
Metódus megkeresése az MSDN-ben Keressünk a CListBox osztályban egy olyan metódust, amely használható a lista b vítésére! 13
Az Értékelés gomb lenyomásakor b vítsük a listát. ID: IDC_LISTBOX Változó: CListBox m_listbox Üzenet: nincs Metódus: nincs ListBox b vítése: CListBox m_listbox; m_listbox.addstring(. ); SzamolDlg.cpp String el készítése void CSzamolDlg::OnErtekelesButton() // TODO: Add your control notification handler code here UpdateData(); //m_eredmeny feltöltése a vezérl b l. CString st; st.format("%d + %d = %d",m_op1,m_op2,m_eredmeny); if(m_eredmeny == m_op1 + m_op2) st = st + " Helyes"; else st = st + " Hibás"; m_listbox.addstring(st); //String hozzácsatolása a listához UpdateData(FALSE); //Kiírás a vezérl be String hozzácsatolása 14
Fordítás - Futtatás! 3. Feladat Történjen meg az értékelés a Következ gomb lenyomásakor Vonjuk össze a két gomb feladatát. 15
1 4 2 3 5 6 Szedjük ki az Értékelés gomb üzenetkezel jét az osztályvarázsló nyilvántartásából. void CSzamolDlg::OnErtekelesButton() // TODO: Add your control notification handler code here UpdateData(); //m_eredmeny feltöltése a vezérl b l. CString st; st.format("%d + %d = %d",m_op1,m_op2,m_eredmeny); if(m_eredmeny == m_op1 + m_op2) st = st + " Helyes"; else st = st + " Hibás"; m_listbox.addstring(st); //String hozzácsatolása a listához UpdateData(FALSE); //Kiírás a vezérl be void CSzamolDlg::OnKovetkezoButton() // TODO: Add your control notification handler code here m_uzenet = ; m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; m_eredmeny=0; UpdateData(FALSE); Az Értékelés kódját átmásoljuk az OnKovetkezoButton() metódusba,majd töröljük az OnErtekelesButton() metódust. 16
Végül töröljük az Értékelés gombot. Fordítás - Futtatás! 17
4. feladat - folytatás Ne lehessen átírni az operandusokat. Ne lehessen az operandusokat megváltoztatni. 18
Ne lehessen az Op1vezérl t megváltoztatni. Object ID: IDC_OP1_EDIT Message: EN_CHANGE Metódus: OnChangeOp1Edit() IDC_OP1_EDIT Készítsük el az IDC_OP1_EDIT vezérl EN_CHANGE üzenetét kezel üres metódusát. 1 2 3 5 4 19
Módosítsuk az üzenetkezel metódust a feladat szerint. Object ID: IDC_OP1_EDIT Message: EN_CHANGE Metódus: OnChangeOp1Edit() SzamolDlg.cpp void CSzamolDlg::OnChangeOp1Edit() // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here UpdateData(FALSE); // Visszairja a változó értékét a vezérl be Saját metódus bevezetése CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; m_eredmeny=0; void CSzamolDlg::OnKovetkezoButton() m_uzenet = ; CreateNextTask(); m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; m_eredmeny=0; UpdateData(FALSE); 20
ClassWizardBar Kézzel beírjuk a szükséges kódot. m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; m_eredmeny=0; 21
Fordítás - Futtatás! 5. feladat - folytatás Tegyük lehet vé mind a négy alapm velet gyakorlását. + - * : 22
Választás Tegyünk fel egy Radio gombot 23
Properties Csoport formázása, igazítása Tegyük fel mind a négy m veletet és formázgassuk meg. 24
Layout menü Foglaljuk csoportba a m veleteket Ezzel csak bekereteztük a négy elemet. Látványelem 25
Group properties Group Group Csoport els eleme Csoport utolsó eleme utáni elem A properties -ben tudjuk beállítani a Group kapcsolót. Közös változó, közös metódus m_melyikmuvelet OnOsszeadOption(); OnKivonOption(); OnSzorozOption(); OnChangeMuveletOption(); OnOsztOption(); 26
Rendeljünk közös változót a csoporthoz! m_melyikmuvelet 0 1 2 3 összeadás kivonás szorzás osztás Group IDC_OSSZADAS_EDIT m_melyikmuvelet Group m_melyikmuvelet 0 1 2 3 összeadás kivonás szorzás osztás 27
View/Resource Symbols 0 1 2 3 m_melyikmuvelet Name IDC_OSSZEAD_BUTTON IDC_KIVON_BUTTON IDC_SZOROZ_BUTTON IDC_OSZT_BUTTON Value 1011 1012 1013 1014 (group) Ha több vezérl t együttesen szeretnénk kezelni, akkor az azonosítójuknak szorosan növekv sorrendben kell lennie. Adjuk meg a változó attribútumát! 1 2 3 5 4 Figyeljük meg, hogy a csoport els eleméhez rendeltük a változót! 6 28
Rendeljünk változót a m veletjelhez! IDC_STATIC_MUVELET Vezérl CString m_muveletjel; Változó SzamolDlg.h Az m_muvelet[4] vektor class CSzamolDlg : public CDialog // Construction public: CString m_muvelet[4]; SzamolDlg.cpp CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) CreateNextTask(); m_muvelet[0]="+"; m_muvelet[1]="-"; m_muvelet[2]="*"; m_muvelet[3]=":"; Ezt nekünk kell begépelni. m_hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 29
Kezd értékek módosítása: m_melyikmuvelet, m_muveletjel CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) //AFX_DATA_INIT(CSzamolDlg) m_melyikmuvelet = -1; m_muveletjel = _T(""); //AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 CreateNextTask(); Nincs semmi kiválasztva m_melyikmuvelet = 0; m_muveletjel = + ; m_hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); CreateNextTask() módosítása void CSzamolDlg::CreateNextTask() m_op1 = rand()*10/rand_max; m_op2 = rand()*10/rand_max; switch(m_melyikmuvelet) case 1: // kivonás m_op1 = m_op1 + m_op2; break; case 3: // Osztás while(m_op1==0) m_op1 = rand()*10/rand_max; while(m_op2==0) m_op2 = rand()*10/rand_max; m_op1 = m_op1*m_op2; break; m_eredmeny = 0; 30
Több esemény együttes kezelése void CSzamolDlg::OnOsszeadOption() UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); void CSzamolDlg::OnKivonOption() UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); void CSzamolDlg::OnSzorozOption() UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); void CSzamolDlg::OnOsztOption() UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); afx_msg void CSzamolDlg::OnChangeMuveletOption() UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); Az eseménykezel k lel helyei // Generated message map functions //AFX_MSG(CSzamolDlg) afx_msg void OnVegeButton(); afx_msg void OnKovetkezoButton(); afx_msg void OnChangeOp2Edit(); afx_msg void OnChangeOp1Edit(); //AFX_MSG Saját eseménykezel DECLARE_MESSAGE_MAP() k helye SzamolDlg.h Itt mondjuk meg, hogy milyen eseménykezel ink vannak. BEGIN_MESSAGE_MAP(CSzamolDlg, CDialog) //AFX_MSG_MAP(CSzamolDlg) SzamolDlg.cpp ON_BN_CLICKED(IDC_VEGE_BUTTON, OnVegeButton) ON_BN_CLICKED(IDC_KOVETKEZO_BUTTON, OnKovetkezoButton) ON_EN_CHANGE(IDC_OP2_EDIT, OnChangeOp2Edit) ON_EN_CHANGE(IDC_OP1_EDIT, OnChangeOp1Edit) //AFX_MSG_MAP Saját eseménykezel k helye END_MESSAGE_MAP() Itt kapcsoljuk össze az eseményt és a megfelel eseménykezel t. 31
ON_BN_CLICKED ON_CONTROL_RANGE ON_BN_CLICKED ON_BN_CLICKED ON_BN_CLICKED ON_BN_CLICKED (IDC_OSSZEAD_OPTION, OnOsszeadOption) (IDC_KIVON_OPTION, OnKivonOption) (IDC_SZOROZ_OPTION, OnSzorozOption) (IDC_OSZT_OPTION, OnOsztOption) ON_CONTROL_RANGE ( BN_CLICKED, IDC_OSSZEAD_OPTION, IDC_OSZT_OPTION, OnChangeMuveletOption ) Négy esemény Vezérl : IDC_OSSZEAD_OPTION - tól IDC_OSZT_OPTION - ig Esemény: BN_CLICKED Eseménykezel : OnChangeMuveletOption() Több esemény összefogása - kódolás // Generated message map functions //AFX_MSG(CSzamolDlg) afx_msg void OnChangeOp1Edit(); afx_msg void OnChangeOp2Edit(); //AFX_MSG afx_msg void OnChangeMuveletOption(UINT nid); DECLARE_MESSAGE_MAP() SzamolDlg.h 1 BEGIN_MESSAGE_MAP(CSzamolDlg, CDialog) SzamolDlg.cpp //AFX_MSG_MAP(CSzamolDlg) //AFX_MSG_MAP ON_CONTROL_RANGE(BN_CLICKED, IDC_OSSZEAD_OPTION, IDC_OSZT_OPTION, OnChangeMuveletOption) END_MESSAGE_MAP() 2 afx_msg void OnChangeMuveletOption(UINT nid) UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); SzamolDlg.cpp 3 32
Fordítás - Futtatás! 6. feladat - folytatás A dialógusablak címsora változzon a m veletekkel együtt. M veletváltásnál figyelmeztessen hangjelzés az új m veletre. 33
// Construction public: CString m_muvelet[4]; CString m_cim[4]; CSzamolDlg(CWnd* pparent = NULL); // standard constructor SzamolDlg.h 1 CSzamolDlg::CSzamolDlg(CWnd* pparent /*=NULL*/) : CDialog(CSzamolDlg::IDD, pparent) m_cim[0]="összadás gyakorlása"; m_cim[1]="kivonás gyakorlása"; m_cim[2]="szorzás gyakorlása"; m_cim[3]="osztás gyakorlása"; SzamolDlg.cpp 2 afx_msg void CSzamolDlg::OnChangeMuveletOption(UINT nid) SzamolDlg.cpp UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; 3 CreateNextTask(); UpdateData(FALSE); AfxGetMainWnd()->SetWindowText("Számolási gyakorlatok - " + m_cim[m_melyikmuvelet]); Hang: Winmm.lib könyvtár csatolása 34
Hang effektus meghívása #include "Szamol.h" #include "SzamolDlg.h" #include "mmsystem.h" SzamolDlg.cpp afx_msg void CSzamolDlg::OnChangeMuveletOption(UINT nid) SzamolDlg.cpp UpdateData(); m_muveletjel = m_muvelet[m_melyikmuvelet]; CreateNextTask(); UpdateData(FALSE); AfxGetMainWnd()->SetWindowText("Számolási gyakorlatok - " + m_cim[m_melyikmuvelet]); sndplaysound("ding.wav",snd_async); 35
7. feladat - folytatás Készítsünk számjegy gombokat az eredmény bevitelére. Itt is legyen egy Következ gomb. 36
0 számjegy Properties Tegyük fel az összes számjegygombot és a kis Köv gombot. Control ID IDC_DIGIT_0 Group igen Style Push like Member int m_melyikdigit; IDC_DIGIT_1 nem Push like nincs IDC_DIGIT_9 nem Push like nincs 37
Kov gomb Properties ID: IDC_KOV_BUTTON Esemény: BN_CLICKED Változó: nincs Eseménykezel : OnKovetkezoButton(); Esemény dupla gombbal - kódolás // Generated message map functions //AFX_MSG(CSzamolDlg) afx_msg void OnVegeButton(); afx_msg void OnKovetkezoButton(); afx_msg void OnChangeOp1Edit(); afx_msg void OnChangeOp2Edit(); //AFX_MSG afx_msg void OnChangeMuveletOption(UINT nid); DECLARE_MESSAGE_MAP() SzamolDlg.h Már létezik az az eseménykezel, amit a Köv gombhoz fogunk rendelni. BEGIN_MESSAGE_MAP(CSzamolDlg, CDialog) //AFX_MSG_MAP(CSzamolDlg) SzamolDlg.cpp ON_BN_CLICKED(IDC_VEGE_BUTTON, OnVegeButton) ON_BN_CLICKED(IDC_KOVETKEZO_BUTTON, OnKovetkezoButton) //AFX_MSG_MAP ON_CONTROL_RANGE(BN_CLICKED, IDC_OSSZEAD_OPTION, IDC_OSZT_OPTION, OnChangeMuveletOption) Csak az összerendelést kell megadni. ON_BN_CLICKED(IDC_KOV_BUTTON, OnKovetkezoButton) END_MESSAGE_MAP() 38
Ellen rizzük, hogy a számjegyek ID-je szorosan növekv sorrendben van-e. View/Resource Symbols... A számjegyeket CSOPORTOSAN szeretnénk kezelni. Ha szükséges, módosítsuk. Számjegygombok együttes kezelése Properties: Group ID: IDC_DIGIT_0 (Group) Esemény: BN_CLICKED Változó: m_melyikdigit Eseménykezel : OnDigitClicked(); Nem generált metódus Properties: Group 39
Számjegy gombok összefogása - kódolás // Generated message map functions //AFX_MSG(CSzamolDlg) afx_msg void OnChangeOp2Edit(); //AFX_MSG afx_msg void OnChangeMuveletOption(UINT nid); afx_msg void OnDigitClicked(UINT nid); DECLARE_MESSAGE_MAP() 1 SzamolDlg.h BEGIN_MESSAGE_MAP(CSzamolDlg, CDialog) //AFX_MSG_MAP(CSzamolDlg) //AFX_MSG_MAP ON_CONTROL_RANGE(BN_CLICKED, IDC_OSSZEAD_OPTION, IDC_OSZT_OPTION, OnChangeMuveletOption) ON_BN_CLICKED(IDC_KOV_BUTTON, OnKovetkezoButton) ON_CONTROL_RANGE(BN_CLICKED, IDC_DIGIT_0, IDC_DIGIT_9, OnDigitClicked) END_MESSAGE_MAP() afx_msg void CSzamolDlg::OnDigitClicked(UINT nid) UpdateData(); // Beolvas a vezérl kb l if (m_melyikdigit!= -1) m_eredmeny = m_eredmeny * 10 + m_melyikdigit; m_melyikdigit = -1; UpdateData(FALSE); 2 SzamolDlg.cpp SzamolDlg.cpp 3 40