Programowanie w języku C/C++ » FAQ

Gesty myszy w WinAPI

  • 2006-12-10 20:12
  • 0 komentarzy
  • 873 odsłony
  • Oceń ten tekst jako pierwszy
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).