MFC tehtäviä syventävät vastaus1

Mureakuha

Loikkaa: valikkoon, hakuun

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.

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
}

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ä.

Alkuperäinen (c) Petteri Hämäläinen

Henkilökohtaiset työkalut