MFC tehtäviä perusteet vastaus4
Mureakuha
Tehtävä:
Kirjoita ohjelma, jossa on kaksi vierityspalkkia. Niiden asemaa pystyy hiirellä muuttamaan naputtelemalla kuilusta, palkin päästä tai siirtämällä hissilaatikkoa. Palkkien vieritysväli on 0 - 10000 ja kummankin palkin sen hetkinen tilanne tulostetaan Static kontrolliin riippuen siitä kumpaa palkkia käyttäjä viimeksi muutti.
[muokkaa]
CPP
//*********************************************************************** // // vierityspalkki.cpp // //*********************************************************************** #include <afxwin.h> #include "vierityspalkki.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) // MESSAGE MAP alkaa ON_WM_CREATE () // lomake luodaan ON_WM_VSCROLL () // vierityspalkkia muutettu ON_WM_HSCROLL () // vierityspalkkia muutettu END_MESSAGE_MAP () // MESSAGE MAP loppuu 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öidään oma ikkunaluokka CreateEx ( NULL, // ikkunan lisätyyli strWndClass, // lomakkeen ikkunaluokka "Vierityspalkki", // ikkunan otsikko WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU, // ikkunan tyyli CW_USEDEFAULT, // x-positio aluksi CW_USEDEFAULT, // y-positio aluksi 500, // leveys aluksi 300, // korkeus aluksi NULL, // emoikkunan kahva NULL, // ikkunan valikon kahva NULL // lisätietoja ); // luodaan ikkuna } int CMainWindow::OnCreate (LPCREATESTRUCT lpcs) // 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 luokkaan tallennetaan kontrollia varten vasen ylänurkka ja oikea alanurkka m_ctlGroupBox.Create ("", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, rect, this, (UINT) -1); // luodaan kehyskontrolli m_ctlGroupBox.SetFont (&m_fontMain, FALSE); // asetetaan kehyskontrollin fontti rect.SetRect (170, 60, 190, 200); // vaihdetaan uudet arvot m_ctlVScroll.Create (WS_CHILD | WS_VISIBLE | SBS_VERT, rect, this, (UINT) 1); // luodaan vierityspalkkikontrolli m_ctlVScroll.SetFont (&m_fontMain, FALSE); // asetetaan vierityspalkkikontrollin fontti m_ctlVScroll.SetScrollRange (0, 10000, TRUE); // asetetaan vierityspalkin vieritysväliksi 0 - 10000 rect.SetRect (210, 120, 350, 140); // vaihdetaan uudet arvot m_ctlHScroll.Create (WS_CHILD | WS_VISIBLE | SBS_HORZ, rect, this, (UINT) 2); // luodaan vierityspalkkikontrolli m_ctlHScroll.SetFont (&m_fontMain, FALSE); // asetetaan vierityspalkkikontrollin fontti m_ctlHScroll.SetScrollRange (0, 10000, TRUE); // asetetaan vierityspalkin vieritysväliksi 0 - 10000 rect.SetRect (20, 240, 470, 255); // vaihdetaan uudet arvot m_ctlStatic.Create ("Static kontrolli", WS_CHILD | WS_VISIBLE | SS_CENTER | SS_SUNKEN, rect, this, (UINT) 3); // luodaan etikettikontrolli m_ctlStatic.SetFont (&m_fontMain, FALSE); // asetetaan vierityspalkkikontrollin fontti return 0; // kaikki hyvin, palautetaan 0 } void CMainWindow::OnVScroll (UINT code, UINT oldposition) // vierityspalkkia muutettu { static int vpositio = 0; // palkkien tila char bufferi[10] = {NULL} ; // tulostettava numero pitää muuttaa tekstiksi switch (code) // tässä palautuu tapahtumatunnus { case SB_PAGEDOWN : // palkin kuilua napautettiin vpositio = vpositio + 24; // muutetaan palkin asema uudelleen case SB_LINEDOWN : // palkin vieritysnappia napautettiin vpositio = min(10000, vpositio + 1); // positio ei saa liukua ohi 10000 break; case SB_PAGEUP : // palkin kuilua napautettiin vpositio = vpositio - 24; // muutetaan palkin asema uudelleen case SB_LINEUP : // palkin vieritysnappia napautettiin vpositio = max(0, vpositio - 1); // positio ei saa liukua ohi 0 break; case SB_THUMBPOSITION : // palkkia siirretään hissistä case SB_THUMBTRACK : // palkkia siirretään hissistä vpositio = oldposition ; // oldposition == uusi asema break; } m_ctlVScroll.SetScrollPos (vpositio, TRUE) ; // asetetaan palkin asemaksi paikka johon käyttäjä hissin siirsi m_ctlStatic.SetWindowText (itoa (vpositio, bufferi, 10)) ; // tulostetaan numero tekstiruutuun } void CMainWindow::OnHScroll (UINT code, UINT oldposition) // vierityspalkkia muutettu { static int hpositio = 0; // palkkien tila char bufferi[10] = {NULL} ; // tulostettava numero pitää muuttaa tekstiksi switch (code) // tässä palautuu tapahtumatunnus { case SB_PAGEDOWN : // palkin kuilua napautettiin hpositio = hpositio + 24; // muutetaan palkin asemaa case SB_LINEDOWN : // palkin vieritysnappia napautettiin hpositio = min(10000, hpositio + 1);// positio ei saa liukua ohi 10000 break; case SB_PAGEUP : // palkin kuilua napautettiin hpositio = hpositio - 24; // muutetaan palkin asemaa case SB_LINEUP : // palkin vieritysnappia napautettiin hpositio = max(0, hpositio - 1); // positio ei saa liukua ohi 0 break; case SB_THUMBPOSITION : // palkkia siirretään hissistä case SB_THUMBTRACK : // palkkia siirretään hissistä hpositio = oldposition ; // oldposition == uusi asema break; } m_ctlHScroll.SetScrollPos (hpositio, TRUE) ; // asetetaan palkin asemaksi paikka johon käyttäjä hissin siirsi m_ctlStatic.SetWindowText (itoa (hpositio, bufferi, 10)) ; // tulostetaan numero tekstiruutuun }
[muokkaa]
H
//*********************************************************************** // // vierityspalkki.h // //*********************************************************************** class CMyApp : public CWinApp { public: // aliohjelmajäsenten esittely virtual BOOL InitInstance (); // ohjelman instanssin initialisaatioaliohjelma }; class CMainWindow : public CWnd { private: // tietojäsenten esittely CFont m_fontMain; // fontti CButton m_ctlGroupBox; // kehyskontrolli CScrollBar m_ctlVScroll; // vierityspalkkikontrolli CScrollBar m_ctlHScroll; // vierityspalkkikontrolli CStatic m_ctlStatic; // etikettikontrolli public: // aliohjelmajäsenten esittely CMainWindow (); // ikkunan luontialiohjelma protected: // aliohjelmajäsenten esittely afx_msg int OnCreate (LPCREATESTRUCT); // luomisaliohjelma afx_msg void OnVScroll(UINT, UINT); // vierityspalkkia muutettu afx_msg void OnHScroll(UINT, UINT); // vierityspalkkia muutettu 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
