Gå til innhold

Hvordan trigge mouse button up?


Anbefalte innlegg

Hvordan får jeg ei while-løkke til å kjøre så lenge brukeren holder museknappen ned, og at løkken stopper når brukeren slipper opp knappen. Noen som har en kjapp kode på dette noe sted?

 

En tanke jeg hadde var å benytte seg av en bool variabel i klassen, som settes false når brukeren slipper knappen. Problemet er at dette ikke går så lenge while-løkken går ser det ut som.

 

Noen som har en bedre løsning?

Lenke til kommentar
Videoannonse
Annonse

bool mouse_down;
bool app_running = true;
void DoEvents()
{
 MSG msg;
 PeekMessage(NULL, &msg, 0, 0, PM_REMOVE)
 TranslateMessage(NULL, &msg);
 DispatchMessage(&msg);
}

HRESULT WndProc(HWND hWnd, int msg, WPARAM wParam, LPARAM lParam)
{

 switch(msg)
 {
   WM_RBUTTONDOWN:
   WM_LBUTTONDOWN:
     mouse_down = true;
     break;
   WM_RBUTTONUP:
   WM_LBUTTONUP:
     mouse_down = false;
     break;
   WM_CLOSING:
     app_running = false;
     PostQuitMessage();
   default:
     DefaultWndProc(hWnd, msg, wParam, lParam);
     break;
 }
}

void MyLoop()
{
 mouse_down = false;

 while(app_running)
 {
   DoEvents();
   while(mouse_down)
   {
     DoEvents();
   }    
 }
}

 

Satt på jobben når jeg skrev dette, så jeg vet ikke om det er riktig bruk av funksjoner, men tror det i teorien skal fungere.

Lenke til kommentar

Komplett eksempel som passer på at ikke resten av GUI'et ditt «låser seg» (hindres i å redrawes f.eks.) når loopen kjøres:

 

/*
 gcc `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0` -lpthread -Wall -g mouse-button.c -o mouse-button
*/

#include <stdio.h>
#include <gtk/gtk.h>
#include <pthread.h>


volatile char button_down = 0;
pthread_t background_thread;


void* theLoop(void* not_used)
{
 while(button_down) {
   printf("button is down!\n");
 }
 printf("..not anymore, so exited loop!\n");
 return 0;
} // theLoop


void destroy(GtkWidget* widget, gpointer data)
{
 gtk_main_quit ();
} // destroy


gboolean buttonPress(GtkWidget* widget, 
      GdkEventButton* event,
      gpointer data)
{
 button_down = 1;
 pthread_create(&background_thread, 0, theLoop, 0);  
 return FALSE;
} // buttonPress


gboolean buttonRelease(GtkWidget* widget, 
        GdkEventButton* event,
        gpointer data)
{
 button_down = 0;
 return FALSE;
} // buttonPress


int main(int argc, char** argv)
{
 gtk_init(&argc, &argv);
 GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 g_signal_connect(window,
    "delete_event",
    G_CALLBACK(destroy), 
    0);
 
 g_signal_connect(window,
    "button_press_event",
    G_CALLBACK(buttonPress),
    0);

 g_signal_connect(window,
    "button_release_event",
    G_CALLBACK(buttonRelease),
    0);

 gtk_widget_set_events(window, 
 	GDK_BUTTON_PRESS_MASK
 	| GDK_BUTTON_RELEASE_MASK);
 
 gtk_widget_show_all(window);
 gtk_main(); 
 return 0;     
} // main

 

Denne bruker GTK+ og Pthreads; begge biblioteker er tilgjengelige under Linux, Windows og sikkert andre.

 

Edit:

Kanskje noen skulle postet et eksempel i QT eller GTKMM (begge C++) også?

Endret av dayslepr
Lenke til kommentar
Noen som ratt har et eksempel på hvordan dette er mulig å få til i Visual C++ også??

5419756[/snapback]

 

jupp, som zirener sier; dette fungerer v.h.a. VC++ også .. både Pthreads og GTK+ er portable biblioteker

 

(men hvem vil vel bruke VC++ (frivillig)? .. GCC (som så klart også finnes til Windows) er jo «Godmode» i forhold; hah! \o/ )

Endret av dayslepr
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...