MFC tehtäviä syventävät vastaus2

Mureakuha

Loikkaa: valikkoon, hakuun

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.

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

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

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

Henkilökohtaiset työkalut