Hwnd

Résolu
T_Mehdi Messages postés 294 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 24 juillet 2015 - 30 mai 2005 à 15:01
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 31 mai 2005 à 17:51
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mai 2005 à 15:34
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
3
cs_Tidam Messages postés 124 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 février 2006 2
30 mai 2005 à 18:24
ptdr xD

tu parles francais vecchio56 ???
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mai 2005 à 19:24
Oui je crois, pourquoi?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
30 mai 2005 à 19:25
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 ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
30 mai 2005 à 19:33
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);
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mai 2005 à 19:41
[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!
0
T_Mehdi Messages postés 294 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 24 juillet 2015
30 mai 2005 à 20:57
Merci a vous tous :D
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
31 mai 2005 à 17:51
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!!
0
Rejoignez-nous