2009-11-17 29 views
9

He creado una ventana con createwindow() api usando VS2005 en C++ en Windows VistaCómo dibujar una imagen en una ventana?

Mi requisito es dibujar una imagen (de cualquier formato) en esa ventana. No estoy usando ningún equipo MFC en esta aplicación.

Ayúdeme con un fragmento de código.

+0

Es cuando hace clic en la pequeña marca de verificación junto a la respuesta que más le gusta;) – mpen

+1

gracias marca, lo he hecho a la respuesta a continuación. –

Respuesta

25

no estoy seguro de cuál es tu problema: dibuja un mapa de bits en el formulario, o si quieres saber cómo trabajar con varios formatos de imagen, o ambos. De todas formas a continuación es un ejemplo de cómo se puede cargar un mapa de bits y dibujarlo en la forma:

HBITMAP hBitmap = NULL; 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    int wmId, wmEvent; 

    switch (message) 
    { 
<...> 

    case WM_CREATE: 
     hBitmap = (HBITMAP)LoadImage(hInst, L"c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
     break; 
    case WM_PAINT: 
     PAINTSTRUCT  ps; 
     HDC    hdc; 
     BITMAP   bitmap; 
     HDC    hdcMem; 
     HGDIOBJ   oldBitmap; 

     hdc = BeginPaint(hWnd, &ps); 

     hdcMem = CreateCompatibleDC(hdc); 
     oldBitmap = SelectObject(hdcMem, hBitmap); 

     GetObject(hBitmap, sizeof(bitmap), &bitmap); 
     BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); 

     SelectObject(hdcMem, oldBitmap); 
     DeleteDC(hdcMem); 

     EndPaint(hWnd, &ps); 
     break; 
    case WM_DESTROY: 
     DeleteObject(hBitmap); 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

LoadImage carga un icono, cursor, cursor animado, o mapa de bits. Detalles here

Para trabajar con formatos diferentes imágenes puede usar Windows Imaging Component (ver IWICBitmapDecoder) o código de aquí Loading JPEG and GIF pictures o herramientas de 3 ª parte como FreeImage o LeadTools

esperanza que esta ayuda, que se refiere a

+0

Hola Serge, resolvió mi problema de dibujar la imagen en la ventana. gracias por la ayuda. pero como esto solo requiere archivos bmp, cur y ico, necesito trabajar en la conversión de png a bmp y luego pasaré ese bmp a esta función –

+0

¿Alguien puede guiarme para poner una imagen png en la ventana sin usar ningún MFC –

+2

If Puedo ahorrarle a alguien unos minutos de búsqueda, traté de usar esta respuesta, pero no funcionó. Después de un rato de hurgar intenté cambiar el tamaño de (mapa de bits) a tamaño de (BITMAP) y el código funcionó. Estoy usando Visual Studio 2015 en Windows 10. Aquí está la línea completa: GetObject (hBitmap, sizeof (BITMAP), y mapa de bits); –

2
void LoadScreen(HWND hWnd) { 
    RECT rect; 
    HDC hdc = GetDC(hWnd); 
    HBRUSH brush = CreatePatternBrush((HBITMAP)LoadImage(NULL, L"file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)); 
    GetWindowRect(hWnd, &rect); 
    FillRect(hdc, &rect, brush); 
    DeleteObject(brush); 
    ReleaseDC(hWnd, hdc); 
} 
+1

Y el HDC filtrado que nunca se soltó al salir de la función? Reglas 101 de Windows GDI: si lo obtiene, libérelo; si lo creas, luego elimínalo. Hiciste esto correctamente con tu pincel (Crear/Eliminar), pero no lo hiciste con tu DC de cliente (Obtener/Liberar). – WhozCraig

+0

Ah, gracias :) Lo resolví. Acaba de agregar una línea antes de cerrar el corchete. ReleaseDC (hWnd, hdc); –

Cuestiones relacionadas