elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Consulta] SDL2 arreglar movimiento de ventana con click
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [Consulta] SDL2 arreglar movimiento de ventana con click  (Leído 3,978 veces)
BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: [Consulta] SDL2 arreglar movimiento de ventana con click
« Respuesta #10 en: 23 Febrero 2019, 23:43 pm »

Al final funcionó a la manera de CalgaryCorpus. Claro al no hacer un else seguía detectando el evento de pulsado e interfería al mover con el ratón pulsado.

De hecho no, el "area no cliente" son los bordes, botones minimizar, maximizar y cerrar de la ventana del escritorio real, lo que yo quiero realizar es lo mismo que hace el "area no cliente" en el "area cliente". Si te fijás otra vez el gif sigue idéntico el comportamiento aún con las modificaciones de @CalgaryCorpus...

Imágen de internet de referencia:



B#


« Última modificación: 23 Febrero 2019, 23:45 pm por BloodSharp » En línea



srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: [Consulta] SDL2 arreglar movimiento de ventana con click
« Respuesta #11 en: 24 Febrero 2019, 00:03 am »

Vale, pensaba que querías corregir el salto molesto ese que en el último gif ya no se apreciaba.

Bueno, como no tengo nada que hacer es posible que haga una prueba en una máquinita virtual que tengo con un Ubuntu con gnome. Ya te cuento entonces,


En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: [Consulta] SDL2 arreglar movimiento de ventana con click
« Respuesta #12 en: 24 Febrero 2019, 19:25 pm »

Bueno, fallo, fallo no se puede considerar que sea. Mi conclusión es que debes hacerlo de otra forma, ya que el problema radica cuando el puntero del ratón queda fuera de la ventana y se pierde el foco. Entonces en ese momento para forzar la recuperación del foco usas SDL_CaptureMouse() y ésto permite que los eventos del ratón se puedan seguir capturando fuera de la ventana. Esa parte es la responsable del comportamiento errático del arrastre. Yo conseguí reducirlo un poco, pero ocasionalmente me daba ese salto por ejemplo al pasar el cursor cuando salía del marco por encima del borde de la ventana de la terminal.



Código
  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3.  
  4. #define SCREEN_WIDTH 640
  5. #define SCREEN_HEIGHT 200
  6.  
  7. static bool salida = false;
  8.  
  9. int main(int argc, char* args[]) {
  10.    SDL_Window* window = NULL;
  11.    SDL_Surface* screenSurface = NULL;
  12.    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
  13.        fprintf(stderr, "could not initialize sdl2: %s\n", SDL_GetError());
  14.        return 1;
  15.    }
  16.    window = SDL_CreateWindow(
  17.    "hello_sdl2",
  18.    SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
  19.    SCREEN_WIDTH, SCREEN_HEIGHT,
  20.    SDL_WINDOW_SHOWN);
  21.  
  22.    if (window == NULL) {
  23.        fprintf(stderr, "could not create window: %s\n", SDL_GetError());
  24.        return 1;
  25.    }
  26.    screenSurface = SDL_GetWindowSurface(window);
  27.    SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
  28.    SDL_UpdateWindowSurface(window);
  29.  
  30.    int xPos,yPos,xMPosN,yMPosN;
  31.    static bool bMouseClicked=false, bMouseMoving=false;
  32.    static int xMPos=0,yMPos=0;
  33.    char buffer [50];
  34.    while(!salida){
  35.  
  36.        SDL_Event event;
  37.        while( SDL_PollEvent(&event) ) {
  38.  
  39.            switch(event.type ){
  40.  
  41.                case SDL_MOUSEBUTTONDOWN:
  42.                    if(event.button.button == SDL_BUTTON_LEFT){
  43.                        if (!bMouseClicked) {
  44.                            bMouseClicked=true;
  45.                            SDL_GetMouseState(&xMPos,&yMPos);
  46.                            SDL_GetWindowPosition(window,&xPos,&yPos);
  47.                        }
  48.                    }
  49.  
  50.                break;
  51.                case SDL_MOUSEBUTTONUP:
  52.                    if (bMouseClicked) { // Impedimos que entre varias veces
  53.                        if(event.button.button == SDL_BUTTON_LEFT){
  54.                            bMouseClicked=false;
  55.                            SDL_CaptureMouse(SDL_FALSE);
  56.                        }
  57.                    }
  58.  
  59.                break;
  60.                case SDL_MOUSEMOTION:
  61.  
  62.                    if(bMouseClicked) bMouseMoving = true;
  63.                break;
  64.                case SDL_QUIT:
  65.                    salida = true;
  66.            } // fin switch
  67.  
  68.        } // fin loop de eventos
  69.  
  70.        // renderizamos o dibujamos
  71.        if(bMouseClicked && bMouseMoving){
  72.            SDL_CaptureMouse(SDL_TRUE); // Se desabilita al perder el foco
  73.            SDL_GetMouseState(&xMPosN,&yMPosN);
  74.            xPos-=(xMPos-xMPosN);
  75.            yPos-=(yMPos-yMPosN);
  76.            SDL_SetWindowPosition(window,xPos,yPos);
  77.        }
  78.        sprintf (buffer, "xM=%d yM=%d / xW=%d yW=%d / xCM=%d yCM=%d", xMPosN, yMPosN, xPos, yPos, xMPos, yMPos);
  79.        SDL_SetWindowTitle(window,buffer);
  80.        bMouseMoving = false;
  81.        SDL_Delay(10);
  82.    }
  83.    //SDL_CaptureMouse(SDL_FALSE);
  84.    SDL_DestroyWindow(window);
  85.    SDL_Quit();
  86.    return 0;
  87. }
« Última modificación: 24 Febrero 2019, 20:58 pm por srWhiteSkull » En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: [Consulta] SDL2 arreglar movimiento de ventana con click
« Respuesta #13 en: 24 Febrero 2019, 21:01 pm »

(...)Yo conseguí reducirlo un poco, pero ocasionalmente me daba ese salto por ejemplo al pasar el cursos cuando salía del marco por encima del borde de la ventana de la terminal.

¿Un poco? Quedó igual de perfecto que con WinAPI.

¡Gracias por la ayuda! ;-) ;-)  ;-) :-[


Tema solucionado.


B#
En línea



Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consulta ScreenShot de una ventana web
Java
Pablo Videla 1 2,673 Último mensaje 9 Noviembre 2011, 22:27 pm
por Pablo Videla
Cerrar ventana popup o float al hacer click en su contenido
Desarrollo Web
maximilion69 7 12,998 Último mensaje 23 Junio 2012, 03:50 am
por ©rIsT0BÄl
Enviar click a ventana externa (de forma especial)
.NET (C#, VB.NET, ASP)
TomaSs 0 1,517 Último mensaje 25 Enero 2014, 14:04 pm
por TomaSs
[Consulta]Sensor de movimiento a pc?
Juegos y Consolas
vojok 1 2,139 Último mensaje 28 Diciembre 2015, 00:06 am
por robertofd1995
Hola mundo en SDL2
Programación C/C++
aguaenSDL 6 4,589 Último mensaje 14 Enero 2016, 16:15 pm
por 0xFer
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines