MFC tehtäviä syventävät vastaus5
Mureakuha
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ää.
[muokkaa]
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ä }
[muokkaa]
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ä.
Kopio lisenssistä (englanniksi) löytyy täältä.
Alkuperäinen (c) Petteri Hämäläinen
