Hwnd [Résolu]

Signaler
Messages postés
294
Date d'inscription
samedi 5 février 2005
Statut
Membre
Dernière intervention
24 juillet 2015
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
salut a tous .

bon j'ai realiser une fonction qui permet douvrir des fichier bmp et les affichier sur un hwnd preci.

le prob est que quand je reduit ou je cache la fenetre et je le reaffiche l'image ce supprime automatiquement de la fenetre.

<!--c1-->

CODE, ----
<!--ec1-->
int Load_Bmp(HWND WinHandle,char* File);
struct BMP_INFO {
int height;
int width;
HBITMAP hbmp;
int bitperpixel;
};

BMP_INFO bmp_info;
HBITMAP bit;
BITMAP bitmap;
int Load_Bmp(HWND WinHandle,char* File)
{

bit= (HBITMAP) LoadImage(NULL,File, IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
GetObject(bit, sizeof(BITMAP), &bitmap);

//Recupere les info
bmp_info.hbmp =bit;
bmp_info.height = bitmap.bmHeight;
bmp_info.width=bitmap.bmWidth;
bmp_info.bitperpixel = bitmap.bmBitsPixel;

int w;
int h;

HDC hdc;
HDC bit_dc;

hdc = GetDC( WinHandle );

bit_dc = CreateCompatibleDC(hdc);
SelectObject(bit_dc, bmp_info.hbmp);

for (h = 0;h bmp_info.width-1) break; //Pour ne pas dessiner meme les bordure;)
}
if (h > bmp_info.height-1) break; //Meme Chose
}

ReleaseDC( WinHandle, bit_dc );
ReleaseDC( WinHandle, hdc );
DeleteDC(bit_dc);
DeleteDC(hdc);

DeleteObject(bit);//Supprime l'obj

return 1;
}

8 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Bah oui tes SetPixel/GetPixel sont à faire dans le WM_PAINT de la fenêtre

Par contre, la méthode n'est pas bonne, tu devrais créer une HBITMAP,
la sélectionner dans un DC mémoire (tu le fais une seule fois) puis
dans WM_PAINT utiliser BitBlt, c'est beaucoup plus rapide.

PS: un DC obtenu avec getDC est détruit avec ReleaseDC et non DeleteDC
Messages postés
124
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 février 2006
2
ptdr xD

tu parles francais vecchio56 ???
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Oui je crois, pourquoi?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

En resumé ton code ne marche qu'une fois !!



Quand la fentre est reactualisé ton code n'est pas reexecuté

Il devrait etre dans le message WM_PAINT ( a chaque affichage ou reactualisation de ta fentre c le message a traiter)



Ensuite tu devrait plutot creer UN seul HBITMAP ( et une seule fois)
dans WM_CREATE par exemple et c'est lui que tu reaaffiche dans le
message WM_PAINT pour ne pas avoir a tout refaire a chaque fois.



Tu as une raison particuliere pour utiliser setpixel plutot que BitBlt ???
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Un exemple

HBITMAP hbmp = (HBITMAP)LoadImage(0,"c://image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);



case WM_PAINT:

HDC hdc;

hdc = GetWindowDC(hwnd);

BITMAP bmp;

GetObject(hbmp, sizeof(BITMAP), (LPSTR)&bmp);

HDC hdcBmp;

hdcBmp = CreateCompatibleDC(hdc);

SelectObject(hdcBmp, hbmp);

BitBlt(hdc,0,0, bmp.bmWidth,bmp.bmHeight, hdcBmp, 0,0, SRCCOPY);

DeleteDC(hdc);

DeleteDC(hdcBmp);

}



Mais cet exemple n'est pas au top car WM_PAINT donne deja le bon HDC grace a

PAINTSTRUCT ps;

HDC hdc=BeginPaint(hwnd,&ps);
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
[auteurdetail.aspx?ID=255292 SnOOpss]> Oui, si tu
ne veux pas utiliser BeginPaint, il faut au moins faire
ValidateRect(hWnd, 0), sinon le message WM_PAINT va continuer à arriver
sans arrêt.

Et puis LoadBitmap donne un HBITMAP, pas besoin d'appeler donc GetObject.

Et sutout, on libère hdc avec ReleaseDC!
Messages postés
294
Date d'inscription
samedi 5 février 2005
Statut
Membre
Dernière intervention
24 juillet 2015

Merci a vous tous :D
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

oui [auteurdetail.aspx?ID=19734 vecchio56] en fait
j'ai vu qu'il y avait pas mal d erreur moi meme en fait c'etait une de
mes vielles sources que j'ai simplement copier/coller mais par contre
le coup du ReleaseDC je crois que je fait encore l erreur et ca
m'etonne que le prog ne plante pas au bout d un moment (surtout dans
les boucles) si les DC ne sont jamais libérés!!