MFC tehtäviä syventävät vastaus5

Mureakuha

Loikkaa: valikkoon, hakuun

Tehtävä:

Kirjoita ohjelma, jossa käyttöliittymä on viimeistelty. Lomakkeen kentrollien välillä pystyy liikkumaan tabulaattorilla, painonappeja pystyy käyttämää ALT + alleviivattu_kirjain yhdistelmällä, vierityspalkkeja pystyy liikuttamaan nuolinäppäimillä sekä Page Up, Page Down, Home ja End näppäimillä, ohjelman pystyy aktivoimaan (kun se on kerran käynnistetty) näppäinyhdistelmällä CTRL + F12 mistä tahansa kohtaa järjestelmästä sekä lomakkeen minimikoko on asetettu 400 * 200 pikseliin (lomaketta ei saa pienemmäksi). Itse ohjelma piirtää lomakkeelle ympyrän jonka väri pystytään vaihtamaan vierityspalkeilla tai painonapeilla. Käytä RGB (red, green, blue) väriyhdistelmää.

CPP

//***********************************************************************
//
//  ui.cpp
//
//***********************************************************************
 
#include <afxwin.h>
#include <afxcmn.h>
#include "ui.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_GETMINMAXINFO () // lomakkeen koon esto
    ON_WM_SIZE () // lomakkeen koon muutos
    ON_WM_VSCROLL () // vierityspalkkia muutettu
  ON_WM_PAINT ()
    ON_BN_CLICKED (1, OnButtonRedClicked) // Punainen -nappia painetaan
    ON_BN_CLICKED (2, OnButtonGreenClicked) // Vihreä -nappia painetaan
    ON_BN_CLICKED (3, OnButtonBlueClicked) // Sininen -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
        "UI", // lomakkeen otsikko
        WS_OVERLAPPEDWINDOW, // | 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"); // 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_ctlVScrollRed.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT, rect, this, (UINT) 1); // luodaan vierityspalkkikontrolli
    m_ctlVScrollRed.SetFont (&m_fontMain, FALSE); // asetetaan vierityspalkkikontrollin fontti
    m_ctlVScrollRed.SetScrollRange (0, 255, TRUE); // asetetaan vierityspalkin vieritysväliksi 0 - 255
   
    m_ctlVScrollGreen.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT, rect, this, (UINT) 2);
    m_ctlVScrollGreen.SetFont (&m_fontMain, FALSE); 
    m_ctlVScrollGreen.SetScrollRange (0, 255, TRUE);
   
    m_ctlVScrollBlue.Create (WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT, rect, this, (UINT) 3);
    m_ctlVScrollBlue.SetFont (&m_fontMain, FALSE); 
    m_ctlVScrollBlue.SetScrollRange (0, 255, TRUE);
   
    m_ctlPushButtonRed.Create ("&Punainen", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON, rect, this, (UINT) 1); // painonappi
    m_ctlPushButtonRed.SetFont (&m_fontMain, FALSE);    
  m_ctlPushButtonRed.SetFocus ();
 
    m_ctlPushButtonGreen.Create ("&Vihreä", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, rect, this, (UINT) 2); // painonappi
    m_ctlPushButtonGreen.SetFont (&m_fontMain, FALSE);
  
    m_ctlPushButtonBlue.Create ("&Sininen", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, rect, this, (UINT) 3); // painonappi
    m_ctlPushButtonBlue.SetFont (&m_fontMain, FALSE);
  
    rect.SetRect(25, 25, 145, 50);
    m_ctlHotkey.Create (WS_CHILD /*| WS_VISIBLE*/, rect, this, 1); // hotkey, näkymätön
    m_ctlHotkey.SetHotKey (VK_F12, HOTKEYF_CONTROL); // asettaa hotkey-yhdistemän CTRL+F12
 
  WORD wKeyAndShift = UINT (m_ctlHotkey.GetHotKey( )); // hakee kotkey-yhdistelmän
  this->SendMessage (WM_SETHOTKEY, wKeyAndShift); // asettaa kotkey-yhdistelmän voimaan
 
  return 0; // kaikki hyvin, 0 palautuu
}
 
void CMainWindow::OnGetMinMaxInfo (MINMAXINFO* pMMI) // lomakkeen koon esto
{
    pMMI->ptMinTrackSize.x = 400; // lomakkeen minimileveys ja...
    pMMI->ptMinTrackSize.y = 200; // ...minimikorkeus
}
 
 
void CMainWindow::OnSize (UINT tyyli, int cx, int cy) // lomakkeen koonmuutostapahtuma
{
    m_ctlGroupBox.MoveWindow    (10,    10,    cx-20,  cy-20,  TRUE); // siirtää kehyskontrollin oikeaan paikkaan
    m_ctlVScrollRed.MoveWindow    (cx-227,  40,    20,    cy-100, TRUE);
    m_ctlVScrollGreen.MoveWindow  (cx-147,  40,    20,    cy-100, TRUE);
    m_ctlVScrollBlue.MoveWindow    (cx-67,    40,    20,    cy-100, TRUE);
    m_ctlPushButtonRed.MoveWindow  (cx-255,  cy-40,  75,    25,    TRUE);
    m_ctlPushButtonGreen.MoveWindow (cx-175,  cy-40,  75,    25,    TRUE);
    m_ctlPushButtonBlue.MoveWindow  (cx-95,    cy-40,  75,    25,    TRUE);
}
 
void CMainWindow::OnPaint () // lomakkeen piirtotapahtuma
{
  CPaintDC dc (this); // luo piirtopintaolion
    CPen pen (PS_SOLID, 16, RGB (m_ctlVScrollRed.GetScrollPos (), m_ctlVScrollGreen.GetScrollPos (), m_ctlVScrollBlue.GetScrollPos ()));
    CPen* pOldPen = dc.SelectObject (&pen);
    dc.SelectStockObject (NULL_BRUSH);
  
    CRect windowrect;
  GetClientRect (windowrect);
  CRect circlerect;
  circlerect.SetRect (windowrect.left+40, windowrect.top+60, windowrect.right-285, windowrect.bottom-60);
  circlerect.DeflateRect (16, 16);
    dc.Ellipse (circlerect);
}
 
void CMainWindow::OnVScroll (UINT code, UINT oldposition, CScrollBar* scrollbar) // vierityspalkkia muutettu
{
    int vpositio = 0; // palkkien tila
 
    switch (code)  // tässä palautuu tapahtumatunnus          
  {
    case SB_ENDSCROLL :
      vpositio = scrollbar->GetScrollPos ();
      break;
    case SB_BOTTOM :
      vpositio = 255;
      break;
        case SB_PAGEDOWN : // palkin kuilua napautettiin
            vpositio = scrollbar->GetScrollPos () + 10; // muutetaan palkin asema uudelleen
      break;
        case SB_LINEDOWN : // palkin vieritysnappia napautettiin
            vpositio = min(255, scrollbar->GetScrollPos () + 1); // positio ei saa liukua ohi 255
            break;                
    case SB_PAGEUP : // palkin kuilua napautettiin
            vpositio = scrollbar->GetScrollPos () - 10; // muutetaan palkin asema uudelleen
      break;
        case SB_LINEUP : // palkin vieritysnappia napautettiin
            vpositio = max(0, scrollbar->GetScrollPos () - 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;
  }
    scrollbar->SetScrollPos (vpositio, TRUE) ; // asetetaan palkin asemaksi paikka johon käyttäjä hissin siirsi
 
    CRect windowrect;
  GetClientRect (windowrect);
  CRect circlerect;
  circlerect.SetRect (windowrect.left+40, windowrect.top+60, windowrect.right-285, windowrect.bottom-60);
 
  InvalidateRect (circlerect, TRUE);
}
 
void CMainWindow::OnButtonRedClicked () // Punainen -nappia painetaan
{
  m_ctlVScrollRed.SetScrollPos (255);
  m_ctlVScrollGreen.SetScrollPos (0);
  m_ctlVScrollBlue.SetScrollPos (0);
 
    CRect windowrect;
  GetClientRect (windowrect);
  CRect circlerect;
  circlerect.SetRect (windowrect.left+40, windowrect.top+60, windowrect.right-285, windowrect.bottom-60);
 
  InvalidateRect (circlerect, TRUE);
}
 
void CMainWindow::OnButtonGreenClicked () // Vihreä -nappia painetaan
{
  m_ctlVScrollRed.SetScrollPos (0);
  m_ctlVScrollGreen.SetScrollPos (255);
  m_ctlVScrollBlue.SetScrollPos (0);
 
    CRect windowrect;
  GetClientRect (windowrect);
  CRect circlerect;
  circlerect.SetRect (windowrect.left+40, windowrect.top+60, windowrect.right-285, windowrect.bottom-60);
 
  InvalidateRect (circlerect, TRUE);
}
 
void CMainWindow::OnButtonBlueClicked () // Sininen -nappia painetaan
{
  m_ctlVScrollRed.SetScrollPos (0);
  m_ctlVScrollGreen.SetScrollPos (0);
  m_ctlVScrollBlue.SetScrollPos (255);
 
    CRect windowrect;
  GetClientRect (windowrect);
  CRect circlerect;
  circlerect.SetRect (windowrect.left+40, windowrect.top+60, windowrect.right-285, windowrect.bottom-60);
 
  InvalidateRect (circlerect, TRUE);
}
 
BOOL CMainWindow::PreTranslateMessage (MSG* pMsg) // sanomien esikäsittely
{
  return ::IsDialogMessage (m_hWnd, pMsg); // DialogMessage syntyy tabulaattorilla ja ALT+'merkki' yhdistelmällä
}

H

//***********************************************************************
//
//  ui.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
        CScrollBar m_ctlVScrollRed; // vierityspalkkikontrolli
        CScrollBar m_ctlVScrollGreen; // vierityspalkkikontrolli
        CScrollBar m_ctlVScrollBlue; // vierityspalkkikontrolli
        CButton m_ctlPushButtonRed; // Punainen -nappi
        CButton m_ctlPushButtonGreen; // Vihreä -nappi
        CButton m_ctlPushButtonBlue; // Sininen -nappi
    CHotKeyCtrl m_ctlHotkey; // hotkey
 
    public: // aliohjelmajäsenten esittely
        CMainWindow (); // ikkunan luontialiohjelma
    virtual BOOL PreTranslateMessage (MSG*); // tabulaattori ja pikanäppäimet
 
    protected: // aliohjelmajäsenten esittely
        afx_msg int OnCreate (); // luomisaliohjelma
      afx_msg void OnGetMinMaxInfo (MINMAXINFO*); // lomakkeen koon esto
        afx_msg void OnPaint (); // ympyrä
        afx_msg void OnVScroll (UINT, UINT, CScrollBar*); // vierityspalkit
        afx_msg void OnSize (UINT, int, int); // koonmuutosaliohjelma
        afx_msg void OnButtonRedClicked (); // Punainen -nappia painetaan 
        afx_msg void OnButtonGreenClicked (); // Vihreä -nappia painetaan 
        afx_msg void OnButtonBlueClicked (); // Sininen -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