MFC tehtäviä syventävät vastaus2
Mureakuha
Tehtävä:
Kirjoita ohjelma, jossa on editbox ja listbox. Edittiin kirjoitettu teksti voidaan lisätä listboxiin 'Lisää listaan'-napilla. Listasta voidaan poistaa rivi tuplanapauttamalla tai 'Poista rivi'-napilla. Listan voi tyhjentää 'Tyhjennä lista'-napilla. Tilarivillä seurataan kokoajan tapahtumia siten, että kun käyttäjä tekee jotain sinne tulee ilmoitus tapauksesta kuten 'lisäsit rivin listaan', 'tyhjensit listan' jne. Oikeanpuoleisessa pikkulokerossa seurataan listboxin rivien lukumäärää. Ohjelman täytyy pystyä myös muuttamaan kontrollien kokoa kun lomakkeen kokoa muutetaan. Huomaa myös oikea fontti.
[muokkaa]
CPP
//*********************************************************************** // // rivit.cpp // //*********************************************************************** #include <afxwin.h> #include <afxcmn.h> // yleisten kontrollien otsikkotiedoston lisäys #include "rivit.h" CMyApp myApp; ///////////////////////////////////////////////////////////////////////// // CMyApp luokan aliohjelmien toteutus BOOL CMyApp::InitInstance () { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow (); return TRUE; } ///////////////////////////////////////////////////////////////////////// // CMainWindow luokan aliohjelmien toteutus BEGIN_MESSAGE_MAP (CMainWindow, CWnd) ON_WM_CREATE () // lomakkeen luominen ON_WM_SIZE () // lomakkeen koon muutos ON_BN_CLICKED (3, OnButton1Clicked) // 'Lisää listaan'-nappia painetaan ON_BN_CLICKED (4, OnButton2Clicked) // 'Poista rivi'-nappia painetaan ON_BN_CLICKED (5, OnButton3Clicked) // 'Tyhjennä lista'-nappia painetaan END_MESSAGE_MAP () CMainWindow::CMainWindow () { CString strWndClass = AfxRegisterWndClass ( NULL, // ikkunan tyyli myApp.LoadStandardCursor (IDC_ARROW), // ikkunan kursori (HBRUSH) COLOR_WINDOW, // ikkunan taustan väri myApp.LoadStandardIcon (IDI_APPLICATION) // ikkunan ikoni ); // rekisteröi oman ikkunaluokan CreateEx ( NULL, // lomakkeen lisätyyli strWndClass, // lomakkeen ikkunaluokka "Rivien lisäys", // lomakkeen otsikko WS_OVERLAPPEDWINDOW, // ikkunan tyyli CW_USEDEFAULT, // aloitus x-positio CW_USEDEFAULT, // aloitus y-positio 500, // alkuleveys 300, // alkukorkeus NULL, // emoikkunan kahva NULL, // lomakkeen valikon kahva NULL // lisätietoja ); // lomakkeen luominen } int CMainWindow::OnCreate () // lomakkeen luomistapahtuma { m_fontMain.CreateFont (10, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif"); // fontin luominen CRect rect (10, 10, 482, 266); // CRect-luokan olio tallentaa suorakaiteen vasemman ylänurkan ja oikean alanurkan m_ctlGroupBox.Create ("", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, rect, this, 0); // luo kehyskontrollin m_ctlGroupBox.SetFont (&m_fontMain, FALSE); // asettaa kehyskontrollin fontin m_ctlEdit.CreateEx (WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 0, 0, 0, 0, m_hWnd, (HMENU) 1); // muokkausruutu m_ctlEdit.SetFont (&m_fontMain, FALSE); m_ctlList.CreateEx (WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, 0, 0, 0, 0, m_hWnd, (HMENU) 2); // luetteloruutu m_ctlList.SetFont (&m_fontMain, FALSE); m_ctlList.AddString ("Antti"); // lisää rivin m_ctlList.AddString ("Kaija"); m_ctlList.AddString ("Mikko"); m_ctlList.AddString ("Pekka"); m_ctlList.AddString ("Liisa"); m_ctlList.AddString ("Jussi"); m_ctlList.AddString ("Tiina"); m_ctlList.AddString ("Susanna"); m_ctlButton1.Create ("Lisää listaan", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, (UINT) 3); // painonappi m_ctlButton1.SetFont (&m_fontMain, FALSE); m_ctlButton2.Create ("Poista rivi", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, (UINT) 4); // painonappi m_ctlButton2.SetFont (&m_fontMain, FALSE); m_ctlButton3.Create ("Tyhjennä lista", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, (UINT) 5); // painonappi m_ctlButton3.SetFont (&m_fontMain, FALSE); m_wndStatusBar.Create (WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, rect, this, 6); // luodaan tilarivikontrolli int osat[2] = { 0, 0 }; // muutetaan tilarivien osien kokoja m_wndStatusBar.SetParts (2, osat); // asetaan ne voimaan m_wndStatusBar.SetText ("Aloita...", 0, 0); // tulostetaan teksti ensimmäiseen osaan tilarivillä m_wndStatusBar.SetText ("8", 1, 0); // tulostetaan teksti toiseen osaan tilarivillä m_rivit = 8; // rivejä on aluksi 8 return 0; // kaikki hyvin, 0 palautuu } void CMainWindow::OnSize (UINT tyyli, int cx, int cy) // lomakkeen koonmuutostapahtuma { int osat[2] = { cx-100, cx }; // muutetaan tilarivien osien kokoja m_wndStatusBar.SetParts (2, osat); // asetaan ne voimaan m_ctlGroupBox.MoveWindow (10, 10, cx-20, cy-40, TRUE); // siirtää kontrollit oikeaan paikkaan m_ctlEdit.MoveWindow (50, 50, cx-250, 19, TRUE); m_ctlList.MoveWindow (50, 100, cx-250, cy-150, TRUE); m_ctlButton1.MoveWindow (cx-180, 50, 130, 30, TRUE); m_ctlButton2.MoveWindow (cx-180, 100, 130, 30, TRUE); m_ctlButton3.MoveWindow (cx-180, 140, 130, 30, TRUE); m_wndStatusBar.MoveWindow (NULL, NULL, NULL, NULL, TRUE); } void CMainWindow::OnButton1Clicked () // 'Lisää listaan'-nappia painetaan { CString bufferi; m_ctlEdit.GetWindowText (bufferi); // hakee tekstin editistä if (strcmp (bufferi, "") == TRUE) // lukiko editissä jotain? { char cBufferi[10]; m_ctlList.AddString (bufferi); // lisää rivin ListBoxiin m_wndStatusBar.SetText ("Lisäsit juuri rivin...", 0, 0); // tulostaa tekstin ensimmäiseen osaan tilarivillä itoa (m_ctlList.GetCount(), cBufferi, 10); // muuntaa int->char m_wndStatusBar.SetText (cBufferi, 1, 0); // tulostaa tekstin toiseen osaan tilarivillä } else // jos editissä ei lukenut mitään m_wndStatusBar.SetText ("Rivin lisäys ei onnistunut...", 0, 0); } void CMainWindow::OnButton2Clicked () // 'Poista rivi'-nappia painetaan { int index = m_ctlList.GetCurSel (); // kysyy valitun rivin listboxista if (index != LB_ERR) // jos ListBoxista ei ollut valittuna mitään { char cBufferi[10]; m_rivit = m_ctlList.DeleteString (index); // poistaa rivin ListBoxista m_wndStatusBar.SetText ("Poistit rivin painamalla nappia...", 0, 0); itoa (m_rivit, cBufferi, 10); m_wndStatusBar.SetText (cBufferi, 1, 0); // tulostaa tekstin toiseen osaan tilarivillä } else m_wndStatusBar.SetText ("Rivin poisto ei onnistunut...", 0, 0); } void CMainWindow::OnButton3Clicked () // 'Tyhjennä lista'-nappia painetaan { char cBufferi[10]; m_ctlList.ResetContent () ; // tyhjentää listboxin m_wndStatusBar.SetText ("Tyhjensit juuri listan...", 0, 0); m_rivit = 0; itoa (m_rivit, cBufferi, 10); // tietotyypin muunnos m_wndStatusBar.SetText (cBufferi, 1, 0); // tulostaa tekstin toiseen osaan tilarivillä }
[muokkaa]
H
//*********************************************************************** // // pohjaex.h // //*********************************************************************** class CMyApp : public CWinApp // CMyApp periytetään MFC:n ohjelma-yliluokasta { public: // aliohjelmajäsenten esittely virtual BOOL InitInstance (); // ohjelman instanssin initialisaatio }; class CMainWindow : public CWnd // CMainWindow periytetään MFC:n ikkuna-yliluokasta { private: // tietojäsenten esittely CFont m_fontMain; // fontti CButton m_ctlGroupBox; // kehyskontrolli CEdit m_ctlEdit; // muokkausruutu CListBox m_ctlList; // luetteloruutu CButton m_ctlButton1; // painonappi CButton m_ctlButton2; // painonappi CButton m_ctlButton3; // painonappi CStatusBarCtrl m_wndStatusBar; // tilarivi int m_rivit; // listboxin rivien lkm CString m_Bufferi; // apubufferi public: // aliohjelmajäsenten esittely CMainWindow (); // ikkunan luontialiohjelma protected: // aliohjelmajäsenten esittely afx_msg int OnCreate (); // luomisaliohjelma afx_msg void OnSize (UINT, int, int); // koonmuutosaliohjelma afx_msg void OnButton1Clicked (); // 'Lisää listaan'-nappia painetaan afx_msg void OnButton2Clicked (); // 'Poista rivi'-nappia painetaan afx_msg void OnButton3Clicked (); // 'Tyhjennä lista'-nappia painetaan DECLARE_MESSAGE_MAP () // MESSAGE MAP:n esittely };
Tämän dokumentin kopiointi, levittäminen sekä muokkaaminen on sallittua GNU Free Documentation Licensen version 1.2 tai uudemman Free Software Foundationin julkaiseman version mukaisesti, ilman muuttumattomuuslauseketta tai kansitekstejä. Tätä koskee vastuuvapaus.
Kopio lisenssistä (englanniksi) löytyy täältä.
Kopio lisenssistä (englanniksi) löytyy täältä.
Alkuperäinen (c) Petteri Hämäläinen
