Gesty myszy w WinAPI

krstk

Porada traktuje o gestach myszy w WinAPI.

1) Dodajemy nagłówek:

#include <windowsx.h>

2) Deklarujemy zmienne:

bool a = false;
int y1, x1, y, x;
HWND hwnd;

3) W procedurze zdarzeniowej piszemy:

case WM_MBUTTONDOWN:
  a = true;
  x = GET_X_LPARAM(lParam);
  y = GET_Y_LPARAM(lParam);
break;

case WM_MBUTTONUP:
  x1 = GET_X_LPARAM(lParam);
  y1 = GET_Y_LPARAM(lParam);

  if(y + 15 > y1 && y - 15 < y1 && x < x1)// 15  pikseli poziomej martwej strefy, user raczej nie przesunie kursora w idealnym pionie
  {
    //instrukcje przy ruchu myszą w prawo
  }

  if(y + 15 > y1 && y - 15 < y1 && x > x1)
  {  
    // przy geście w lewo
  }

  if(x + 15 > x1 && x - 15 < x1 && y > y1)
  {
    // przy geście w dół
  }

  if(x + 15 > x1 && x - 15 < x1 && y < y1)
  {
    // przy geście w górę
  }
break;

Aby wykonać gest należy przytrzymać środkowy przycisk myszy (scroll), ale jak ktoś nie chce zajmować przycisku myszy, to można po instrukcji Switch wstawić kod:

if(message == WM_MBUTTONDOWN and wParam & MK_SHIFT);
{ 
  a = true;
  x = GET_X_LPARAM(lParam);
  y = GET_Y_LPARAM(lParam);
}

if(message == WM_MBUTTONUP and wParam & MK_SHIFT)
{
  x1 = GET_X_LPARAM(lParam);
  y1 = GET_Y_LPARAM(lParam);

  if(y + 15 > y1 && y - 15 < y1 && x < x1)
  {
    //instrukcje przy ruchu myszą w prawo
  }

  if(y + 15 > y1 && y - 15 < y1 && x > x1)
  {  
    // przy geście w lewo
  }

  if(x + 15 > x1 && x - 15 < x1 && y > y1)
  {
    // przy geście w dół
  }

  if(x + 15 > x1 && x - 15 < x1 && y < y1)
  {
    // przy geście w górę
  }
}

...albo w instrukcji Switch:

case WM_MBUTTONDOWN:
  if(wParam & MK_SHIFT)
  {
    a = true;
    x = GET_X_LPARAM(lParam);
    y = GET_Y_LPARAM(lParam);
  }
break;

case WM_MBUTTONUP:
  if(wParam & MK_SHIFT)
  {
    x1 = GET_X_LPARAM(lParam);
    y1 = GET_Y_LPARAM(lParam);

    if(y + 15 > y1 && y - 15 < y1 && x < x1)
    {
      //instrukcje przy ruchu myszą w prawo
    }

    if(y + 15 > y1 && y - 15 < y1 && x > x1)
    {  
      // przy geście w lewo
    }

    if(x + 15 > x1 && x - 15 < x1 && y > y1)
    {
      // przy geście w dół
    }

    if(x + 15 > x1 && x - 15 < x1 && y < y1)
    {
      // przy geście w górę
    }
  }
break;

Tym razem gesty będą używane tylko przy przytrzymaniu klawisza Shift. Równie dobrze można napisać MK_ALT (Alt) lub MK_CONTROL (Control) i MK_RETURN (Enter).

0 komentarzy