La Web del Programador: Comunidad de Programadores
 
    Pregunta:  22562 - BITMAP DESDE UN RECURSO EN VISUAL C++
Autor:  Maria Encarnacion Navarro Gomez
Hola a todos,
Estoy intentando pegar un Bitmap a un documento para luego imprimirlo, el documento esta creado y ya funciona pero intento insertar el bitmap y me da errores. La implementacion que utilizo es la siguiente:

void PrintBitmap (CDC* pDC)
{
CDC* pDisplayMemDC = new CDC;
Cbitmap* pBitmap = new Cbitmap;
PBitmap->LoadBitmap(IDB_LEAVES);
PDisplayMemDC->CreateCompatibleDC(pDC);
Cbitmap* pOldBitmap = (Cbitmap*)
PDisplayMemDC->SelectObject (pBitmap);
PDC-> BitBlt (100,100,200,150, pDisplayMemDC, 0, 0, SRCCOPY);
Delete pDisplayMemDC->SelectObject (pOldBitmap);
Delete pDisplayMemDC;
}

En todo el documento trabajo con el manejador tipo HDC y en este caso trabajo con la clase CDC, no se como arreglarlo. Al compilar me dice que CDC, Cbitmap, etc. no existe.
Muchas gracias.
Mari


  Respuesta:  Alvaro Salvatierra Salas
Hola Mari
Te indico el código necesario para insertar un mapa de bits en el área cliente de una aplicación Visual C, como respuesta a un click en el menu

1.- el proyecto consta de 4 archivos: bitmap.h , resource.h , bitmap.rc y bitmap.cpp

2.- lineas a agregar en bitmap.rc ( se supone que está definido un recurso MENU):
MENUITEM "Insertar Bitmap" IDM_INSBM
IDR_BM1 BITMAP "C:\\MISDOC\\ARCHIVO.BMP"

3.- incluir esta linea en resource.h
#define IDM_INSBM 103 // u otro numero vacante

4.- en archivo bitmap.h, donde se definen las clases ,agregar las siguientes lineas en la definición de clase de ventana CMainWin:
CBitmap m_bm1;
afx_msg void OnInsertBM() // manejador de mensaje

5.- en archivo bitmap.cpp incluir:
#include <afxwin.h> // para usar clases MFC: CDC, CBitmap, etc
#include "bitmap.h"
#include "resource.h"
ON_COMMAND (IDM_INSBM , OnInsertBM) // esta linea dentro del mapa de mensajes.
afx_msg void CMainWin::OnInsertBM() // def. de funcion
{
m_bm1.LoadBitmap(" IDR_BM1") ;
CClientDC DC(this);
CDC memDC ;
memDC. CreateCompatibleDC ( &DC) ;
memDC. SelectObject ( & m_bm1) ;
DC. BitBlt ( 10 , 10, 64 , 64 , &memDC , 0 , 0 , SRCCOPY );
}

(Nota: El contenido de la ventana se pierde al minimizar y restaurar la ventana. Para solucionar eso se debe usar ventana virtual y copiarla a la ventana física cada vez que se reciba mensaje WM_PAINT )
Espero que el ejemplo te sea de utilidad.
Saludos.