Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con WM_LBUTTONDOWN

Estas en el tema de Problema con WM_LBUTTONDOWN en el foro de C/C++ en Foros del Web. Hola a todos Mi problema es que quiero que se dibuje algo en la pantalla después de haberse generado un evento, tal como un click ...
  #1 (permalink)  
Antiguo 02/04/2007, 12:08
 
Fecha de Ingreso: abril-2007
Mensajes: 16
Antigüedad: 17 años, 1 mes
Puntos: 0
Problema con WM_LBUTTONDOWN

Hola a todos

Mi problema es que quiero que se dibuje algo en la pantalla después de haberse generado un evento, tal como un click de raton (WM_LBUTTONDOWN), en mi caso sería ,para que apareciera la ficha en la casilla correspondiente(de un tres en raya).Para ello declare una variable boolena llamada dibujar, usada como flag. Os adjunto el procedimiento de ventana de las casillas, que son 6 ventanas hijas de la principal(temporalmente, hasta que consiga dibujar las fichas)


Código:
LRESULT CALLBACK WndProc2 (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

HDC        hdc;
PAINTSTRUCT ps;
RECT rect;
static bool dibujar;
static HBRUSH pincel;

switch(iMsg)
    {
    case WM_LBUTTONDOWN:                       /*Si se pulsa el boton Iquierdo , Se deberia dibujar una ficha*/
         dibujar = TRUE;
        break;
       
    case WM_RBUTTONDOWN:                      //Si se pulsa el derecho, Aparecera un mensaje pra indicar al usuario 
         MessageBox(hwnd,"Accion no permitida","Error",MB_OK);                         // que no tiene accion definida
        break;
       
    case WM_PAINT:
        if (dibujar) {
        
           hdc = GetDC (hwnd);
           pincel = CreateSolidBrush(RGB(255,0,0));
           CreateRectRgn(10,10,10,10);
      
            ReleaseDC (hwnd, hdc);
            }
        break;
    }
    return DefWindowProc (hwnd, iMsg, wParam, lParam);   /*Procesamiento de mensajes por defecto*/   
}
  #2 (permalink)  
Antiguo 02/04/2007, 18:51
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Re: Problema con WM_LBUTTONDOWN

tu problema no es con WM_LBUTTONDOWN,
el problema es con WM_PAINT,
el poco tiempo que yo use la winapi, en el WM_PAINT tenia algo asi:

Código:
PAINTSTRUCT    ps;

// algun codigo....


case WM_PAINT:									BeginPaint(hWnd, &ps);				
EndPaint(hWnd, &ps);					
break;

// mas codigo....
los cuales son metodos de la winapi.
y ya luego en el MainLoop, checaba si habia algun mensaje asi:
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

si no habia, mandaba a llamar a mi funcion de dibujo, que es donde Yo pondria tu codigo para dibujar
Código:
if (dibujar) {
        
           // codigo...
            }
Tal vez existan varios metodos, pero ese es el que yo usaba y me funcionaba.

Lo que no estoy seguro, es si tu codigo para dibujar sea correcto ya que no recuerdo mucho de la sintaxis/metodos de la winapi..... ademas, me parece que la instruccion:
ReleaseDC (hwnd, hdc);
no deberia de ir ahi, si no cuando ya terminas el programa.

Si eso no resuelve tu problema, tal vez alguien que recuerde mejor esto te pueda ayudar...

saludos,
  #3 (permalink)  
Antiguo 02/04/2007, 19:26
 
Fecha de Ingreso: abril-2007
Mensajes: 16
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Problema con WM_LBUTTONDOWN

Gracias, me has ayudado en parte, Pero es que aun haciendolo como tu me dices, no soy capaz de que se dibuje cuando clico con el raton, mira como le he modificado.. ( una cosa, que es el MainLoop ?)

Código:
int dibuja=0; /*antes de esto declaro que lo uso como flag*/

switch(iMsg)
	{
	case WM_LBUTTONDOWN:                       /*Si se pulsa el derecho, se dibujara una cruz*/
              dibuja=1;                           
		break;
		
	case WM_RBUTTONDOWN:                      /*Si se pulsa el boton Iquierdo , no hace ninguna accion*/
	     MessageBox(hwnd,"Accion no permitida","Error Casilla1",MB_OK);
		break;
		
	case WM_PAINT:
	  hdc = BeginPaint(hwnd, &ps);
	  

   if(dibuja==1)
	  dibujaficharedonda(hdc);
                        
      EndPaint(hwnd, &ps);       
      
      
		break;
	}
	return DefWindowProc (hwnd, iMsg, wParam, lParam);		
}
la funcion dibuja ficha redonda si funciona, ya que la pruebo quitandole el bucle if, y si que se dibuja, pero lo que quiero hacer es que se dibuje solo cuando haga click.

Si me pudieras ayudar te lo agradeceria

Muchas Gracias , Un saludo, figal87
  #4 (permalink)  
Antiguo 02/04/2007, 20:26
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Re: Problema con WM_LBUTTONDOWN

es extraño.

Mi mainLoop es el nombre que le puse a mi funcion que hace esto:

Código:
while(1)
	{
		
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if(msg.message == WM_QUIT)
				break;
				
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
		      FuncionDeDibujo();	
                }

	}
Como es tu ciclo para detectar y trasladar los mensajes?
si presiones el boton derecho del mouse si te muestra el mensaje de texto?


EDIT: Creo que ya vi tu problema, y es que tienes que declarar tu flag dibuja como global, o como estatico. Ya que SUPONGO, que que si se dibuja el cuadro, pero es TAN rapido que no lo alcanzas a ver y se deja de dibujar ya que "dibuja" vuelve a ser 0 inmediatamente.
Prueba poniendo static int dibuja = 0;

saludos,

Última edición por blackwind; 02/04/2007 a las 20:32
  #5 (permalink)  
Antiguo 02/04/2007, 20:34
 
Fecha de Ingreso: abril-2007
Mensajes: 16
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Problema con WM_LBUTTONDOWN

hola de nuevo blackwind, gracias por tomarte tantas molestias.

Si pulso el botón derecho del ratón si que me muestra el cuadro de aviso que pongo en el código.

el bucle para tratar los mensajes que se producen es este

Código:
while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
    {
        /* Traducir mensajes de teclas a mensajes de acelerador */
        if(!TranslateAccelerator(hwnd, hAcelerador, &mensaje)) {
           TranslateMessage(&mensaje);
        }
        /* Enviar mensaje al procedimiento de ventana */
        DispatchMessage(&mensaje);
    }

    /* Salir con valor de retorno */
    return mensaje.wParam;
Gracias por todo otra vez

Edito: si es verdad la variable debe ser static int, pero aun asi no me funciona, sigue sin dibujarlo. arrrg

Última edición por figal87; 02/04/2007 a las 20:40
  #6 (permalink)  
Antiguo 02/04/2007, 20:47
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Re: Problema con WM_LBUTTONDOWN

que extraño.......
puedes postear todo tu codigo para probarlo........
  #7 (permalink)  
Antiguo 03/04/2007, 05:29
 
Fecha de Ingreso: abril-2007
Mensajes: 16
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Problema con WM_LBUTTONDOWN

edito:


SOLUCIONADO .

Me faltaba poner InvalidaRect(); en el Wm_LBUTTONDOWN, despues de cambiar el flag, para que repinte toda la region invalida, que si pongo NULL en el segundo parámetro será toda la ventana.

Muchas gracias por todo, y ya sabes si te hace falta algo en que te pueda ayudar , avisa

Un saludo desde España

Última edición por figal87; 03/04/2007 a las 05:45
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:45.