Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (WinAPI, Konsole) » Mausereignisse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2003, 16:14 Uhr
void*
Generic Pointer
(Operator)


Erstellt von Uwe

Im letzten Teil unserer Einführung haben wir Tastaturereignisse aufgefangen, ausgewertet und, wenn auch nur durch eine MessageBox(), auf den Tastendruck reagiert. Was für das Keyboard möglich ist, sollte doch auch für unser zweitwichtigstes Eingabegerät - der Maus funktionieren.
Das API stellt uns hier wieder einige Nachrichtenereignisse zur Verfügung. Die wichtigsten für uns sind:
WM_LBUTTONDOWN linke Maustaste gedrückt?
WM_LBUTTONUP linke Maustaste losgelassen?

WM_RBUTTONDOWN rechte Maustaste gedrückt?
WM_RBUTTONUP rechte Maustaste losgelassen?

WM_MBUTTONDOWN dritte Maustaste (falls vorhanden) gedrückt?
WM_MBUTTONUP dritte Maustaste losgelassen?


Mit der Maus kann man ja bekanntlich auch Doppelklicks ausführen:
WM_LBUTTONDBLCLK Doppelklick links?
WM_RBUTTONDBLCLK Doppelklick rechts?
WM_MBUTTONDBLCLK Doppelklick dritte Maustaste?


Damit unser Programm auf Doppelklickereignisse reagieren kann müssen wir zunächst dies unserer Anwendung mitteilen. Wir ergänzen wc.style = CS_HREDRAW | CS_VREDRAW;

zu wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;


Um den nächsten Schritt zu verstehen schauen wir uns zunächst den Aufbau von einer Nachricht für ein Mausereignis an (hier WM_LBUTTONDOWN). Ein Blick in die API-Referenz zeigt uns folgendes:
WM_LBUTTONDOWN

C++:
fwKeys = wParam;        // key flags
xPos = LOWORD(lParam);  // horizontal position of cursor
yPos = HIWORD(lParam);  // vertical position of cursor



Parameters

fwKeys

Value of wParam. Indicates whether various virtual keys are down.
This parameter can be any combination of the following values:

Value Description
MK_CONTROL Set if the CTRL key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the SHIFT key is down.


Was zeigt uns das? In wParam ist ein Bitflag (Key Flag) enthalten, welches uns den Zustand der Maustasten sowie der Umschalt- und der Strg-Taste zurück gibt. In LOWORD(lParam) und HIWORD(lParam) befinden sich die Koordinaten der aktuellen Cursorposition.
Gut. Wir haben nun eigentlich alle nötigen Grundlagen geschaffen um uns mit dem eigentlichen Thema zu beschäftigen. Wir schreiben jetzt eine Anwendung, welche auf Mausklicks reagieren kann. Ein kleiner Hinweis noch dann geht es los. Wenn wir versuchen im folgenden Beispiel einen Doppelklick abzufangen, funktioniert die ganze Sache mit der MessageBox() nicht. Der Grund ist, daß die Funktion MessageBox() den 2. Klick abfängt und somit z.B. WM_LBUTTONDBLCLK nie aufgerufen wird. Um die Übersicht zu behalten, habe ich im folgenden Quellcode unser bisherige Implementation entfernt. Ein hinzufügen der entsprechenden Routinen zum vorhandenen Quellcode ist aber möglich.

C++:
#include < windows.h >
#include < stdio.h >
#include < tchar.h >

LRESULT CALLBACK WfFu(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,

int nCmdShow)
{
    WNDCLASSEX wc = {0};
    wc.cbSize =  sizeof(WNDCLASSEX);
    static TCHAR szAppName[] =
    _T("Fenster");
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WfFu;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = reinterpret_cast(COLOR_WINDOW + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szAppName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    HWND hWnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        szAppName,
        _T("Mausereignisse"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg,NULL, 0, 0) == TRUE)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WfFu(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
        int xPos, yPos;
        char mKoord[100];
        switch (message)
        {

                case WM_LBUTTONDOWN:

                   xPos= LOWORD(lParam);
                   yPos= HIWORD(lParam);
                   sprintf(mKoord,"Klick an Pos.: %d, %d . ",xPos,yPos);

               if(wParam & MK_SHIFT)
                  MessageBox(hWnd, mKoord, "Mausereignis", 0);

               else if(wParam & MK_CONTROL)
                  MessageBox(hWnd, "Die linke Maustaste und Strg wurden gedrückt.", "Mausereignis", 0);

               else
                           MessageBox(hWnd, "Die linke Maustaste wurde gedrückt.", "Mausereignis", 0);
                        return 0;

                case WM_RBUTTONDOWN:

               if(wParam & MK_SHIFT)
                  MessageBox(hWnd, "Die rechte Maustaste und Shift wurden gedrückt.", "Mausereignis", 0);

               else if(wParam & MK_CONTROL)
                  MessageBox(hWnd, "Die rechte Maustaste und Strg wurden gedrückt.", "Mausereignis", 0);

               else MessageBox(hWnd, "Die rechte Maustaste wurde gedrückt.", "Mausereignis", 0);
                        return 0;


                case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;

                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
    }
}




In WM_LBUTTONDOWN haben wir ein Beispiel wie die aktuellen Cursor - Koordinaten ausgelesen werden können. Die Ausgabe erfolgt beim betätigen der linken Maustaste + Shift. Um diese an Koordinaten an die Messagebox zu übergeben muß das Format von int in ein Textformat gewandelt werden. Dazu dient die Funktion int sprintf( char *buffer, const char *format [, argument] ... );

Diese Funktion ist in stdio.h definiert. Der entsprechende Header ist somit zu includieren.
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: