Dodawanie funkcji obsługi myszy

Download Report

Transcript Dodawanie funkcji obsługi myszy

Zastosowania Informatyki
Wykład 6
Visual C++
[email protected]
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_LBUTTONDOWN
- lewy przycisk
wciśnięty
WM_LBUTTONUP
- lewy przycisk
wyciśnięty
WM_LBUTTONDBLCLK
- lewy przycisk
podwójne kliknięcie
WM_MOUSEMOVE
- zmiana położenia
kursora myszy
- zmiana położenia
„kółka” na myszce
WM_MOUSEWHEEL
Copyright, 2003 © Adam Czajka
Obsługa myszy
Komunikaty myszki
prawy przycisk
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBCLK
środkowy przycisk
WM_MBUTTONDOWN
WM_MBUTTONUP
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)
{
UINT nFlags – stan klawiszy funkcyjnych
char txt[30];
(SHIFT – MK_SHIFT, CTRL –
sprintf(txt, ”[%d, %d]”, point.x, point.y);
MK_CONTROL)
theApp.m_pMainWnd->SetWindowText(txt);
CPoint point – położenie kursora myszy w
obszarze roboczym okna
// CView ::OnLButtonDown(nFlags, point);
}
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
ramka z tytułem
pasek przewijania
menu aplikacji
obszar roboczy aplikacji
pasek narzędzi
wiersz statusu aplikacji
Copyright, 2003 © Adam Czajka
Obsługa myszy
Przechwytywanie myszy
CWnd::SetCapture()
CWnd::ReleaseCapture()
void CAppView::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture();
}
void CAppView::OnLButtonUp(UINT nFlags, CPoint point)
{
ReleaseCapture();
}
Copyright, 2003 © Adam Czajka
Obsługa myszy
Zmiana kursora myszy
BeginWaitCursor()
::SetCursor(::LoadCursor(AfxGetInstanceHandle(),
IDC_UPARROW);
EndWaitCursor()
void CAppView::OnLButtonDown(UINT nFlags, CPoint point)
{
BeginWaitCursor();
}
void CAppView::OnLButtonUp(UINT nFlags, CPoint point)
{
EndWaitCursor();
}
Copyright, 2003 © Adam Czajka
Obsługa klawiatury
Zdarzenia związane z klawiaturą
WM_KEYDOWN
- klawisz wciśnięty
WM_KEYUP
- klawisz wyciś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_CHAR
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
Aplikacja
MFC
GDI (kontekst urządzenia)
Urządzenia fizyczne
Urządzenia wirtualne
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
Aplikacja musi odrysować okienko w:
odpowiedzi na żądanie systemu
Windows (komunikat WM-PAINT)
odpowiedzi na polecenia użytkownika
(implementacja obsługi poleceń w
tworzonym programie)
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
CWnd::GetClientRect(LPRECT rect);
(0, 0)
H
W
(W, H)
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
Generowanie komunikatu WM_PAINT (wymuszenie
odmalowania okienka)
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
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)
pobranie
{
kontekstu
do okienka
CDC *pDC = GetDC();
RECT rect;
GetClientRect(&rect);
CBrush brush(RGB(0, 255, 0));
pDC->FillRect(&rect, &brush);
ReleaseDC(pDC);
}
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
Copyright, 2003 © Adam Czajka