Visual C++ Zastosowania Informatyki Wykład 6 Copyright, 2003 © Adam Czajka
Spis treści Obsługa myszy Obsługa klawiatury Grafika I
Copyright, 2003 © Adam Czajka Obsługa myszy Zdarzenia pochodzące od myszki Wciśnięcie przycisku Ruch kursora Podwójne wciśnięcie przycisku
Copyright, 2003 © Adam Czajka Obsługa myszy Komunikaty myszki WM_LBUTTONUP- lewy przycisk wyciśnięty WM_LBUTTONDOWN - lewy przycisk wciśnięty WM_LBUTTONDBLCLK- lewy przycisk podwójne kliknięcie WM_MOUSEMOVE- zmiana położenia kursora myszy WM_MOUSEWHEEL- zmiana położenia kółka na myszce
Copyright, 2003 © Adam Czajka Obsługa myszy Komunikaty myszki WM_RBUTTONUP WM_RBUTTONDOWN prawy przycisk WM_RBUTTONDBCLK WM_MBUTTONUP WM_MBUTTONDOWN środkowy przycisk WM_MBUTTONDBCLK
Copyright, 2003 © Adam Czajka Obsługa myszy Dodawanie funkcji obsługi myszy
Copyright, 2003 © Adam Czajka Obsługa myszy Dodawanie funkcji obsługi myszy void CAppView::OnLButtonDown(UINT nFlags, CPoint point) { char txt[30]; sprintf(txt, [%d, %d], point.x, point.y); theApp.m_pMainWnd->SetWindowText(txt); // CView ::OnLButtonDown(nFlags, point); } UINT nFlags – stan klawiszy funkcyjnych (SHIFT – MK_SHIFT, CTRL – MK_CONTROL) CPoint point – położenie kursora myszy w obszarze roboczym okna
Copyright, 2003 © Adam Czajka Obsługa myszy Dodawanie funkcji obsługi myszy
Copyright, 2003 © Adam Czajka Obsługa myszy Dodawanie funkcji obsługi myszy void CAppView::OnMouseMove(UINT nFlags, CPoint point) { char txt[30]; sprintf(txt, [%d, %d], point.x, point.y); theApp.m_pMainWnd->SetWindowText(txt); // CView :: OnMouseMove(nFlags, point); }
Copyright, 2003 © Adam Czajka Obsługa myszy Dodawanie funkcji obsługi myszy Zdarzenia od myszki docierają do okienka tylko wtedy, gdy kursor myszy znajduje się wewnątrz obszaru roboczego okna – przesunięcie kursora na ramkę okna powoduje wstrzymanie wysyłania komunikatów od myszki. Zdarzenie związane z ramką okienka należą do grupy zdarzeń WM_NC... afx_msg void OnNcLButtonDown( UINT nHitTest, CPoint point ); HTMENU, HTBORDER, HTCAPTION, HTSYSMENU, HTZOOM
Copyright, 2003 © Adam Czajka Obsługa myszy Dodawanie funkcji obsługi myszy obszar roboczy aplikacji menu aplikacji pasek narzędzi ramka z tytułem pasek przewijania wiersz statusu aplikacji
Copyright, 2003 © Adam Czajka Obsługa myszy Przechwytywanie myszy void CAppView::OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } void CAppView::OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); } CWnd::SetCapture() CWnd::ReleaseCapture()
Copyright, 2003 © Adam Czajka Obsługa myszy Zmiana kursora myszy void CAppView::OnLButtonDown(UINT nFlags, CPoint point) { BeginWaitCursor(); } void CAppView::OnLButtonUp(UINT nFlags, CPoint point) { EndWaitCursor(); } BeginWaitCursor() EndWaitCursor() ::SetCursor(::LoadCursor(AfxGetInstanceHandle(), IDC_UPARROW);
Copyright, 2003 © Adam Czajka Obsługa klawiatury Zdarzenia związane z klawiaturą WM_KEYUP- klawisz wyciśnięty WM_KEYDOWN - klawisz wciśnięty WM_CHAR- wprowadzono znak drukowalny klawisze mają przyporządkowane kody wirtualne VK_XXX: VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_RETURN
Copyright, 2003 © Adam Czajka Obsługa klawiatury Zdarzenia związane z klawiaturą – sekwencja zdarzeń WM_KEYDOWN WM_KEYDOWN WM_CHAR WM_CHAR WM_KEYUP WM_KEYUP
Copyright, 2003 © Adam Czajka Obsługa klawiatury Komunikaty pochodzące od klawiatury
Copyright, 2003 © Adam Czajka Obsługa klawiatury Komunikaty pochodzące od klawiatury void CAppView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { //nChar – znak wprowadzony z klawiatury //nRepCount – licznik powtórzeń znaku CView::OnChar(nChar, nRepCnt, nFlags); }
Copyright, 2003 © Adam Czajka Grafika Rodzaje grafiki Grafika rastrowa - Bitmapy (*.bmp, *.jpg) - Video (*.avi) Grafika wektorowa - Animacje (*.wmf) - Rysunki Tekst
Copyright, 2003 © Adam Czajka Grafika Urządzenia GDI GDI (kontekst urządzenia) Urządzenia fizyczneUrządzenia wirtualne Aplikacja MFC
Copyright, 2003 © Adam Czajka Grafika Kontekst urządzenia – klasa CDC class CDC { HDC m_hDC; public: CDC( );... virtual BOOL CreateDC( LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const void* lpInitData ); virtual BOOL CreateCompatibleDC( CDC* pDC ); virtual BOOL DeleteDC( );... }
Copyright, 2003 © Adam Czajka Grafika Odrysowywanie okienka odpowiedzi na żądanie systemu Windows (komunikat WM-PAINT) odpowiedzi na polecenia użytkownika (implementacja obsługi poleceń w tworzonym programie) Aplikacja musi odrysować okienko w:
Copyright, 2003 © Adam Czajka Grafika Odrysowywanie okienka Każda aplikacja musi umieć odrysować swoje okienka na żądanie systemu Windows
Copyright, 2003 © Adam Czajka Grafika Odrysowywanie okienka void CAppView::OnDraw(CDC* pDC) { CAppDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // rysuje zielony prostokąt RECT rect; GetClientRect(&rect); CBrush brush(RGB(0, 255, 0)); pDC->FillRect(&rect, &brush); }
Copyright, 2003 © Adam Czajka Grafika Odrysowywanie okienka (0, 0) (W, H) CWnd::GetClientRect(LPRECT rect); H W
Copyright, 2003 © Adam Czajka Grafika Komunikat WM_PAINT
Copyright, 2003 © Adam Czajka Grafika Komunikat WM_PAINT void CAppView::OnPaint() { CPaintDC dc(this); // device context for painting RECT rect; GetClientRect(&rect); CBrush brush(RGB(0, 255, 0)); dc.FillRect(&rect, &brush); // Do not call CView::OnPaint() for painting messages }
Copyright, 2003 © Adam Czajka Grafika Komunikat WM_PAINT UpdateWindow(); – wysyła komunikat WM_PAINT Invalidate(BOOL erase=TRUE); – unieważnia obszar roboczy okna BOOL RedrawWindow( LPCRECT lpRectUpdate = NULL, CRgn* prgnUpdate = NULL, UINT flags = WCE_IF( 0 RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE )); – odrysowywuje okienko Generowanie komunikatu WM_PAINT (wymuszenie odmalowania okienka) Komunikatu WM_PAINT nie wysyłamy za pomocą SendMessage, czy PostMessage ale poprzez specjalne funkcje
Copyright, 2003 © Adam Czajka Grafika Rysowanie w oknie poza WM_PAINT void CAppView::OnLButtonUp(UINT nFlags, CPoint point) { CDC *pDC = GetDC(); RECT rect; GetClientRect(&rect); CBrush brush(RGB(0, 255, 0)); pDC->FillRect(&rect, &brush); ReleaseDC(pDC); } pobranie kontekstu do okienka zwolnienie kontekstu do okienka kontekst okienka pochodzi z puli uchwytów, których liczba jest OGRANICZONA !!!
Copyright, 2003 © Adam Czajka Grafika Rysowanie w oknie poza WM_PAINT – inne podejście void CAppView::OnLButtonUp(UINT nFlags, CPoint point) { CDC *pDC = GetDC(); RECT rect; GetClientRect(&rect); CBrush brush(RGB(0, 255, 0)); pDC->FillRect(&rect, &brush); ReleaseDC(pDC); }
Copyright, 2003 © Adam Czajka Podsumowanie Obsługa myszy Obsługa klawiatury Grafika I