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