Pbr: afficher une image

neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010 - 14 avril 2006 à 09:26
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010 - 19 avril 2006 à 13:11
salut tout le monde voila je pense que mon code est bon mais kan je
lance le debug et que j'insere le point d'arret juste apres le
LoadImage la variable HBitmap ne s'initialise pas ce qui fait que
ne n'arrive pas a afficher mon image voila merci

mon code:



include <windows.h>



LRESULT CALLBACK MainProc(HWND hWnd, UINT messages, WPARAM wParam, LPARAM lParam)



{



switch (messages)



{







case WM_PAINT:



{



HDC hdc;



POINT pt;



HBITMAP hBitmap;



HDC hMemDC;



PAINTSTRUCT ps;



BITMAP bm;



hdc = BeginPaint(hWnd, &ps);


hBitmap = (HBITMAP)
LoadImage( NULL, "d:\\but_valid.bmp", IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);



hMemDC = CreateCompatibleDC (hdc);



SelectObject (hMemDC, hBitmap);



GetObject (hBitmap, sizeof (BITMAP), &bm) ;



pt.x = bm.bmWidth;



pt.y = bm.bmHeight;



BitBlt (hdc, 0, 0, pt.x, pt.y, hMemDC, 0, 0, SRCCOPY) ;



EndPaint (hWnd, &ps);



break;



}







case WM_CLOSE:



case WM_DESTROY:



PostQuitMessage(0);



break;



}



return DefWindowProc(hWnd, messages, wParam, lParam);



}







int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)



{



WNDCLASSEX main;



main.cbSize = sizeof(WNDCLASSEX);



main.style = CS_HREDRAW|CS_VREDRAW;



main.lpfnWndProc = MainProc;



main.cbClsExtra = 0;



main.cbWndExtra = 0;



main.hInstance = hInstance;



main.hIcon = LoadIcon(hInstance, "APPICON");



main.hIconSm = LoadIcon(hInstance, "WINICON");



main.hCursor = LoadCursor(NULL, IDC_ARROW);



main.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);



main.lpszMenuName = NULL;



main.lpszClassName = "std";



RegisterClassEx(&main);



HWND hWnd;



hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "std", "Installation",
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, CW_USEDEFAULT,
CW_USEDEFAULT, 609, 429, NULL, NULL, hInstance, NULL);



ShowWindow(hWnd, SW_SHOW);



MSG messages;







while(GetMessage(&messages, NULL, 0, 0) == TRUE)



{



TranslateMessage(&messages);



DispatchMessage(&messages);



}







return 0;



}

30 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 avril 2006 à 10:40
LoadImage à mettre hors du WM_PAINT sinon appelé des centaines de fois, DeleteObject() pour libérer la mémoire.
DeleteDC est aussi manquant.

ciao...
BruNews, MVP VC++
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
14 avril 2006 à 11:23
j'ai changé au lieu de WM_PAINT c'est WM_CREATE donc il ne sera lancé qu'une fois et je libere la memoire a la fin avec

DeleteDC(hMemDC);

ReleaseDC(hWnd,hdc);

DeleteObject(hBitmap);

mais j'ai toujours le meme probleme hBitmap est toujours null
0
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
14 avril 2006 à 19:14
Tu dois juste mettre LoadImage dans WM_CREATE pas le reste, si c'est ton problème...

___________________
MVS - Most Valuable Student ( Microsoft)
0
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
14 avril 2006 à 19:19
NeoFenix : le ReleaseDC n'est pas à placer puisque tu as déjà libéré le DC avec EndPaint...

___________________
MVS - Most Valuable Student ( Microsoft)
0

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

Posez votre question
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
14 avril 2006 à 22:00
bonjour,
quel est le code renvoyé par GetLastError() ?
liste des codes :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 13:03
alors j'ai enlevé le releaseDC et l'erreur retourné avec GetLastError est descripteur non valide!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 13:32
Tu devrais ajouter le flag LR_DEFAULTSIZE et mettre l'instance de ton programme en premier param
Sinon un vieux LoadBitmap fera bien l'affaire, même s'il est deprecated
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 13:51
j'ai essayé LoaddBitmap aussi mais j'ai le meme probleme je me
demandais si c'etais pas un probleme avec l'image que je charge
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 13:53
Il faut qu'elle existe, normalement il doit charger toutes les bitmaps valides.
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 16:01
elle existe il n'y a pas de probleme la dessus mais au depart c'etais du jpg et je l'ai convertis avec photoshop
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 16:04
Les deux premiers octets du fichier sont bien BM?
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 16:36
je ne sais pas du tout je peux faire comment pour le savoir?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 16:42
Tu l'ouvres avec n'importe quel éditeur, tu verra bien s'il commence pas BM. Tu peux même l'ouvrir avec wordpad
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 16:50
il commence bien par BM ya pas de souci sur ce point la et le fichier
existe j'ai essayé en menlevant le fichier l'erreur reoturné n'était
pas la meme savez vous pourquoi il me dit descripteur non valide???
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 17:14
j'ai changé deux variables dans LoadImage maintenant je n'ais plus d'erreur pour charger l'image:

hBitmap=(HBITMAP)LoadImage(NULL,bmp, IMAGE_BITMAP, 64, 64, LR_LOADFROMFILE);



mais maintenant le probleme vient du hdc où l'erreur retourné est acces refusé
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 17:17
C'est donc qu'il fallait mettre LR_DEFAULTSIZE (ca t'évite de mettre 64)
A quel moment as-tu un accès refusé?
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 17:41
just apres hdc=GetDC(hWnd);
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 18:54
au fait j'ai modifié le code sa donne sa maintenant



HDC hdc;

HINSTANCE hInstance=GetModuleHandle(NULL);

HBITMAP hBitmap;

HDC hMemDC;

//charge l'image en memoire


hBitmap=(HBITMAP)LoadImage(hInstance,MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);

//retourne la derniere erreur du debuggeur

DisplayLastError(hWnd);

//affiche l'image

hdc=GetDC(hWnd);

DisplayLastError(hWnd);

hMemDC = CreateCompatibleDC (hdc);

DisplayLastError(hWnd);

SelectObject (hMemDC, hBitmap);

DisplayLastError(hWnd);

BitBlt (hdc, 10, 10, 300, 300, hMemDC, 80, 80, SRCCOPY);

DisplayLastError(hWnd);

//libere la memoire

DeleteDC(hMemDC);

ReleaseDC(hWnd,hdc);

DeleteObject(hBitmap);



lorsque dans le loadImage je change le 1er parametre l'erreur est differente:

-avec hInstance: acces refusé

-avec NULL: le nom de ressource specifié ne peut etre trouvé dans le fichier image
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 19:05
C'est mieux avec LR_LOADFROMFILE:
hBitmap=(HBITMAP)LoadImage(0, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);

Vu que tu mets LR_LOADFROMFILE, le premier param ne doit pas pris en compte

Ne fais pas ton BitBlt tout de suite (attend d'avoir un WM_PAINT).
Pour ton GetDC, je ferais plutot un GetDC(0), car hWnd est en cours de création, c'est pas sur que t'aura un HDC valide
0
neofenix Messages postés 145 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 11 mars 2010
16 avril 2006 à 19:34
merci du coup de main mais sa marche toujours pas
0
Rejoignez-nous