MFC - Wiadomości i wydarzenia

Aplikacja składa się z różnych obiektów. W większości przypadków na komputerze działa więcej niż jedna aplikacja, a system operacyjny jest stale proszony o wykonanie niektórych zadań. Ponieważ może być tak wiele żądań prezentowanych w nieprzewidywalny sposób, system operacyjny pozostawia obiektom określenie, czego chcą, kiedy chcą i jakiego zachowania lub wyniku oczekują.

Przegląd

  • System operacyjny Microsoft Windows nie jest w stanie przewidzieć, jakiego rodzaju żądania jeden obiekt będzie wymagał obsługi i jakiego rodzaju przypisania będzie potrzebny inny obiekt.

  • Aby zarządzać wszystkimi przydziałami i żądaniami, obiekty wysyłają wiadomości.

  • Każdy obiekt ma obowiązek zdecydować, jaką wiadomość wysłać i kiedy.

  • Aby wysłać wiadomość, formant musi utworzyć zdarzenie.

  • Aby dokonać rozróżnienia między nimi, nazwa wiadomości zwykle zaczyna się od WM_, co oznacza komunikat okna.

  • Nazwa zdarzenia zwykle zaczyna się od On, co oznacza akcję.

  • Zdarzenie to akcja wysyłania wiadomości.

Mapa wiadomości

Ponieważ Windows jest systemem operacyjnym zorientowanym na komunikaty, duża część programowania w środowisku Windows obejmuje obsługę komunikatów. Za każdym razem, gdy wystąpi zdarzenie, takie jak naciśnięcie klawisza lub kliknięcie myszą, do aplikacji wysyłana jest wiadomość, która następnie musi obsłużyć to zdarzenie.

  • Aby kompilator mógł zarządzać komunikatami, należy je uwzględnić w definicji klasy.

  • Plik DECLARE_MESSAGE_MAP makro powinno znajdować się na końcu definicji klasy, jak pokazano w poniższym kodzie.

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
  • Rzeczywiste komunikaty powinny być wymienione tuż nad wierszem DECLARE_MESSAGE_MAP.

  • Aby zaimplementować komunikaty, musisz utworzyć tabelę komunikatów, których używa twój program.

  • W tej tabeli są używane dwa makra ograniczające;

  • Zaczyna się od BEGIN_MESSAGE_MAP i kończy się na END_MESSAGE_MAP makra.

  • Makro BEGIN_MESSAGE_MAP przyjmuje dwa argumenty, nazwę klasy i klasę MFC, z której wyprowadzono klasę, jak pokazano w poniższym kodzie.

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

   // Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
                                      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance(){
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Spójrzmy na prosty przykład, tworząc nowy projekt Win32.

Step 1 - Aby utworzyć projekt MFC, kliknij projekt prawym przyciskiem myszy i wybierz opcję Właściwości.

Step 2 - W lewej sekcji kliknij Właściwości konfiguracji → Ogólne.

Step 3 - Wybierz opcję „Użyj MFC w udostępnionej bibliotece DLL” w sekcji Ustawienia domyślne projektu i kliknij przycisk OK.

Step 4 - Musimy dodać nowy plik źródłowy.

Step 5 - Kliknij prawym przyciskiem myszy projekt i wybierz Dodaj → Nowy element.

Step 6 - W sekcji Szablony kliknij opcję Plik C ++ (.cpp).

Step 7 - Kliknij Dodaj, aby kontynuować.

Step 8 - Teraz dodaj następujący kod w pliku * .cpp.

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};

CMainFrame::CMainFrame() {
   // Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}

class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance() {
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Wiadomości systemu Windows

Istnieją różne typy komunikatów systemu Windows, takie jak tworzenie okna, wyświetlanie okna itp. Oto niektóre z najczęściej używanych komunikatów systemu Windows.

Wiadomość Wpis na mapie Opis
WM_ACTIVATE ON_WM_ACTIVATE () Framework wywołuje tę funkcję członkowską, gdy obiekt CWnd jest aktywowany lub dezaktywowany.
WM_ACTIVATEA PP ON_WM_ACTIVATEAPP () Struktura wywołuje tę funkcję członkowską we wszystkich oknach najwyższego poziomu aktywowanego zadania i we wszystkich oknach najwyższego poziomu dezaktywowanego zadania.
WM_APPCOMM AND ON_WM_APPCOMMAND () Struktura wywołuje tę funkcję członkowską, gdy użytkownik generuje zdarzenie polecenia aplikacji.
WM_CANCELMODE WM_CANCELMODE () Struktura wywołuje tę funkcję członkowską, aby poinformować CWnd o anulowaniu dowolnego trybu wewnętrznego.
WM_CHILDACTIVATE ON_WM_CHILDACTIVATE () Jeśli obiekt CWnd jest oknem potomnym interfejsu wielu dokumentów (MDI), OnChildActivate jest wywoływana przez strukturę, gdy użytkownik kliknie pasek tytułu okna lub gdy okno jest aktywowane, przenoszone lub zmieniane.
WM_CLIPBOAR DUPDATE ON_WM_CLIPBOARDUPDATE () Struktura wywołuje tę funkcję członkowską, gdy zawartość schowka uległa zmianie.
WM_CLOSE ON_WM_CLOSE () Struktura wywołuje tę funkcję członkowską jako sygnał, że CWnd lub aplikacja ma zakończyć działanie.
WM_CONTEXTMENU ON_WM_CONTEXTMENU () Wywoływane przez framework, gdy użytkownik kliknął prawym przyciskiem myszy (prawy przycisk myszy) w oknie.
WM_COPYDATA ON_WM_COPYDATA () Ta funkcja członkowska jest wywoływana przez platformę w celu kopiowania danych z jednej aplikacji do drugiej.
WM_CREATE ON_WM_CREATE () Struktura wywołuje tę funkcję członkowską, gdy aplikacja żąda utworzenia okna systemu Windows, wywołując funkcję członkowską Create lub CreateEx.
WM_CTLCOLOR ON_WM_CTLCOLOR () Struktura wywołuje tę funkcję członkowską, gdy ma zostać narysowana formant podrzędny.
WM_DELETEITEM ON_WM_DELETEITEM () Struktura wywołuje tę funkcję członkowską, aby poinformować właściciela pola listy rysowanej przez właściciela lub pola kombi, że pole listy lub pole kombi są zniszczone lub że elementy zostały usunięte.
WM_DESTROY ON_WM_DESTROY () Framework wywołuje tę funkcję składową, aby poinformować obiekt CWnd, że jest on niszczony.
WM_DRAWITEM ON_WM_DRAWITEM () Struktura wywołuje tę funkcję członkowską dla właściciela kontrolki przycisku rysowania przez właściciela, kontrolki pola kombi, kontrolki pola listy lub menu, gdy zmienił się aspekt wizualny kontrolki lub menu.
WM_DROPFILES ON_WM_DROPFILES () Struktura wywołuje tę funkcję członkowską, gdy użytkownik zwolni lewy przycisk myszy nad oknem, które zarejestrowało się jako odbiorca upuszczonych plików.
WM_ENABLE ON_WM_ENABLE () Struktura wywołuje tę funkcję członkowską, gdy aplikacja zmienia włączony stan obiektu CWnd. Składnia.
WM_HELPINFO ON_WM_HELPINFO () Obsługuje Pomoc F1 w aplikacji (przy użyciu bieżącego kontekstu).
WM_HOTKEY ON_WM_HOTKEY () Struktura wywołuje tę funkcję członkowską, gdy użytkownik naciśnie klawisz skrótu dla całego systemu.
WM_HSCROLL ON_WM_HSCROLL () Struktura wywołuje tę funkcję członkowską, gdy użytkownik kliknie poziomy pasek przewijania okna.
WM_KEYDOWN ON_WM_KEYDOWN () Struktura wywołuje tę funkcję składową po naciśnięciu klawisza niesystemowego.
WM_KEYUP ON_WM_KEYUP () Struktura wywołuje tę funkcję członkowską po zwolnieniu klucza niesystemowego.
WM_KILLFOCUS ON_WM_KILLFOCUS () Struktura wywołuje tę funkcję członkowską bezpośrednio przed utratą fokusu wprowadzania.
WM_LBUTTONDBLCLK ON_WM_LBUTTONDBLCLK () Struktura wywołuje tę funkcję członkowską, gdy użytkownik kliknie dwukrotnie lewy przycisk myszy.
WM_LBUTTONDOWN ON_WM_LBUTTONDOWN () Framework wywołuje tę funkcję członkowską, gdy użytkownik naciśnie lewy przycisk myszy.
WM_LBUTTONUP ON_WM_LBUTTONUP () Framework wywołuje tę funkcję członkowską, gdy użytkownik zwolni lewy przycisk myszy.
WM_MBUTTONDBLCLK ON_WM_MBUTTONDBLCLK () Struktura wywołuje tę funkcję członkowską, gdy użytkownik kliknie dwukrotnie środkowy przycisk myszy.
WM_MBUTTONDOWN ON_WM_MBUTTONDOWN () Struktura wywołuje tę funkcję członkowską, gdy użytkownik naciśnie środkowy przycisk myszy.
WM_MBUTTONUP ON_WM_MBUTTONUP () Struktura wywołuje tę funkcję członkowską, gdy użytkownik zwolni środkowy przycisk myszy.
WM_MENUSELECT ON_WM_MENUSELECT () Jeśli obiekt CWnd jest skojarzony z menu, OnMenuSelect jest wywoływana przez środowisko, gdy użytkownik wybierze element menu.
WM_MOUSEACTIVATE ON_WM_MOUSEACTIVATE () Struktura wywołuje tę funkcję członkowską, gdy kursor znajduje się w nieaktywnym oknie, a użytkownik naciśnie przycisk myszy.
WM_MOUSEHOVER ON_WM_MOUSEHOVER () Struktura wywołuje tę funkcję członkowską, gdy kursor znajduje się nad obszarem roboczym okna przez czas określony we wcześniejszym wywołaniu TrackMouseEvent.
WM_MOUSEHWHEEL ON_WM_MOUSEHWHEEL () Struktura wywołuje ten element członkowski, gdy bieżące okno jest tworzone przez Menedżera okien pulpitu (DWM), a okno jest zmaksymalizowane.
WM_MOUSELEAVE ON_WM_MOUSELEAVE () Struktura wywołuje tę funkcję członkowską, gdy kursor opuszcza obszar roboczy okna określonego we wcześniejszym wywołaniu TrackMouseEvent.
WM_MOUSEMOVE ON_WM_MOUSEMOVE () Struktura wywołuje tę funkcję członkowską, gdy porusza się kursor myszy.
WM_MOVE ON_WM_MOVE () Framework wywołuje tę funkcję członkowską po przeniesieniu obiektu CWnd.
WM_PAINT ON_WM_PAINT () Struktura wywołuje tę funkcję członkowską, gdy system Windows lub aplikacja żąda przemalowania części okna aplikacji.
WM_SETFOCUS () ON_WM_SETFOCUS () Struktura wywołuje tę funkcję członkowską po uzyskaniu fokusu wejściowego.
WM_SIZE () ON_WM_SIZE () Struktura wywołuje tę funkcję członkowską po zmianie rozmiaru okna.
WM_TIMER ON_WM_TIMER () Struktura wywołuje tę funkcję składową po każdym interwale określonym w funkcji składowej SetTimer używanej do zainstalowania licznika czasu.
WM_VSCROLL ON_WM_VSCROLL () Struktura wywołuje tę funkcję członkowską, gdy użytkownik kliknie pionowy pasek przewijania okna.
WM_WINDOWPOSCHANGED ON_WM_WINDOWPOSCHANGED () Struktura wywołuje tę funkcję składową, gdy rozmiar, pozycja lub kolejność Z uległy zmianie w wyniku wywołania funkcji składowej SetWindowPos lub innej funkcji zarządzania oknami.

Spójrzmy na prosty przykład tworzenia okien.

WM_CREATE - Kiedy tworzony jest obiekt zwany oknem, ramka tworząca obiekty wysyła komunikat identyfikowany jako ON_WM_CREATE.

Step 1- Aby utworzyć ON_WM_CREATE, dodaj afx_msg int OnCreate (LPCREATESTRUCT lpCreateStruct); przed DECLARE_MESSAGE_MAP (), jak pokazano poniżej.

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};

Step 2 - Dodaj ON_WM_CREATE () po BEGIN_MESSAGE_MAP (CMainFrame, CFrameWnd) i przed END_MESSAGE_MAP ()

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()

Step 3 - Oto implementacja OnCreate ()

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   // Call the base class to create the window
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {

      // If the window was successfully created, let the user know
      MessageBox(L"The window has been created!!!");
      // Since the window was successfully created, return 0
      return 0;
   }
   // Otherwise, return -1
   return -1;
}

Step 4 - Teraz twój plik * .cpp będzie wyglądał jak w poniższym kodzie.

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

   // Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   // Call the base class to create the window
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {
      // If the window was successfully created, let the user know
      MessageBox(L"The window has been created!!!");
      // Since the window was successfully created, return 0
      return 0;
   }
   // Otherwise, return -1
   return -1;
}
BOOL CMessagesApp::InitInstance() { 
   m_pMainWnd = new CMainFrame;
   m_pMainWnd -> ShowWindow(SW_SHOW);
   m_pMainWnd -> UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Step 5 - Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe.

Step 6 - Po kliknięciu OK wyświetli się okno główne.

Komunikaty poleceń

Jedną z głównych cech aplikacji graficznej jest prezentacja elementów sterujących i zasobów systemu Windows, które pozwalają użytkownikowi na interakcję z maszyną. Przykłady kontrolek, których się nauczymy, to przyciski, pola listy, pola kombi itp.

Jednym z rodzajów zasobów, które przedstawiliśmy w poprzedniej lekcji, jest menu. Takie kontrolki i zasoby mogą inicjować własne wiadomości, gdy użytkownik je kliknie. Komunikat pochodzący z kontrolki lub zasobu systemu Windows nazywany jest komunikatem polecenia.

Przyjrzyjmy się prostemu przykładowi komunikatów poleceń.

Aby zapewnić aplikacji możliwość tworzenia nowego dokumentu, klasa CWinApp udostępnia metodę OnFileNew ().

afx_msg void OnFileNew();

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_COMMAND(ID_FILE_NEW, CMainFrame::OnFileNew)
END_MESSAGE_MAP()

Oto definicja metody -

void CMainFrame::OnFileNew() {
   // Create New file
}

Komunikaty klawiatury

ZA keyboardto obiekt sprzętowy podłączony do komputera. Domyślnie służy do wprowadzania rozpoznawalnych symboli, liter i innych znaków w kontrolce. Każdy klawisz na klawiaturze wyświetla symbol, literę lub ich kombinację, aby wskazać, do czego można użyć klawisza. Użytkownik zazwyczaj naciska klawisz, który wysyła sygnał do programu.

Każdy klucz ma kod rozpoznawany przez system operacyjny. Ten kod jest znany jakovirtual key code.

Sr.No. Stała / wartość i opis
1

VK_LBUTTON

Lewy przycisk myszy

2

VK_RBUTTON

Prawy przycisk myszy

3

VK_CANCEL

Przetwarzanie z przerwami kontrolnymi

4

VK_MBUTTON

Środkowy przycisk myszy (mysz z trzema przyciskami)

5

VK_BACK

Klawisz BACKSPACE

6

VK_RETURN

Przycisk ENTER

7

VK_TAB

Klawisz TAB

8

VK_CLEAR

Klawisz CLEAR

9

VK_SHIFT

Klawisz Shift

10

VK_CONTROL

Klawisz CTRL

11

VK_MENU

Klawisz Alt

12

VK_PAUSE

Klawisz PAUSE

13

VK_CAPITAL

Klawisz CAPS LOCK

14

VK_ESCAPE

Klawisz ESC

15

VK_SPACE

SPACJA

16

VK_PRIOR

Klawisz PAGE UP

17

VK_NEXT

Klawisz PAGE DOWN

18

VK_END

Klawisz END

19

VK_HOME

Klawisz HOME

20

VK_LEFT

Klawisz STRZAŁKA W LEWO

21

VK_UP

Klawisz STRZAŁKI W GÓRĘ

22

VK_RIGHT

Klawisz STRZAŁKI W PRAWO

23

VK_DOWN

Klawisz STRZAŁKA W DÓŁ

24

VK_SELECT

Klawisz SELECT

25

VK_PRINT

Klawisz PRINT

26

VK_EXECUTE

Klawisz EXECUTE

27

VK_SNAPSHOT

Przycisk PRINT SCREEN

28

VK_INSERT

Klucz INS

29

VK_DELETE

Klawisz DEL

30

VK_NUMPAD0

Klawisz 0 na klawiaturze numerycznej

31

VK_NUMPAD1

Klawisz 1 klawiatury numerycznej

32

VK_NUMPAD2

Klawisz 2 klawiatury numerycznej

33

VK_NUMPAD3

Klawisz 3 klawiatury numerycznej

34

VK_NUMPAD4

Klawisz 4 klawiatury numerycznej

35

VK_NUMPAD5

Klawisz 5 klawiatury numerycznej

36

VK_NUMPAD6

Klawisz 6 klawiatury numerycznej

37

VK_NUMPAD7

Klawisz 7 klawiatury numerycznej

38

VK_NUMPAD8

Klawisz 8 klawiatury numerycznej

39

VK_NUMPAD9

Klawisz 9 klawiatury numerycznej

40

VK_MULTIPLY

Pomnóż klucz

41

VK_ADD

Dodaj klucz

42

VK_SEPARATOR

Klucz separatora

43

VK_SUBTRACT

Odejmij klucz

44

VK_DECIMAL

Klucz dziesiętny

45

VK_DIVIDE

Klucz podziału

46

VK_F1

Klawisz F1

47

VK_F2

Klawisz F2

48

VK_F3

Klawisz F3

49

VK_F4

Klawisz F4

50

VK_F5

Klawisz F5

52

VK_F6

Klawisz F6

53

VK_F7

Klawisz F7

54

VK_F8

Klawisz F8

55

VK_F9

Klawisz F9

56

VK_F10

Klawisz F10

57

VK_F11

Klawisz F11

58

VK_F12

Klawisz F12

59

VK_NUMLOCK

Klawisz NUM LOCK

60

VK_SCROLL

Klawisz SCROLL LOCK

61

VK_LSHIFT

Lewy klawisz SHIFT

62

VK_RSHIFT

Prawy klawisz SHIFT

63

VK_LCONTROL

Lewy klawisz CONTROL

64

VK_RCONTROL

Prawy klawisz CONTROL

Naciśnięcie klawisza powoduje umieszczenie wiadomości WM_KEYDOWN lub WM_SYSKEYDOWN w wiadomości wątku. Można to zdefiniować w następujący sposób -

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

Spójrzmy na prosty przykład.

Step 1 - Oto wiadomość.

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()

Step 2 - Oto implementacja OnKeyDown ().

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
   switch (nChar) {

      case VK_RETURN:
         MessageBox(L"You pressed Enter");
         break;
      case VK_F1:
         MessageBox(L"Help is not available at the moment");
         break;
      case VK_DELETE:
         MessageBox(L"Can't Delete This");
         break;
      default:
         MessageBox(L"Whatever");
   }
}

Step 3 - Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe.

Step 4 - Po naciśnięciu klawisza Enter wyświetli się następujący komunikat.

Wiadomości myszy

Mysz to kolejny obiekt, który jest podłączony do komputera i umożliwia użytkownikowi interakcję z maszyną.

  • Jeśli naciśnięto lewy przycisk myszy, wysyłana jest wiadomość ON_WM_LBUTTONDOWN. Składnia tej wiadomości to -

    • afx_msg void OnLButtonDown (UINT nFlags, punkt CPoint)

  • Jeśli został naciśnięty prawy przycisk myszy, wysyłana jest wiadomość ON_WM_RBUTTONDOWN. Jego składnia to -

    • afx_msg void OnRButtonDown (UINT nFlags, punkt CPoint)

  • Podobnie, jeśli lewy przycisk myszy jest zwalniany, wysyłany jest komunikat ON_WM_LBUTTONUP. Jego składnia to -

    • afx_msg void OnLButtonUp (UINT nFlags, punkt CPoint)

  • W przypadku zwolnienia prawego przycisku myszy wysyłany jest komunikat ON_WM_TBUTTONUP. Jego składnia to -

    • afx_msg void OnRButtonUp (UINT nFlags, punkt CPoint)

Spójrzmy na prosty przykład.

Step 1 - Dodaj następujące dwie funkcje w definicji klasy CMainFrame, jak pokazano w poniższym kodzie.

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
      afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
      afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
      DECLARE_MESSAGE_MAP()
};

Step 2 - Dodaj następujące dwie mapy wiadomości.

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_KEYDOWN()
   ON_WM_LBUTTONDOWN()
   ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

Step 3 - Oto definicja funkcji.

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { 
   CString MsgCoord;
   MsgCoord.Format(L"Left Button at P(%d, %d)", point.x, point.y);
   MessageBox(MsgCoord);
}
void CMainFrame::OnRButtonUp(UINT nFlags, CPoint point) { 
   MessageBox(L"Right Mouse Button Up");
}

Step 4 - Po uruchomieniu tej aplikacji zobaczysz następujące dane wyjściowe.

Step 5 - Po kliknięciu OK zostanie wyświetlony następujący komunikat.

Step 6- Kliknij prawym przyciskiem myszy to okno. Teraz, gdy zwolnisz prawy przycisk myszy, wyświetli się następujący komunikat.