MFC tehtäviä syventävät vastaus1
Mureakuha
Tehtävä:
Kirjoita ohjelma, jossa käyttäjä voi valita lottonumerot. Ohjelmassa on CListBox-luokan luetteloruutu, kymmenen tekstiruutua numeroille taulukkona (CStatic m_ctlStatic[i]) ja kaksi kuvassa olevalle tekstille ja nappi. Luetteloruudusta voi tuplanaputtamalla valita oikeat numerot ja ne tulevat oikeassa järjestyksessä, alusta alkaen omiin lokeroihinsa. 'Reset'-nappi käynnistää ohjelman uudestaan. Se siis kirjoittaa luetteloruutuun numerot uudelleen ja tyhjentää numerolaatikot.
[muokkaa]
CPP
//*********************************************************************** // // lotto.cpp // //*********************************************************************** #include <afxwin.h> #include "lotto.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_LBN_DBLCLK (1, OnListboxDoubleClicked) // listboxin tuplanapautus ON_BN_CLICKED (2, OnButtonClicked) // 'Reset'-nappia painettu 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 "Lottonumerot", // lomakkeen otsikko WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, // 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"); CRect rect (10, 10, 482, 266); m_ctlGroupBox.Create ("", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, rect, this, 0); // kehyskontrolli m_ctlGroupBox.SetFont (&m_fontMain, FALSE); // asettaa kehyskontrollin fontin m_ctlList.CreateEx (WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_MULTICOLUMN | LBS_NOTIFY, 40, 50, 413, 130, m_hWnd, (HMENU) 1); // luetteloruutu m_ctlList.SetFont (&m_fontMain, FALSE); m_ctlList.SetColumnWidth (80); for (int i=1 ; i <= 39 ; i ++) // laskee lottonumerot luetteloruutuun { char merkki[2] ; itoa (i, merkki, 10) ; // tietotyypin muunnos m_ctlList.AddString (merkki) ; // lisää rivin } rect.SetRect (40, 191, 90, 207); m_ctlStaticNumerot.Create ("Numerot:", WS_CHILD | WS_VISIBLE, rect, this, (UINT) 0); // luodaan valintanappikontrolli m_ctlStaticNumerot.SetFont (&m_fontMain, FALSE); // asetetaan valintanappikontrollin fontti rect.SetRect (40, 223, 110, 239); m_ctlStaticLisanumerot.Create ("Lisänumerot:", WS_CHILD | WS_VISIBLE, rect, this, (UINT) 0); // luodaan valintanappikontrolli m_ctlStaticLisanumerot.SetFont (&m_fontMain, FALSE); // asetetaan valintanappikontrollin fontti for (i=0 ; i <= 6 ; i ++) // 7 lottonumeroa { rect.SetRect (130+40*i, 191, 160+40*i, 209); m_ctlStatic[i].Create ("", WS_CHILD | WS_VISIBLE | SS_CENTER | SS_SUNKEN, rect, this, (UINT) 0); // luodaan valintanappikontrolli } for (i=7 ; i <= 9 ; i ++) // 3 lisänumeroa { rect.SetRect (130+40*(i-7), 223, 160+40*(i-7), 241); m_ctlStatic[i].Create ("", WS_CHILD | WS_VISIBLE | SS_CENTER | SS_SUNKEN, rect, this, (UINT) 0); // luodaan valintanappikontrolli } rect.SetRect (360, 220, 460, 248); m_ctlButton.Create ("Reset", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, (UINT) 2); // painonappi m_ctlButton.SetFont (&m_fontMain, FALSE); m_iValittuNumero=0; // yhtään numeroa ei ole valittu return 0; // kaikki hyvin, 0 palautuu } void CMainWindow::OnListboxDoubleClicked () // Listboxia tuplanapautettu { CString numero; m_ctlList.GetText (m_ctlList.GetCurSel (), numero); // hakee valitun tekstin m_ctlStatic[m_iValittuNumero].SetWindowText (numero) ; // kirjoittaa tekstin m_ctlList.DeleteString (m_ctlList.GetCurSel ()) ; // poistaa rivin m_iValittuNumero++ ; // lisää valittua numeroa if (m_iValittuNumero == 10) m_ctlList.EnableWindow (FALSE) ; // kun kaikki numerot on valittu, poistuu lista käytöstä } void CMainWindow::OnButtonClicked () // 'Reset'-nappia painettu { for (int i=0; i<=9; i++) // kirjoittaa tyhjää m_ctlStatic[i].SetWindowText (NULL); m_ctlList.EnableWindow (TRUE); // avaa luetteloruudun... m_ctlList.ResetContent () ; // ...tyhjentää sen... for (i=1; i<=39; i++) // ...ja täyttää uudestaan { char merkki[2] ; itoa (i, merkki, 10) ; // tietotyypin muunnos m_ctlList.AddString (merkki) ; // lisää rivin } m_iValittuNumero=0; // yhtään numeroa ei ole valittu }
[muokkaa]
H
//*********************************************************************** // // lotto.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 CButton m_ctlButton; // painonappi CListBox m_ctlList; // luetteloruutu CStatic m_ctlStaticNumerot; // 'Numerot'-etiketti CStatic m_ctlStaticLisanumerot; // 'Lisänumerot'-etiketti CStatic m_ctlStatic[10]; // etikettikontrollitaulukko (7+3 numeroa) int m_iValittuNumero; // valitut lottonumerot 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 OnButtonClicked (); // 'Reset'-nappia painettu afx_msg void OnListboxDoubleClicked (); // Listboxia tuplanapautettu DECLARE_MESSAGE_MAP () };
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
