2009-10-07 21 views
6

Uso Visual Studio 2008, tengo el archivo PNG cargado en la Vista de Recursos, lo asigné IDB_BANG_PNG.Programando Programar un PNG a Picture Control en Win32 APIs

El control de imagen se llama IDC_STATIC15.

Tengo problemas para cargar PNG en el control de imagen.

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

// Way of loading a bmp with a mask perhaps? Or a PNG file programatically? 

static HBRUSH hBrushStatic; 
HBITMAP hBmp = LoadBitmap(hDlg,MAKEINTRESOURCE(IDB_BANG_PNG)); 

switch(message) 
{ 
case WM_INITDIALOG:  
    CheckDlgButton(hDlg, IDC_CHECK, FALSE); 
    EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
    // Bitmap version is IDB_BANG, PNG is at IDB_BANG_PNG 
    // IDC_STATIC15 is the picture frame 
    HWND item = GetDlgItem(hDlg,IDC_STATIC15); 
    SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 
    return TRUE; 

// .... snip 

estoy bastante ingenuo cuando se trata de desarrollo Win32/GUI, haciendo un proyecto rápido y le quedó atascado, cualquier ayuda se agradece.

+0

Necesita un archivo de mapa de bits. Desea convertir una imagen PNG en una imagen BMP. – anno

+0

He leído que puede soportar PNG pero tiene que hacerlo programáticamente. Cuando agrego imágenes, usando el filtro de imagen hte, * .png es uno de los elementos enumerados. –

+0

El problema es que me gusta mantener el fondo transparente, por eso quiero usar PNG. A menos que pueda crear una máscara usando BMP o permitir que el archivo ICO use el ícono de mayor tamaño en lugar de 32x32. –

Respuesta

0

Personalmente, uso la clase CPictureEx. Creo que no es compatible con png, pero bmp, jpeg y gif animado.

También uso Cairo gráficos para renderizado especial. Cairo admite el formato png.
Por supuesto, el Cairo es un poco más difícil de usar.

+0

Este proyecto en el que estoy trabajando está en C, no en C++. Las clases, CImage, MFC, etc. no serán posibles y no se compilarán. ¿Cómo uso paint the bmp en un control de imagen, en un diálogo en tiempo de ejecución? –

4

Esto funciona mediante GDI+ y la bitmap class:

Bitmap oBmp(L"D:\\test.png"); 
HBITMAP hBmp; 
oBmp.GetHBITMAP(0, &hBmp); 
SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 

cierto control caveats.Your necesita un estilo SS_BITMAP. No olvide incluir gdiplus.hy su biblioteca. Necesita inicializar (GdiplusStartup) y apagar GDI +. Liberar todos los recursos del sistema está en usted.

0

¿Ha comprobado la biblioteca DevIL/OpenIL? Sigue el estilo de nomenclatura de funciones de OpenGL y está escrito en el buen ol C.

He utilizado en el pasado, con éxito. También es muy portátil.

Échale un vistazo aquí: http://openil.sourceforge.net/features.php

2

no creo LoadBitmap o cualquier otra función GDI simple (tales como LoadImage) se carga un archivo PNG.

Puede guardar su recurso en una BMP de 32 bits con una herramienta de edición de imágenes y luego usar LoadImage con LR_CREATEDIBSECTION.

O puede utilizar una biblioteca que cargará el archivo PNG en una DIBSECTION. GDI + cargará PNG y JPG además de BMP.

Las bibliotecas de automatización OLE también tienen una interfaz IPicture que puede crear instancias con varios tipos de imágenes y luego obtener la DIBSECTION subyacente. Es incómodo de usar, especialmente si no está familiarizado con COM. Ver OleLoadPicture para un punto de partida.

Cuestiones relacionadas