1 / 41

MFC

MFC. MFC - Microsoft Foundation Class library Windows aplikacija u pravilu funkcionira tako da čeka i odgovara na poruke. WinMain funkcija kreira prozor i ulazi u petlju poruka. Petlja se prekida kad se primi poruka WM_QUIT (to se npr . dogodi kad se pritisne Exit u File izborniku).

kata
Download Presentation

MFC

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MFC MFC - Microsoft FoundationClasslibrary Windows aplikacija u pravilu funkcionira tako da čeka i odgovara na poruke. WinMain funkcija kreira prozor i ulazi u petlju poruka. Petlja se prekida kad se primi poruka WM_QUIT (to se npr. dogodi kad se pritisne Exit u File izborniku). Na kraju petlje dolazi do izlaska iz WinMain funkcije i aplikacija se završava.

  2. MFC Pod terminom message handler podrazumijevamo kod koji obrađuje poruku. Poruke koje aplikacija nije obradila prosljeđuju se funkciji DefWindowProc koja sadrži defaultne odgovore na poruke. Windows definira mnoštvo poruka kojima ime većinom počinje s WM_. Primjeri: WM_CREATE : kreiran je prozor WM_MOUSEMOVE : pokazivač miša se pomiče WM_SIZE: prozor mijenja veličinu WM_PAINT : prozor se treba ponovno iscrtati

  3. MFC hijerarhija (izbor klasa) CPoint CRect CObject CDC CCmdTarget CWinThread CMap CList CWinApp CWnd CFrameWnd CDialog CView CButton CStatic

  4. Hello.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance (); }; class CMainWindow : public CFrameWnd { public: CMainWindow(); protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP(); };

  5. Hello.cpp #include <afxwin.h> #include "Hello.h" CMyApp myApp; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; }

  6. Hello.cpp BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() CMainWindow::CMainWindow() { Create (NULL, _T("The first MFC application")); } void CMainWindow::OnPaint() { CPaintDC dc(this); CRect rect; GetClientRect (&rect); dc.DrawText (_T("Hello world (using MFC)!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  7. Pokretanje aplikacije

  8. CFrameWnd CMainWindow::CMainWindow() { CString strWndClass=AfxRegisterWndClass( 0, //ili neki Class Style (CS_ime) AfxGetApp()->LoadStandardCursor (IDC_CROSS), (HBRUSH)(COLOR_WINDOW +2), AfxGetApp()->LoadStandardIcon(IDI_ERROR)); Create (strWndClass, _T("Drugi tip prozora"));} }

  9. CFrameWnd

  10. CWnd • U MFC biblioteci izvedene su mnoge klase iz klase CWndda bi se postigli specifični tipovi prozora. • Primjeri: CFrameWnd, CMDIFrameWnd, CMDIChildWnd, CView, CDialog (također se i iz njih često izvode nove klase) • Iz CWnd se izvode i kontrole, poput CButton.

  11. Kontrole Kontrola se kreira instanciranjem odgovarajuće MFC klase. Na dobivenom objektu se zatim poziva metoda Create.

  12. CButton class CButton : public CWnd Kontrola Cbutton se kreira pomoću virtualne funkcije Create. virtual BOOL CButton::Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT & rect, CWnd * pParent, UINT nID); Pomoću klase CButton možemo zapravo kreirati kontrole s različitim funkcionalnostima, a to su PushButton, CheckBox, RadioButton i GroupBox. Konkretno, metodi Create treba proslijediti drugi argument koji određuje stil gumba. Mogući izbori su (grupirani po funkcionalnostima):

  13. Button stilovi • BS_PUSHBUTTON, BS_DEFPUSHBUTTON • BS_CHECHBOX, BS_AUTOCHECKBOX, BS_3STATE, BS_AUTO3STATE • BS_RADIOBUTTON, BS_AUTORADIOBUTTON • BS_GROUPBOX Dodatni stilovi: • BS_LEFT, BS_RIGHT, BS_TOP, BS_BOTTOM • BS_CENTER, BS_VCENTER • BS_COMMANDLINK, BS_DEFCOMMANDLINK • BS_FLAT, BS_ICON, BS_TEXT ………

  14. CButton • lpszCaption – tekst gumba. • dwStyle - stil gumba (dozvoljava kombinacije). • rect –veličina i položaj kontrole (zadan pomoću CRect objekta ili RECT structure). • pParentWnd – prozor koji je roditelj kontrole gumb (npr. objekt tipa CDialog). Ne smije biti NULL. • nID – ID kontrole. Windows stilovi: • WS_CHILD    • WS_VISIBLE    • WS_DISABLED   • WS_GROUP    • WS_TABSTOP  

  15. CButton Kreiranje gumba ide u dva koraka: prvo se konstruira objekt tipa CButton te se na njemu zove metoda Create. Primjeri: CButton Button1, Button2; Button1.Create(_T(“PushButton"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), pParentWnd, 1); Button2.Create(_T(“RadioButton"), WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, CRect(10,40,100,70), pParentWnd, 2);

  16. CBitmapButton classCBitmapButton : publicCButton CBitmapButtonobjekt sadrži do četiri bitmap-a, koji predstavljaju slike za četiri različita stanja: up, down, focused, disabled Prva slika je obavezna, ostale su opcionalne.

  17. CButton BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ….. ON_BN_CLICKED(IDC_BUTTON1, OnButtonClicked) END_MESSAGE_MAP() CMainWindow::CMainWindow( ){ …. button1.Create(_T("Gumb"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_FLAT, rect, this, IDC_BUTTON1); } void CMainWindow::OnButtonClicked( ){ MessageBox(_T("Pritisnuli ste gumb!"), _T("Poruka") ); }

  18. CButton

  19. MessageBox int MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = 0, UINT nType=MB_OK) Moguće vrijednosti za nType: MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_YESNO, MB_YESNOCANCEL, MB_ABORTRETRYIGNORE Metoda vraća vrijednosti IDYES, IDNO, IDCANCEL, …

  20. MessageBox if (MessageBox(_T("Draw text?"), _T(""), MB_YESNOCANCEL)==IDYES) dc.TextOut(10,10,_T("Tekst"));

  21. MessageBox MessageBox(_T("Display text?"), _T(""), MB_YESNOCANCEL | MB_ICONQUESTION); Još neke mogućnosti: MB_ICONWARNING, MB_ICONINFORMATION, MB_ICONEXCLAMATION, MB_ICONASTERISK, MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND

  22. MessageBox MessageBox (_T("Želite li sve izbrisati?"), _T(""), MB_YESNO | MB_DEFBUTTON2); Fokus je na ovom gumbu.

  23. Crtanje BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ….. ON_WM_LBUTTONUP() END_MESSAGE_MAP() void CMainWindow::OnLButtonUp(UINT nFlags, CPoint point){ CRect rect; GetClientRect(&rect); CClientDC dc(this); dc.MoveTo(point.x, point.y); dc.LineTo(rect.right, rect.bottom); dc.LineTo(rect.left, rect.bottom); dc.LineTo(point.x, point.y); }

  24. Crtanje Kad otpustimo miš bilo gdje unutar prozora, nacrta se trokut kojem je jedan od vrhova na mjestu otpuštanja.

  25. Crtanje void CMainWindow::OnPaint(){ CPaintDC dc(this); CRect rect; GetClientRect (&rect); POINT aPoint1[5]={20,20, 120,20, 120, 120, 20,120, 20,20}; POINT aPoint2[4]={150, 100, 150, 200, 300, 150, 550, 40}; dc.Polyline (aPoint1, 5); dc.Ellipse(200,200,300,300); dc.Ellipse(200,150,100,300); dc.PolyBezier(aPoint2, 4); }

  26. Crtanje Još neke metode: PolyLineTo, Arc, ArcTo, PolyBezierTo, PolyDraw, Chord, Pie, Polygon, Rectangle, RoundRect

  27. Crtanje Mijenjamo postavke za Cpen: CPen pen; pen.CreatePen(PS_SOLID, 1, RGB (192, 0, 192)); //Magenta dc.SelectObject(pen); Još neke opcije za pen style: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_INSIDEFRAME, PS_NULL

  28. Crtanje CGdiObject (izvedena iz Cobject) je bazna klasa za razne GDI (graphics device interface) objekte. Sama klasa se nikad ne instancira nego se kreiraju objekti izvedenih klasa, kao što su: CBitmap, CBrush, CFont, CPalette, CPen, CRgn

  29. Crtanje Sa sljedećom naredbom smještamo ishodište koordinatnog sustava u središte (klijent) dijela prozora: dc.SetViewportOrg(rect.Width() / 2, rect.Height() / 2);

  30. Crtanje CBrush brush (HS_CROSS, RGB(100,120,250)); dc.SelectObject(&brush); dc.SetBkColor(RGB(300,100,100)); dc.Rectangle(0,0, rect.right, rect.bottom); Ostali hatch brush stilovi: HS_BDIAGONAL, HS_FDIAGONAL, HS_CROSS, HS_HORIZONTAL, HS_DIAGCROSS, HS_VERTICAL

  31. Crtanje

  32. Crtanje dc.TextOutW(100,100, _T("Tekst s koordinatama")); dc.DrawText( _T("Tekst bez koordinata"), -1, rect,DT_SINGLELINE); CFont font; font.CreatePointFont(400, _T("Arial")); dc.SelectObject(&font); dc.SetTextColor(RGB(400,200,200)); dc.TextOutW(200,200, _T("Novi font"));

  33. Crtanje

  34. Rad s mišom Poruke vezane za događaje s mišom u klijent području: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MOUSEMOVE

  35. Rad s mišom Primjer: Message-mapmacro za poruku WM_LBUTTONDOWN glasi ON_WM_LBUTTONDOWN. Pripadni messagehandler je afx_msgvoidOnLButtonDown(UINT nFlags, Cpointpoint) point – položaj pokazivača miša za vrijeme pritiska nFlags – parametar pomoću kojeg možemo provjeriti koja tipka miša je pritisnuta i jesu li pritisnuti Ctrl i Shift

  36. Rad s mišom nFlags: MK_LBUTTON MK_MBUTTON MK_RBUTTON MK_CONTROL MK_SHIFT Npr. pomoću nFLAGS & MK_RBUTTON možemo provjeriti je li pritisnuta desna tipka miša

  37. Rad s mišom Kad se mišem klikne na dijelove prozora koji ne pripadaju klijentskom području ili se miš pomiče po tim dijelovima, šalju se druge vrste poruka: WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE itd. Pripadni macro za prvu poruku je opet oblika ON_WM_NCLBUTTONDOWN, a poruku obrađuje funkcija afx_msg void OnNcLButtonDown(UINT nHitTest, Cpoint point) Napomena: kod ovakvih handlera prenose se koordinate koje odgovaraju koordinatama zaslona. (Mogu se prebaciti u klijent koordinate pomoću funkcije CWnd::ScreenToCLient.)

  38. Rad s mišom Pomoću parametra nHitTest se može ustanoviti u kojem se dijelu prozora zbio događaj. Primjeri: HTCAPTION - na traci s naslovom HTREDUCE – na gumbu za minimiziranje HTVSCROLL – u vertikalnoj kliznoj traci HTZOOM – na gumbu za maksimiziranje itd.

  39. Rad s mišom Kod uporabe miša s kotačićem, prozor može primati i poruku WM_MOUSEWHEEL. Pripadni macro je ON_WM_MOUSEWHEEL, a funkcija je BOOL OnMouseWheel (UINT nFlags, short zDelta, CPoint point) nFlags i point znače isto kao i kod OnLButtonDown. zDelta – određuje vrijednost za koju je pomaknut kotačić.

  40. Rad s mišom Ukoliko se pritisne tipka miša (npr. lijeva) šalje se poruka WM_LBUTTONDOWN. Međutim, ako pokazivač miša izađe izvan klijent dijela prozora, neće se poslati poruka WM_LBUTTONUP. Ako je slanje te poruke ipak nužno za pravilno funkcioniranje programa, potrebno je u pripadnim handlerima pozvati sljedeće metode. void OnLButtonDown(UINT nFlags, Cpoint point){ SetCapture(); } void OnLButtonUp(UINT nFlags, Cpoint point){ ::ReleaseCapture(); MessageBox(_T("Uhvatio ButtonUp")); }

  41. Tipkovnica Pritisak na većinu tipaka na tipkovnici generira WM_KEYDOWN poruku, dok se otpuštanjem tipke šalje WM_KEYUP poruka. Handleri su oblika: afx_msg void OnImePoruke(UINT nChar, UINT nRepCnt, UINT nFlags) Poruke vezane za rad s tipkovnicom su i WM_SYSKEYUP, WM_SYSKEYDOWN, WM_CHAR

More Related