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

 C Discussion :

MessageBox actif mais invisible


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut MessageBox actif mais invisible
    Bonjour, je rencontre un petit problème avec cette fonction.
    Voici un extrait de code

    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
     
    LRESULT CALLBACK rappelMsg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
    	case WM_COMMAND:
    		switch(LOWORD(wParam))
    		{
    		case ID_FICHIER_OUVRIR:
    			MessageBox(hWnd, TEXT("message 1"), TEXT("titre"), MB_OK);
    			break;
    		}
    		break;
        case WM_DESTROY:
    		MessageBox(hWnd, TEXT("message 2"), TEXT("titre"), MB_OK);
            break;
     
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    	return 0;
    }
    lorsque je quitte mon application le message2 apparaît correctement, mais lorsque j'active l'ID_FICHIER_OUVRIR, mon application se grise comme comme si j'avais affaire à une messagebox modale. Seulement celle-ci n'apparait pas... Donc impossible de valider la messagebox et l'application plante.

    Merci pour votre aide et meilleurs voeux...
    hugues

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Il manque aussi le traitement de WM_CLOSE. Ainsi un clic sur la croix rouge (bouton fermer) va tout simplement rendre ta fenêtre invisible (comportement par défaut) mais ne terminera pas ton programme. Si tu veux que cette action mette fin au programme, il faut appeler DestroyWindow dans le traitement de WM_CLOSE. De même dans WM_DESTROY, il faut appeler PostQuitMessage. Poste ton code complet (y compris les ressources si tu as créé ton menu en ressource).

  3. #3
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Bonjour merci pour votre réponse ! malheureusement, mon programme avait été trop défriché.. c'est pour cette raison que WM_CLOSE n'apparaissait pas (de même pour destroyWindow).
    Voici le code complet :

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    #include "resource.h"
    #include <windows.h>
     
     
     
     
    HINSTANCE hInst;
     
    HWND fenetrePrincipale;
     
    LRESULT CALLBACK rappelMsg(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
     
    void Message(WCHAR * texte);
     
     
     
    void Message(WCHAR * texte)
    {
    	MessageBox(fenetrePrincipale, texte, TEXT("Message"), MB_OK);
    	return;
    }
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    	hInst = hInstance;
     
    	MSG msg;
    	WNDCLASS wc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    	wc.hInstance = hInstance;
    	wc.lpfnWndProc = (WNDPROC)rappelMsg;
    	wc.lpszClassName = TEXT("classe_principale");
    	wc.lpszMenuName = NULL;
    	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
     
    	RegisterClass(&wc);
     
    	HMENU hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU_PAINT) );
    	fenetrePrincipale = CreateWindow(TEXT("classe_principale"), TEXT("ma fenetre"), WS_OVERLAPPEDWINDOW, 100, 100, 600, 300, HWND_DESKTOP, hMenu, hInstance, NULL);
    	ShowWindow(fenetrePrincipale, nShowCmd);
    	UpdateWindow(fenetrePrincipale);
     
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
     
     
     
    	return 0;
     
    }
     
    LRESULT CALLBACK rappelMsg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HDC hDC, hDCMem;
    	HBITMAP monImage;
        switch(message)
        {
     
    	case WM_PAINT:
    	{
    		monImage = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
    		BITMAP bitmap;
    		GetObject(monImage,sizeof(BITMAP), &bitmap); 
    		hDC = GetDC(hWnd);
    		hDCMem = CreateCompatibleDC(hDC);
    		SelectObject(hDCMem, monImage);
    		BitBlt(hDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hDCMem, 0, 0, SRCCOPY);
    		DeleteDC(hDCMem);
     
    		ReleaseDC(hWnd, hDC);
    		DeleteObject(monImage);
     
     
    	}
    	break;
     
    	case WM_COMMAND:
    		switch(LOWORD(wParam))
    		{
    		case ID_FICHIER_OUVRIR:
    			Message(TEXT("ouvrir"));
    			break;
    		case ID_FICHIER_QUITTER:
    			Message(TEXT("quitter"));
    			DestroyWindow(hWnd);
    			break;
    		}
    		break;
    	case WM_CLOSE:
    		DestroyWindow(hWnd);
    		break;
     
        case WM_DESTROY:
    		Message(TEXT("destroy"));
            PostQuitMessage(0);
            break;
     
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    	return 0;
    }

    les ressources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IDR_MENU_PAINT MENU 
    BEGIN
        POPUP "Fichier"
        BEGIN
            MENUITEM "Ouvrir",                      ID_FICHIER_OUVRIR
            MENUITEM "Quitter",                     ID_FICHIER_QUITTER
        END
    END
     
     
    IDB_BITMAP1             BITMAP                  "bitmap1.bmp"

    resource.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define IDR_MENU_PAINT                  101
    #define IDB_BITMAP1                     102
    #define ID_FICHIER_OUVRIR               40001
    #define ID_FICHIER_QUI                  40002
    #define ID_FICHIER_QUITTER              40003
    Si je supprime le traitement de WM_PAINT : tous les MessageBox apparaissent et sinon seul le message "destroy" est visible...

    Merci d'avance !
    hugues

  4. #4
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Donc il semblerait que le problème vienne du traitement de WM_PAINT ...

  5. #5
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    ça marche en traitant le message WM_PAINT ainsi :
    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:
    	{
    		monImage = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
    		BITMAP bitmap;
    		GetObject(monImage,sizeof(BITMAP), &bitmap); 
    		hDC = GetDC(hWnd);
    		hDCMem = CreateCompatibleDC(hDC);
    		SelectObject(hDCMem, monImage);
    		BitBlt(hDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hDCMem, 0, 0, SRCCOPY);
    		DeleteDC(hDCMem);
     
    		ReleaseDC(hWnd, hDC);
    		DeleteObject(monImage);
     
     
    	}
    	return DefWindowProc(hWnd, message, wParam, lParam);
    return DefWindowProc(hWnd, message, wParam, lParam);
    à la place du break... comment cela se fait-il ?

  6. #6
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Ah oui en fait il fallait placer BeginPaint et EndPaint afin de revalider la zone invalide...

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Melem Voir le message
    Il manque aussi le traitement de WM_CLOSE. Ainsi un clic sur la croix rouge (bouton fermer) va tout simplement rendre ta fenêtre invisible (comportement par défaut) mais ne terminera pas ton programme. Si tu veux que cette action mette fin au programme, il faut appeler DestroyWindow dans le traitement de WM_CLOSE. De même dans WM_DESTROY, il faut appeler PostQuitMessage. Poste ton code complet (y compris les ressources si tu as créé ton menu en ressource).
    À ma connaissance, WM_CLOSE cause un DestroyWindow par défaut, sans problème. Par contre, la seocnde partie (PostQuitMessage() dans le traitement de WM_DESTROY) est vraie.
    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.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À ma connaissance, WM_CLOSE cause un DestroyWindow par défaut, sans problème.
    Ah oui c'est vrai. Qu'est-ce que je raconte ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/09/2010, 12h20
  2. Recyclebin actif, mais ne stocke rien
    Par LBO72 dans le forum Administration
    Réponses: 14
    Dernier message: 25/05/2009, 15h34
  3. base de données créée mais invisible dans la console OEM
    Par bensabdel dans le forum Administration
    Réponses: 2
    Dernier message: 05/05/2009, 02h03
  4. Contrôles présents mais invisibles
    Par ced2975 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/04/2008, 16h40
  5. pop up nécéssaire mais invisible
    Par skyangel20 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/08/2007, 11h34

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