Problema con el GDI

30/01/2004 - 03:16 por Juan Antonio | Informe spam
Hola de nuevo grupo,

Comento un poco lo que que quiero hacer:

tengo una aplicación que hace un seguimiento de un tren
en una maqueta. cuando pulso un boton del menu empiezo a
recibir se ejecuta una funcion muchas veces por segundo
gracias a un timer, consiguiendo imagenes de una webcam,
y de estas imagenes mediante un algoritmo saco las
coordenadas de la locomotora.

necesito crear una ventana dentro del area cliente donde
visualiazar un archivo bmp que es como un mapa de las
vias, y a continuación dibujar un punto con las
coordenadas.

proceso que quiero hacer:

1-> al pulsar el boton de comenzar, quiero crear la
ventana en la que visualizo el bmp y dibujo el punto.
tambien debo cargar el bmp en memoria en un hbitmap
porque el acceso a .bmp es lento y necesito rapidez.

2->al pulsar el boton anterior se ejecuta una funcion
varias veces por segundo mediante un timer. en esta
función quiero actualizar el bmp(para eliminar el punto
de la llamada anterior) y pintar el punto en las
coordenadas obtenidas.

3->al pulsar el boton de terminar eliminar la ventana
creada.

1 y 3 me funcionan bien, el problema lo tengo en 2 creo.
voy a explicar lo k hago en cada paso.

//********************1***************************

asi creo la ventana:

void CreateWindowResultado (void)

{

WNDCLASS WndClass;

WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc =(WNDPROC)MainWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH) (COLOR_BTNFACE
+ 1);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstanceGlobal;
WndClass.lpszClassName = "DESTINE_CLASE";
WndClass.lpszMenuName = NULL;

//se registra la clase
RegisterClass(&WndClass);

//se crea la ventana
hWndResultado = CreateWindow(

"DESTINE_CLASE",

"",

WS_POPUPWINDOW|WS_VISIBLE,

4,

309,

322,

242,

hwnd,

NULL,

hInstanceGlobal,>variable global

NULL

);



}

asi cargo el bmp:

hBitmapMapa = (HBITMAP)LoadImage
(hInstanceGlobal,"patronviafinal164.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

hBitmapMapa lo tengo como variable global


//********************2***************************

asi actualizo el bmp:

se ejecuta con cada iteracion del timer

void UpdateWndResultado (void)

{

HDC hDc = NULL;
HDC Compatible = NULL;

HBITMAP old_hBitmap = NULL;
HBITMAP hBitmapMapaCopia = NULL;

//se copia el original(variable global) en la
copia

hBitmapMapaCopia = hBitmapMapa;

//se obtiene un DC de la ventana de resultado

hDc = GetDC( hWndResultado );

//se crea uno compatible con el anterior

Compatible = CreateCompatibleDC(hDc);

//se selecciona el último

old_hBitmap = (HBITMAP)SelectObject( Compatible,
hBitmapMapaCopia);

//se actualiza la ventana
BitBlt(hDc,0,0,320,240,Compatible,0,0,SRCCOPY);

//liberan objetos y DCs

SelectObject(Compatible,old_hBitmap);

DeleteObject(hBitmapMapaCopia);

ReleaseDC(hWndResultado, hDc);

DeleteDC(Compatible);


}




y ahora como dibujo el punto:

se realiza con cada iteracion del timer

HDC hDC;
PAINTSTRUCT ps;
HBRUSH hBrush, hOldBrush;
hDC = BeginPaint(hWndResultado, &ps);
hBrush = CreateSolidBrush(RGB(240,0,0));
hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
Ellipse(hDC, 10, 10, 20, 20);
SelectObject(hDC, hOldBrush);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);

en principio las coordenadas estan puestas fijas para
probar.


con el 3 no hay problemas un DestroyWindow y listo.



*****************problemas****************************

si pulso en comenzar aparece el .bmp en la ventana que he
creado, pero no me sale el punto rojo, y no es problema
de colores, son distintos, y si minimizo la aplicacion y
la restauro ya no me sale el bmp, entonces aparece el
punto rojo solo.


siento mucho el rollazo que he metido.

un saludo,
Juan Antonio.
 

Leer las respuestas

#1 Hernán
30/01/2004 - 04:58 | Informe spam
"Juan Antonio" escribía,

Hola de nuevo grupo,

Comento un poco lo que que quiero hacer:



[...]
2->al pulsar el boton anterior se ejecuta una funcion
varias veces por segundo mediante un timer. en esta
función quiero actualizar el bmp(para eliminar el punto
de la llamada anterior) y pintar el punto en las
coordenadas obtenidas.




este sería el timer:
InvalidateRect(..., TRUE) // rect del punto viejo
NuevaPosicionPunto()
InvalidateRect(..., TRUE) // rect del nuevo punto

este el erase background para el caso de que el mapa ocupe todo el fondo
del radar:
return (LRESULT)TRUE;

este es tu paint:
BeginPaint(..., &ps)
PintaMapa(ps.hdc, ...) // igual que UpdateWndResultado()
PintaPunto(ps.hdc, ...) // Ellipse(..., coord del nuevo punto)
EndPaint()

[...]

Hernán (27)
Quilmes (ar)

Preguntas similares