MFC tehtäviä perusteet vastaus4

Mureakuha

Loikkaa: valikkoon, hakuun

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.

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
}

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

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

Henkilökohtaiset työkalut