Newsgroup: it.comp.lang.c++
Titolo: Caricare immagini con MFC

Ciao a tutti,
e' la prima volta che posto in questo NG.
Volevo qualche informazione sulle MFC.
-Come si caricano immagini .BMP da disco?
-Esistono delle librerie free per caricare GIF e JPG?
Ho gia provato ad utilizzare l'esempio che si trova sull'MSDN sul
LoadBitmap, pero' proprio la funzione LoadBitmap mi da' questo errore
in compilazione
error C2440: '=' : cannot convert from 'void *' to 'struct HBITMAP__
*'   Conversion from 'void*' to pointer to non-'void' requires an
explicit cast 
Vi ringrazio in anticipo
Davide

...
la LoadBitmap carica i bitmap ma solo dalle risorse. E poi come si fa
a dirti dove sbagli senza vedere il codice ? :)
Gianpaolo Bottin
- Live Long and Prosper -

Ecco il codice necessario per caricare una bitmap da disco tramite le
MFC.
bool MyCBitmap::Create(LPTSTR szFileName)
{
	HBITMAP
phBitmap=(HBITMAP)LoadImage(NULL,szFileName,IMAGE_BITMAP,0,0,
						LR_CREATEDIBSECTION | 
						LR_DEFAULTSIZE | 
						LR_LOADFROMFILE );
	if(phBitmap==NULL)
		return false;
	else 
		this->Attach(phBitmap);
 
	BITMAP bm;
	GetObject(sizeof(BITMAP),&bm);
	CPoint size(bm.bmWidth,bm.bmHeight);
	height=size.y;
	width=size.x;
 
	return true;
}
Dove MyCBitmap e' una classe derivata da CBitmap.
PS.
Ringrazio Gianpaolo Bottin per avermi risposto.

...
mmmmm, ha pero' un "piccolo" difetto: non funziona in NT ma solo in
win95 :(
Ciao
Gianpaolo Bottin
- The truth is out there -


Strano perche' io sviluppo solo sotto NT  e non mi ha dato problemi,
gli ridaro' un occhiata.
Ecco comunque la classe completa.
#include "PDDiskBitmap.h"
PDDiskBitmap::PDDiskBitmap(){}
PDDiskBitmap::~PDDiskBitmap(){}
bool PDDiskBitmap::Create(LPTSTR szFileName)
{
	// Use LoadImage() to get the image loaded into a DIBSection
	HBITMAP
phBitmap=(HBITMAP)LoadImage(NULL,szFileName,IMAGE_BITMAP,0,0,
						LR_CREATEDIBSECTION | 
						LR_DEFAULTSIZE | 
						LR_LOADFROMFILE );
	if(phBitmap==NULL)
		return false;
	else 
		this->Attach(phBitmap);
 
	BITMAP bm;
	GetObject(sizeof(BITMAP),&bm);
	CPoint size(bm.bmWidth,bm.bmHeight);
	height=size.y;
	width=size.x;
 
	return true;
}
void PDDiskBitmap::Draw(CDC* pDC,int x, int y)
{
	BITMAP bm;
	GetObject(sizeof(BITMAP),&bm);
	CPoint size(bm.bmWidth,bm.bmHeight);
 
	CPoint org(0,0);
	pDC->DPtoLP(&org);
	CDC dcMem;
	dcMem.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmap=dcMem.SelectObject(this);
	dcMem.SetMapMode(pDC->GetMapMode());
	pDC->BitBlt(x,y,size.x,size.y,&dcMem,org.x,org.y,SRCCOPY);
	dcMem.SelectObject(pOldBitmap);
 
}
PDDiskBitmap.h
------------------------------------------------------------------------------------------
#include <afxwin.h>
class PDDiskBitmap:public CBitmap
{
public:
	PDDiskBitmap();
	~PDDiskBitmap();
	bool Create(LPTSTR szFileName);
	virtual void Draw(CDC*,int,int);
public:
	int height,width;
	HPALETTE hPalette;
};

gli ridaro' un occhiata.
puo' darsi che il problema stia nella documentazione MS, sull'MSDN di
Aprile si legge:
Windows NT: LR_LOADFROMFILE is not supported
io mi sono fidato :) evidentemente o e' sempre stata sbagliata la
documentazione oppure la funzione e' stata aggiunta con qualche
service pack. Tra l'altro hai provato su NT 4 senza sp ?


On Wed, 10 Dec 1997 22:39:09 GMT, 
bott...@tin.it
 (Gianpaolo Bottin)
wrote:

Effettivamente l'MSDN dice che non e' supportato pero' sembra
funzionare lo stesso, anche senza sp. Ho provato sia sulla versione
italiana che inglese.
Davide Fiorello

italiana che inglese.
bene, questa e' una buona notizia. Tanto per cambiare la
documentazione MS e' sbagliata :(
