Como cargar JPG, GIF, BMP en dialogos MFC

Presentacion

Los pocos amantes de Visual C, Watcom C++, Dev C++, pero no C++ Builder, mientras van adquiriendo conocimientos y desarrollándose, a medio camino surge un problema denominado : "El Trance JPG", pues a diferencia de C++ Builder o Delphi VC++ no tiene controles que hagan el trabajo de cargar JPG, GIF, o cualquier otro formato comprimido de imágenes.

IMG01.jpg
Aplicación finalizada ejecutándose


Para esos sufridos amantes de C++ les presentamos un DLL con todo ese trabajo hecho sin mas que usar, ademas de ser portable para cualquier compilador Win32 para C++, aquí un ejemplo de como usar dicha DLL.
mlStuffsPk.dll

esta primera versión carga JPG, GIF, DIB, PCX, BMP ademas tiene integrado un práctico OpenDialog, mejoradito a comparación de CFileDialog, que es bastante rústico.
Como usarla

Pues bien aquí algo de source code mostrando este caso.

Cargar un JPG, GIF



Code: Seleccionar todo
  1. void CDlgMLImgCtrl::OnLoadJpg( )

  2. {

  3.     CString     csFileName = mlOpenDialog( m_hWnd,

  4.                 "Jpg   (*.jpg)"

  5.                 "*.jpg"

  6.                 "Jpeg  (*.jpeg)"

  7.                 "*.jpeg"

  8.                 "All Formats"

  9.                 "*.*" );

  10.  

  11.     if( ! csFileName.IsEmpty( ) )

  12.     {

  13.         // Puedo Asignar Directamente...

  14.         // mCtrlImage.SetBitmap( mlLoadJPG( csFileName ) );

  15.         // Ahora se puede usar.

  16.  

  17.         // O Puedo Salvarlo en un CBitmap

  18.         // para poder manipularlo a mi antojo

  19.         // claro que no me gusta, pues te complicas...

  20.  

  21.         HBITMAP    hBmp = mlLoadJPG( csFileName ); // "Image.jpg";

  22.         mBmpImage.Attach( hBmp );

  23.  

  24.         mCtrlImage.SetBitmap( mBmpImage );

  25.     }

  26. };

  27.  



Ahora para Bitmaps.



Code: Seleccionar todo
  1. void CDlgMLImgCtrl::OnLoadBmp( )

  2. {

  3.     CString     csFileName =     mlOpenDialog( m_hWnd,

  4.                     "Bitmaps (*.bmp)"

  5.                     "*.BMP"

  6.                     "All Formats"

  7.                     "*.*" );

  8.  

  9.     if( ! csFileName.IsEmpty( ) )

  10.     {

  11.         // Salvamos el HBITMAP que retorna en uno temporal.

  12.         // la DLL se encarga de que HBITMAP no se destruya

  13.         // asi evitamos tener que estar salvando HBITMAP

  14.         // cada vez que llamemos a 'mlLoadBitmap( ... )'

  15.  

  16.         HBITMAP    hBmp = mlLoadBitmap( csFileName );

  17.         mCtrlImage.SetBitmap( hBmp ); // Ahora se puede usar.

  18.  

  19.         // si deseas usar le HBITMAP salvalo en un CBitmap

  20.         // no temporal, sino en la Clase.

  21.     }

  22. };




Antes : es necesario entrar a Project, Settings, y colocal mlStuffsPk.lib para el enlace con las funciones de la DLL, luego en el Cpp de ceclara los siguientes prototipos de funciones externas.

Code: Seleccionar todo
  1. //const char * WINAPI mlOpenDialog( HWND hWndOwn, const char* lpsFilter,

  2. //const char *lpsTitle="MicroLogic - Search File" );

  3. extern  LPCSTR  WINAPI  mlOpenDialog( HWND hWndOwn,

  4.             LPCSTR lpsFilter , LPCSTR lpsTitle="MicroLogic - Search File" );

  5. extern  HBITMAP WINAPI  mlLoadBitmap( const char *  );

  6. extern  HBITMAP WINAPI  mlLoadJPG( const char * );

  7.  

  8. // No olvides que LPCSTR, LPCTSTR son typedef

  9. // de nuestro viejo amigo (const char *)

  10. // por ello hacer ? es igual a :

  11. //

  12. //        LPCTSTR = (const char *)

  13. //        LPCSTR  = (const char *)

  14. //        LPSTR   = (char *)    

  15. //



Con eso basta. por cierto antes de olvidarlo, este sample te muestra tambien como usar mlOpenDialog( ... ) el que conccias por este que esta bestial.

NOTA : sobre XP, NT, muestra este cuadro, pero sobre Win9x, WinMe es el conocido y mugre dialogo.

IMG02.jpg
Selección de imágenes para visualizar


Notas de Interés

Debo Aclarar que no hay truco, en verdad carga un JPG, pero para masticarlo mejor lo devuelve en un HBITMAP, de modo que se facilita las cosas, asi ya no tendremos que pelearnos con el HDC, HRGN, BITMAPINFOHEADER, BITMAPDIBSECTION, entre otras complicadas rutinas, pues la DLL lo hace todo. y para demostrar que no miento aqui una imagen mostrando el dialogo y el STATIC en tiempo de diseño. eso aclara que no estoy usando ningún control prediseñado

Proximamente otro ejemplo un CtrlImage, que tenga Strech, Load, Save, Clear y demas bondades de otros controles decentes.

IMG03.jpg
Vista diseño del formulario MFC


Now : the first trouble is the compatibilty with others sources, the linker send a error like ( missing "stdafx.h" ), well really stdafx.h is not important only may choose other file, other file like "globals.h" or "general.h", here put the global specifications, you can see something like I sayd in the example of this source code. download now.

Acotaciones


MicroLogic©Software - Recomendations : Los programas que se otorgan pueden ser libremente copiados, cualquier consulta o duda con los programa o sobre C++ Builder, haganozla saber a nuestro correo micrologic_software@yahoo.es

MicroLogic©Software - Trabaja como parte integrante de F.I.L.I.C.C - (Fundacion para la Investigación de Lenguajes Informáticos y Ciencias de la Computación) Todo el Codigo es revisado y evaluado por F.I.L.I.C.C. Buscalos en la red en http://www.filicc.pe.kz
Tags: MFC,graficos

Archivos Adjuntos

Otros Artículos en esta sección

  • Datacombo para Visual C++
    Una clase que visualiza el resultado de una consulta SQL en un cuadro combinado (CCombobox) utilizando una conexion DAO.
    Por: ivancp, 2004-03-14
  • Uso de CListCtrl y DAO
    na forma de utilizar el control ActiveX MSFlexGrid en aplicaciones Visual C++ basadas en MFC, este control es útil para visualizar datos.
    Por: MicroLogic©Software, 2005-04-20
  • Graficador de Funciones 2D y 3D
    He aquí un programa que grafica todo tipo de funciones gracias a su interprete que utiliza un Analizador Léxico, Analizador Sintáctico, y un Analizador semántico.
    Por: Lizardo, 2004-03-14
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »