410 likes | 641 Views
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).
E N D
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.
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
MFC hijerarhija (izbor klasa) CPoint CRect CObject CDC CCmdTarget CWinThread CMap CList CWinApp CWnd CFrameWnd CDialog CView CButton CStatic
Hello.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance (); }; class CMainWindow : public CFrameWnd { public: CMainWindow(); protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP(); };
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; }
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); }
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"));} }
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.
Kontrole Kontrola se kreira instanciranjem odgovarajuće MFC klase. Na dobivenom objektu se zatim poziva metoda Create.
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):
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 ………
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
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);
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.
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") ); }
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, …
MessageBox if (MessageBox(_T("Draw text?"), _T(""), MB_YESNOCANCEL)==IDYES) dc.TextOut(10,10,_T("Tekst"));
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
MessageBox MessageBox (_T("Želite li sve izbrisati?"), _T(""), MB_YESNO | MB_DEFBUTTON2); Fokus je na ovom gumbu.
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); }
Crtanje Kad otpustimo miš bilo gdje unutar prozora, nacrta se trokut kojem je jedan od vrhova na mjestu otpuštanja.
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); }
Crtanje Još neke metode: PolyLineTo, Arc, ArcTo, PolyBezierTo, PolyDraw, Chord, Pie, Polygon, Rectangle, RoundRect
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
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
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);
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
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"));
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
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
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
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.)
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.
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ć.
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")); }
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