Afficher une image Jpeg dans une fenêtre (en fond)

cs_JayC Messages postés 1 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 janvier 2003 - 30 janv. 2003 à 17:51
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 25 mai 2005 à 18:06
Salut !

J'essaye d'afficher une image dans mon application en VC++ (j'utilise VC++ 6.0) et je sais vraiment pas comment faire.
En fait ce que je voudrais faire c'est la mettre en fond et placer mes controles (essentiellement des boutons) par dessus.
Si quelqu'un peut m'aider c'est cool parce que je suis vraiment bloqué...
Merci !

JayC

4 réponses

Aethys Messages postés 4 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 7 février 2008
16 avril 2004 à 10:54
Salut. J'ai trouvé la réponse sur ce site justement.

Tout d'abord tu charges le BMP ou JPEG ou GIF depuis le fichier sur le disque.
HBITMAP LoadAnImage(char* FileName)
{
// Use IPicture stuff to use JPG / GIF files
IPicture* p;
IStream* s;
//	IPersistStream* ps;
HGLOBAL hG;
void* pp;
FILE* fp;

// Read file in memory
fp = fopen(FileName,"rb");
if (!fp)
return NULL;

fseek(fp,0,SEEK_END);
int fs = ftell(fp);
fseek(fp,0,SEEK_SET);
hG = GlobalAlloc(GPTR,fs);
if (!hG)
{
fclose(fp);
return NULL;
}
pp = (void*)hG;
fread(pp,1,fs,fp);
fclose(fp);

// Create an IStream so IPicture can 
CreateStreamOnHGlobal(hG,false,&s);
if (!s)
{
GlobalFree(hG);
return NULL;
}

OleLoadPicture(s,0,false,IID_IPicture,(void**)&p);

if (!p)
{
s->Release();
GlobalFree(hG);
return NULL;
}
s->Release();
GlobalFree(hG);

HBITMAP hB = 0;
p->get_Handle((unsigned int*)&hB);

// Copy the image. Necessary, because upon p's release,
// the handle is destroyed.
HBITMAP hBB = (HBITMAP)CopyImage(hB,IMAGE_BITMAP,0,0,
LR_COPYRETURNORG);

p->Release();
return hBB;
}

Ca te renvoie un HBITMAP que tu affiches ensuite dans ton OnDraw de cette facon:
HDC hdcBits;
BITMAP bm;
hdcBits = CreateCompatibleDC(pDC->m_hDC);
GetObject (Himage, sizeof(BITMAP), &bm);
SelectObject(hdcBits,Himage);

//les X,Y des coins sont en pixels de l'ecran donc le (0;0) est en haut à gauche de ta fenetre.
StretchBlt(pDC->m_hDC,
              X_CoinHautGauche,
              Y_CoinHautGauche,
              int(  X_CoinBasDroite-X_CoinHautGauche),
              int(-(Y_CoinBasDroite-Y_CoinHautGauche)),
              hdcBits,
              0,
              0,
              bm.bmWidth,
              bm.bmHeight,
              SRCAND);
DeleteDC(hdcBits);

Attention StretchBlt est utile pour etirer ton image d'un rectangle vers un autre. Sinon tu as BitBlt que tu peux utiliser. (Remarque : StretchBlt marche bien comme ca donc ... au moins tu auras toujours la possibilité avec StretchBlt d'etirer ton image pour remplir tout ton arriere plan par exemple ;) ).

J'espère que ca t'aide.

Aethys
0
Aethys Messages postés 4 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 7 février 2008
16 avril 2004 à 10:57
Autant pour moi je me rend compte que j'ai répondu à coté car ton problème vient en fait de l'éditeur de ressources ... donc tu ne demandais pas une solution par programmation :p

Sinon petite astuce comme ca, pour que ton image passe bien en arriere plan, mets la en dernier dans l'ordre de tabulation (ou edite carrément ton fichier .rc pour mettre ton controle de type "image" en dernier dans ta fenetre).
0
ark1979 Messages postés 5 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 décembre 2004
3 déc. 2004 à 17:04
Ne pas oublier d'inclure ceci pour utiliser l'excellent exemple d'affichage d'image Jpeg ou gif :

#include <ocidl.h>
#include <olectl.h>

Salut !
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
25 mai 2005 à 18:06
comment on fait si le .jpg il est en ressource? (pas de .bmp)
merci
_______________________


Omnia vincit labor improbus
0
Rejoignez-nous