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;
}
}
}
Funziona bene senza problemi descritti quando viene compilato utilizzando Visual Studio 2010 C++, su Windows – maximus
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. –
Vedi anche questo post stackoverflow. http://stackoverflow.com/questions/4272506/sdl-mouse-position-cropped-after-resize –