|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - zeroz
Páginas: [1]
1
« en: Viernes 27 de Junio de 2008, 10:35 »
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: 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); }
2
« en: Lunes 9 de Junio de 2008, 11:39 »
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? 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;
Páginas: [1]
|
|
|