IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[D�butant] Affichage d'un Bitmap d'apr�s resource


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut [D�butant] Affichage d'un Bitmap d'apr�s resource
    Bonjours,

    J'essaie d'afficher sur le fond de la fen�tre de mon application, une image au format BMP.

    Je l'ai d�clar� dans les ressources, j'essaie en suite de l'utiliser, et j'ai une Violation d'acces m�moire. J'ai r�cup�r� un bout de code que j'ai essay� de transormer.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    case WM_PAINT:
    				HDC hdc;
    				HDC hdcMemory;
    				PAINTSTRUCT ps;
     
    				hdc = BeginPaint(hWnd, &ps);
    				BITMAP bm;
    				hbitmap = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE("BGSTEP1"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    				hdcMemory = CreateCompatibleDC(NULL); 
    				SelectObject(hdcMemory, hbitmap);
    				GetObject(hbitmap, sizeof(bm), &bm);
    				BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCCOPY);
     
    				DeleteDC(hdcMemory);
    				EndPaint(hWnd, &ps);
    		break;
    Et dans le resource.rc :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    BGSTEP1 BITMAP "BgStep1.bmp"
    Merci de votre aide

  2. #2
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    o� se situe la violation ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Dans la fen�tre de sortie de Visual Studio :

    First-chance exception at 0x7c80b8a2 in Installer.exe: 0xC0000005: Access violation reading location 0x00009dbc.

  4. #4
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    hum ...

    Execute ton programme pas � pas en debug, et rep�re la ligne qui te provoque cette erreur, qui doit etre d�e � une mauvaise utilisation d'un pointeur

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Mais le code en lui m�me semble valide? Etant d�butant je fais surtout de la bidouille pour que �a fonctionne.

    Je n'ai pas r�ussi � obtenir d'informations depuis le debuger, je ne sais en plus pas encore tr�s bien m'en servir.

    Le probl�me semble bien venir de la partie que j'ai donn�e, d�s que je la commente je n'ai plus de probl�me.

    Mon but est d'afficher un bitmap contenu dans les ressources en fond de la fen�tre.

    Merci pour votre aide

    [Edit]

    La ligne qui pose probl�me semble �tre :

    hbitmap = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE("BGSTEP1"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

  6. #6
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    il ne faut pas combiner le flag LR_LOADFROMFILE et un chargement depuis une ressource.
    C'est soit LR_LOADFROMFILE et une adresse de fichier sur le disque dur
    soit c'est un chargement depuis une ressource, et il ne faut pas utiliser ce flag.
    Voir d�tails dans msdn http://msdn.microsoft.com/library/de.../loadimage.asp

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Merci, je n'ai plus l'erreur de violation de m�moire.

    Cependant, l'image ne s'affiche toujours pas.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    		case WM_PAINT:
    			HDC hdc;
    			HDC hdcMemory;
    			PAINTSTRUCT ps;
    			HBITMAP hbitmap;
    			HINSTANCE hInstance;
    			BITMAP bm;
     
    			hdc = BeginPaint(hWnd, &ps);
    			hbitmap = (HBITMAP)LoadImage(NULL, MAKEINTRESOURCE("BGSTEP1"), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
    			hdcMemory = CreateCompatibleDC(NULL);
    			SelectObject(hdcMemory, hbitmap);
    			GetObject(hbitmap, sizeof(bm), &bm);
    			BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCCOPY);
     
    			DeleteDC(hdcMemory);
    			EndPaint(hWnd, &ps);
    		return 0;

  8. #8
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    je t'encourage vivement � tester les retours des API (loadImage, Bitblt, etc ..)

  9. #9
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    PS: MAKEINTRESOURCE est inutile quand tu passes une cha�ne.
    Comme son nom l'indique mal, tu en as besoin quand tu passes un entier.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Voici l'�tat actuel de mon code. Malheureusement j'ai pass� au peigne tous les tutoriaux du net pour trouver des informations mais mon image ne s'affiche toujours pas.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		case WM_PAINT:
    			HBITMAP hBmp;
    			HDC hDC;
    			hBmp = (HBITMAP)LoadImage(NULL, "BGSTEP1", IMAGE_BITMAP, 0, 0, NULL);
    			hDC = GetDC(hWnd);
    			DrawState(hDC, NULL, NULL, (LPARAM)hBmp, NULL, 0, 0, 0, 0, DST_BITMAP);
    			DeleteObject(hBmp);
    			ReleaseDC(hWnd, hDC);
    		return 0;
    Je desesp�re un peu. Comment puis-je faire?
    Merci

  11. #11
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tu ne passes pas le HINSTANCE de ton ex�cutable. R�sultat, LoadImage() cherche une image syst�me...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    J'ai fais comme �a, mais �a ne fonctionne pas.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		HINSTANCE hInstance;
     
    		case WM_PAINT:
    			HBITMAP hBmp;
    			HDC hDC;
    			hBmp = (HBITMAP)LoadImage(hInstance, "BGSTEP1", IMAGE_BITMAP, 0, 0, NULL);
    			hDC = GetDC(hWnd);
    			DrawState(hDC, NULL, NULL, (LPARAM)hBmp, NULL, 0, 0, 0, 0, DST_BITMAP);
    			DeleteObject(hBmp);
    			ReleaseDC(hWnd, hDC);
    		return 0;

  13. #13
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Il est bien initialis�, au moins ?
    (avec le param�tre hInstance de WinMain())

    Et aussi, utilise GetLastError() et FormatMessage() pour savoir exactement quelle est l'erreur renvoy�e.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Voici la totalit� de ma page :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <iostream>
    #include <windows.h>
    #include "resource.h"
    #include "main.h"
     
     
    ///////////////////////////////////////////////////////////
     
    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);
    	SetTimer(hWnd, NULL, 1000, NULL);
    	MSG messages;
     
    	while(GetMessage(&messages, NULL, 0, 0) == TRUE)
    	{
    		TranslateMessage(&messages);
    		DispatchMessage(&messages);
    	}
     
    	return 0;
    }
     
    ///////////////////////////////////////////////////////////
     
    LRESULT CALLBACK MainProc(HWND hWnd, UINT messages, WPARAM wParam, LPARAM lParam)
    {
    	switch (messages)
    	{
    		HINSTANCE hInstance;
     
    		case WM_PAINT:
    			HBITMAP hBmp;
    			HDC hDC;
    			hBmp = (HBITMAP)LoadImage(hInstance, "BGSTEP1", IMAGE_BITMAP, 0, 0, NULL);
    			hDC = GetDC(hWnd);
    			DrawState(hDC, NULL, NULL, (LPARAM)hBmp, NULL, 0, 0, 0, 0, DST_BITMAP);
    			DeleteObject(hBmp);
    			ReleaseDC(hWnd, hDC);
    		return 0;
     
    		case WM_CLOSE:
                if(MessageBox(hWnd, "Êtes vous sûr de vouloir annuler l'installation ?", "Installation", MB_YESNO|MB_ICONQUESTION) == IDYES)
    				DestroyWindow(hWnd);
    		break;
     
    		case WM_DESTROY:
    			PostQuitMessage(0);
    		break;
     
    		default:
    		return DefWindowProc(hWnd, messages, wParam, lParam);
    	}
    }

  15. #15
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    En clair, tu passes � LoadImage() un HINSTANCE non-initialis�...

    Bon, tu as deux solutions:
    • Soit m�moiriser le HINSTANCE re�u en param�tre de WinMain() dans une variable globale (seule solution qui marcherait dans une DLL),
    • soit tu initialises ton HINSTANCE avec la valeur retourn�e par GetModuleHandle(NULL) (ceci, �a ne marche que dans l'EXE).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Merci,

    j'ai essay� ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    			HINSTANCE hInstance;
    			hInstance = GetModuleHandle(NULL);
    			HBITMAP hBmp;
    			HDC hDC;
    			hBmp = (HBITMAP)LoadImage(hInstance, "BGSTEP1", IMAGE_BITMAP, 0, 0, NULL);
    			hDC = GetDC(hWnd);
    			DrawState(hDC, NULL, NULL, (LPARAM)hBmp, NULL, 0, 0, 0, 0, DST_BITMAP);
    			DeleteObject(hBmp);
    			ReleaseDC(hWnd, hDC);
    Et l'image s'affiche. Seulement, les deplacements de la fen�tre cr�s des lenteurs de rafraichissement (des genres de petites rainures) et je ne peux plus fermer l'application avec le message de confirmation.

  17. #17
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Je ne connais pas DrawState.
    Mais, si tu veux un bon conseil (avec l'autre m�thode), charge ton image et cr�e ton Compatible DC � la cr�ation de la fen�tre, pour le d�truire dans le traitement de WM_DESTROY...

    D'une mani�re g�n�rale, je te conseille de t'arranger pour exporter le plus de traitements possibles en dehors du traitement de WM_PAINT...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    Je suis perdu. Je ne comprends pas ass� pour r�aliser le code qu je souhaite.

    Ou puis je trouver des tuto sur ce que je dois faire exactement?

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Par d�faut
    J'ai plac� mon bout de code d'affichage de la page dans la fonction de cr�ation de la fen�tre. Biens�r maintenant la page n'est plus redessinez lorsqu'elle passe derri�re une autre.

    J'ai aussi l'impression que si je place le code dans le switch, elle est execut� sans arret car mon processeur monte � 100% de charge.

    Comment puis je faire pour rafraichir la page seulement en cas de besoin?

    Merci

  20. #20
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Relis ce que j'ai �crit: tu pr�pares l'affichage dans le WM_CREATE, tu m�morises l'image, etc.

    et tu l'affiches dans le WM_PAINT.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 28/02/2006, 14h25
  2. [D�butant] Affichage d'une grille
    Par Mathieu.J dans le forum OpenGL
    R�ponses: 25
    Dernier message: 13/06/2004, 19h38
  3. Affichage d'une bitmap et de l'heure
    Par nanarr dans le forum Assembleur
    R�ponses: 14
    Dernier message: 16/04/2004, 22h39
  4. [QuickReport][D�butant] Affichage d'un graphique
    Par poufouille dans le forum Bases de donn�es
    R�ponses: 3
    Dernier message: 23/03/2004, 09h03
  5. [D�butant] Affichage impossible en local
    Par Alberto dans le forum ASP
    R�ponses: 2
    Dernier message: 29/11/2003, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo