Domingo 22 de Diciembre de 2024, 04:06
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Programación de Videojuegos
»
Doble Buffer No Me Funciona
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Doble Buffer No Me Funciona (Leído 2434 veces)
zeroz
Nuevo Miembro
Mensajes: 2
Doble Buffer No Me Funciona
«
en:
Lunes 9 de Junio de 2008, 11:39 »
0
hola, estoy empezando con unos tutoriales del api de windows para luego adentrarme en las directx o winapi + c++, bueno pues en un ajercicio tengo que cargar una imagen y que siempre este en el centro aunque la pantalla cambie de tamaño, todo va bien menos el doble buffering que no consigo implementarlo, alguien sabe donde esta el error?
Código: Text
case WM_SIZE:
GetClientRect(hwnd, &coords);
InvalidateRect(hwnd, NULL, FALSE);
break;
case WM_PAINT:
hBitmap = (HBITMAP)LoadImage(NULL, fn, IMAGE_BITMAP, ancho, alto, LR_LOADFROMFILE); //carga el bmp desde el disco
if( hBitmap == NULL )
return FALSE;
xCenter = ((coords.right - coords.left)/2) - (bm.bmWidth/2);
yCenter = ((coords.bottom - coords.top)/2) - (bm.bmHeight/2);
hdc = BeginPaint( hwnd, &ps );
GetObject(hBitmap, sizeof(BITMAP), &bm);
memDC = CreateCompatibleDC(hdc);
hBitmapBuffer = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight);
hBitmapOld = SelectObject( memDC, hBitmapBuffer );
BitBlt( hdc, xCenter, yCenter, bm.bmWidth, bm.bmHeight, memDC, 0, 0, SRCCOPY );
SelectObject( memDC, hBitmapOld );
DeleteObject( hBitmap );
EndPaint( hwnd, &ps );
DeleteObject(memDC);
break;
Tweet
BlackWind
Miembro activo
Mensajes: 89
Re: Doble Buffer No Me Funciona
«
Respuesta #1 en:
Sábado 14 de Junio de 2008, 19:41 »
0
el error es que porque no estas implementando el double buffering en realidad.
Solo veo que llames una vez a tu funcion de dibujo (bitblt), pero no dibujas el backbuffer al frontbuffer, es decir, te hace falta otro llamado al bitblt con el nuevo buffer.
No tengo un buen manejo de la api de win32 (prefiero allegro o sdl jeje), pero recuerda que el double buffering consiste en crear 2 buffers:
Un "backbuffer" donde dibujaras ahi todo PRIMERO.
Y luego un front buffer, donde dibujaras todo lo del backbuffer.
Si quieres seguir con esto, te recomiendo ampliamente que entres a
www.gametutorials.com
, donde tambien tienen tutoriales de win32 enfocados al gamedev.
saludos,
zeroz
Nuevo Miembro
Mensajes: 2
Re: Doble Buffer No Me Funciona
«
Respuesta #2 en:
Viernes 27 de Junio de 2008, 10:35 »
0
Bueno, he avanzado bastante, creo que ya si que tengo implementado el doble buffer y paso la imagen a memoria y de memoria al DC de pantalla, bueno o eso es lo que intento porque aunque me muestra la imagen, no me la centra con el stretchblt en la funcion RepintarImagen(), y ademas cuando expando la ventana se ve en negro casi todo:
Código: Text
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
OPENFILENAME fname;
char filename[64];
static RECT rect;
switch(message) {
case WM_SIZE:
{
GetClientRect(hwnd, &rect);
coords.cx = LOWORD(lParam);
coords.cy = HIWORD(lParam);
if(hBitmap){
if (memDC) {
SelectObject(memDC, memBitmapOld);
DeleteObject(memBitmap);
DeleteDC(memDC);
}
tempDC = GetDC(hwnd);
memDC = CreateCompatibleDC(tempDC);
memBitmap = CreateCompatibleBitmap(tempDC, coords.cx, coords.cy);
SelectObject(memDC, memBitmap); //si pongo hbitmap la pantalla no se pone negra
ReleaseDC(hwnd, hdc);
RepintarImagen(hwnd);
}
break;
}
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
BitBlt(hdc, 0, 0, coords.cx, coords.cy, memDC, rect.left , rect.top, SRCCOPY); //@@@ mejorar repintando solo el area invalidada
EndPaint(hwnd, &ps);
break;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDM_OPEN:
memset(&fname, 0, sizeof(OPENFILENAME));
fname.lStructSize = sizeof(OPENFILENAME);
fname.hwndOwner = hwnd;
fname.lpstrFilter = ("Bitmap Files (*.bmp) *.bmp ");
fname.nFilterIndex = 1;
fname.lpstrFile = fn;
fname.nMaxFile = sizeof(fn);
fname.lpstrFileTitle = filename;
fname.nMaxFileTitle = sizeof(filename)-1;
fname.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(!GetOpenFileName(&fname))
break;
hBitmap = (HBITMAP)LoadImage(NULL, fn, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(hBitmap, sizeof(BITMAP), &bm);
RECT rect;
GetClientRect(hwnd, &rect);
hdc = GetDC(hwnd);
memDC = CreateCompatibleDC(hdc);
SelectObject(memDC, hBitmap);
ReleaseDC(hwnd, hdc);
RepintarImagen(hwnd);
InvalidateRect(hwnd, &rect, TRUE);
break;
}
break;
/*
case WM_ERASEBKGND:
return 1; */
case WM_DESTROY: //terminar el programa
if (memDC) {
SelectObject(memDC, memBitmapOld);
DeleteObject(memBitmap);
DeleteDC(memDC);
}
if (hBitmap)
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
/******************************************************************************
Método: RepintarImagen
Función: Actualiza el memDC con la imagen cargada, teniendo en cuenta que la imagen
debe estar centrada en la ventana.
Tambien se tiene en cuenta el scroll y el zoom.
******************************************************************************/
void RepintarImagen(HWND hwnd){
HDC tempDC;
HBITMAP tempBitmapOrig;
if((bm.bmWidth > (coords.cx)) && (bm.bmHeight > (coords.cy))){
xCenter = (bm.bmWidth/2) - (coords.cx/2);
yCenter = (bm.bmHeight/2) - (coords.cy/2);
}else{
xCenter = (coords.cx/2) - (bm.bmWidth/2);
yCenter = (coords.cy/2) - (bm.bmHeight/2);
}
tempDC = GetDC(hwnd);
tempBitmapOrig = SelectObject(tempDC, hBitmap);
StretchBlt(memDC, xCenter, yCenter, coords.cx, coords.cy, tempDC, 0,0, coords.cx, coords.cy,SRCCOPY);
SelectObject(tempDC, tempBitmapOrig);
ReleaseDC(hwnd,tempDC);
}
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Programación de Videojuegos
»
Doble Buffer No Me Funciona