2012-05-14 3 views
5

Di seguito è riportato un codice semplificato che illustra il problema riscontrato.non è in grado di recuperare correttamente le coordinate del mouse dopo il ridimensionamento di una finestra

Lo scopo del codice è creare una finestra 512x512 e modificare la dimensione Y della sua superficie di livello superiore a 512x (512 + 25) quando viene rilevato un clic sinistro. Quando viene rilevato un altro clic sinistro, riportiamo le dimensioni a 512x512.

Quando viene rilevato un evento clic sinistro o quando viene rilevato un mouseMotionEvent, viene visualizzata (con printf()) la coordinata del mouse.

Strano comportamento osservato:

Quando eseguo il codice, ho lasciato fare clic su una volta, la dimensione Y della finestra cambia, ma quando mi muovo il mouse all'interno della zona creata da poco, le coordinate y visualizzate è bloccato a 511.

A volte non ottengo questo strano comportamento, quindi la coordinata Y può essere più grande di 511. Per ottenere lo strano comportamento, fare clic più volte a sinistra, spostando rapidamente il mouse.

Per compilare (linux):

$ gcc -o test test.c `sdl-config --cflags --libs` 

Fonte: (test.c)

#include <stdlib.h> 
#include <stdio.h> 
#include <SDL.h> 

/* Prototypes */ 
void event_handler(void); 

/* global variables declaration */ 
SDL_Surface *screen=NULL; 


/***** MAIN FUNCTION *****/ 
int main(int argc, char** argv) 
{ 
    /* init SDL */ 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
     fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError()); 
     exit(EXIT_FAILURE); 
    } 

    if ((screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE)) == NULL) { 
     fprintf(stderr, "Graphic mode could not be correctly initialized : %s\n",  SDL_GetError()); 
     exit(EXIT_FAILURE); 
    } 
    SDL_WM_SetCaption("my window", NULL); 

    /* handle event & wait until quit_event is raised */ 
    event_handler();  

    /* quit & return */ 
    SDL_Quit(); 
    return EXIT_SUCCESS; 
} 


/*** Event handler ***/ 
void event_handler(void) 
{ 
    SDL_Event event; 
    int quit=0; 
    char message_is_displayed=0; 
    SDL_Rect mess_coord = {0,512,512,512+25}; //{x_start,y_start,width,height} 

    while(!quit) 
    { 
     SDL_WaitEvent(&event); 
     switch(event.type) 
     { 
      case SDL_QUIT: 
       quit = 1; 
       break; 

      case SDL_MOUSEBUTTONDOWN: 
       if (event.button.button == SDL_BUTTON_LEFT) 
       { 
        if(!message_is_displayed) 
        { 
         screen = SDL_SetVideoMode(512,512+25, 32, SDL_SWSURFACE); //change the screen size 
         SDL_FillRect(screen, &mess_coord, SDL_MapRGB(screen->format, 255, 255, 255)); // fill in white the bottom area 
        } 
        else 
        { 
         screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE); 
        } 
        message_is_displayed = !message_is_displayed; 
        SDL_Flip(screen); 
       } 
       printf("mouse position: (%d,%d)\n",event.button.x, event.button.y); 
       break; 

      case SDL_MOUSEMOTION: 
       printf("mouse position: (%d,%d)\n",event.motion.x, event.motion.y); 
       break; 
     } 
    } 
} 
+1

Funziona bene senza problemi descritti quando viene compilato utilizzando Visual Studio 2010 C++, su Windows – maximus

+1

Si dice che si fa clic con il mouse più volte mentre si sposta rapidamente il mouse. Mi chiedo se stai perdendo gli eventi del mouse a causa di una modifica della dimensione della finestra e i clic del mouse si trovano al di fuori dell'area della finestra momentaneamente o che alcuni eventi del mouse vengono rimossi dalla coda dei messaggi mentre altri vengono inseriti. Il comportamento che stai descrivendo sembra molto situazionale a causa di una condizione di competizione tra diversi strati della SDL e della tua applicazione. –

+0

Vedi anche questo post stackoverflow. http://stackoverflow.com/questions/4272506/sdl-mouse-position-cropped-after-resize –

risposta

0

È possibile provare le seguenti funzioni per ottenere coordinate X e Y nelle variabili OldX e oldy come

int oldx,oldy;  
oldx=wherex(); 
oldy=wherey(); 

funziona in Windows.

0

Se stai usando SDL1, penso che si shoud aggiunge questo al codice:

int x, y; 
SDL_GetMouseState(&x, &y); 

Ora la posizione del mouse è a x e y.

0

Non appena si preme il pulsante del mouse, viene ridimensionato e quindi viene stampata la posizione del pulsante. Probabilmente sta ritagliando la posizione del mouse dopo che la finestra è stata ritagliata.

Provare a ridimensionare la finestra solo su SDL_MOUSEBUTTONUP. In questo modo si stampa la posizione corrente quando il mouse viene cliccato veramente (SDL_MOUSEBUTTONDOWN) e poi ridimensionato dopo che è stato rilasciato.

Problemi correlati