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 :

[MFC] Intercepter la fermeture d'une CPropertySheet


Sujet :

MFC

  1. #1
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut [MFC] Intercepter la fermeture d'une CPropertySheet
    Bonjour à tous,

    je voudrais intercepter l'action sur le bouton OK ou Annuler d'une CPropertySheet modale :
    j'ai essayé de surpasser EndDialog(),
    comme c'est une dérivée d'une CWnd,j'ai essayé de surpasser
    OnClose(), OnDestroy() ... rien n'y fait, je n'y passe pas en fermant ma CPropertySheet.

    j'ai donc essayé de surpasser OnSysCommand(...), en attendant le message SC_SCLOSE: pas de chance non plus, je ne passe pas dans ces fonctions
    alors que j'ai fait de même sur une CDialog en surpassant OnOK() et OnCancel() et ça fonctionne!

    Merci d'avance de me dépanner
    Philippe

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    essaye avec OnCommand comme dans la faq:
    http://c.developpez.com/faq/vc/?page...rapEscapeEnter

  3. #3
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Merci de ta réponse Farscape,

    en effet, j'intercepte bien comme je voulais, mais APRES la disparition de la fenetre.
    Or moi (ouais je sais.... ) je voulais AVANT (c'est pour faire une animation sur la fenetre avant qu'elle ne disparaisse)

    Si t'en as pas marre de mes questions à 100 balles, je suis preneur
    Merci d'avance
    Philippe

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Si tu veux faire une animation avant la fermeture soit tu temporises ce que je ne conseille pas trop avec un Sleep
    Soit à la fin de l'animation ->SendMEssage ( WM_ClOSE) ou WM_DESTROY

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je viens de faire l'essai dans un projet propertysheet je passe bien dans WM_SYSCOMMAND.
    et donc tu peux intercepter sc_close
    regarde l'extrait du code MFC :
    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
     
    void CPropertySheet::OnSysCommand(UINT nID, LPARAM)
    {
        m_nModalResult = IDCANCEL;
        switch (nID & 0xFFF0)
        {
        case SC_CLOSE:
            if (m_bModeless)
            {
                SendMessage(WM_CLOSE);
                return;
            }
        }
        Default();
    }
    tu es sur de ton coup sur l'interception de ce message ?

  6. #6
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Bon, ça fonctionne dans le principe, mais curieusement quand même
    Voici mon code :

    en effet, j'intercepte bien AVANT la disparition de la feuille
    mon animation, c'est la disparition progressive de la feuille (en jouant sur l'alpha), trouvée sur codeguru : cela marche parfaitement SI je laisse la MessageBox:
    dès que je clique sur le OK de la MessageBox, la feuille disparait progressivement.
    MAIS, si je retire la MessageBox, la feuille disparait brusquement, et c'est le fond d'écran qui disparait progressivement.


    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
     
    BOOL CSheet::OnCommand(WPARAM wParam,LPARAM lParam ) {
     
        switch(wParam)
        {
          case IDOK:
          case IDCANCEL:
    		  {
     
    			//Gestion de la transparence
    			hUserDll = ::LoadLibrary(_T("USER32.dll"));
    			//Change style to layered window style...
    			::SetWindowLong(m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE) |  WS_EX_LAYERED );
    			SetTransparent(m_hWnd, 0, 255, LWA_ALPHA );
     
    			MessageBox("Test","test",MB_ICONWARNING)	  ;
     
    			// Close window smoothly...
    			CloseSmoothly();
    			// Free user library...
    			if ( hUserDll )	::FreeLibrary( hUserDll );
                           return FALSE;
    		  } //case
     
    	} //switch
     
    return	CPropertySheet::OnCommand(wParam, lParam);
    } //proc
    Que peut bien faire MessageBox pour que ça marche avec et pas sans...
    J'ai essayé Invalidate à la place, mais sans succès

    Merci d'essayer de m'aider
    Philippe

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu as essayé un sleep a la place du messagebox ?
    ou une petite pompe a messages entre les deux .
    http://c.developpez.com/faq/vc/?page...rk#PumpMessage

  8. #8
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Le Sleep, ça change rien.
    En revanche, avec la pompe, c'est mieux, mais pas parfait :
    il y a un clignotement (bref) de la feuille avant sa disparition progressive.

    en fait, j'obtiens le même résultat avec UpdateWindow()
    et comme c'est plus simple ....

    Bon Farscape, si tu vois une solution immédiate, tant mieux, sinon, considérons que le pb est résolu, vu tout ce qu'il me reste à coder, je ne vais par perdre plus de temps là dessus !

    Encore merci pour cette fois
    Philippe

  9. #9
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Par contre, si tu as une solution pour la (simplissime) question de 14h24:

    comment imposer à une CPropertySheet une position scpécifique à l'ouverture ....
    là, je suis preneur

    Merci
    A+
    Philippe

  10. #10
    mat.M
    Invité(e)
    Par défaut
    J'ai pensé après coup: appeler plutot CPropertySheet::OnOK() ( ou OnCancel()) plutot que SendMessage(WM_CLOSE) c'est préférable...


    Citation Envoyé par Philippe320
    Par contre, si tu as une solution pour la (simplissime) question de 14h24:

    comment imposer à une CPropertySheet une position scpécifique à l'ouverture ....
    là, je suis preneur

    Merci
    A+
    Philippe
    CRect rectCoordonnees;
    CPropertySheet ps;
    ps.MoveWindow(rectCoordonnees);
    ps.DoModal()

  11. #11
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    ça ne fonctionne pas car OnOK() et OnCancel() appartiennent à CDialog,
    et moi je traite une CPropertySheet.

    quant au MoveWindow avant le DoModal, ça plante car la fenetre n'est pas encore initialisée

    Philippe

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

Discussions similaires

  1. Comment intercepter la fermeture d'une fenêtre
    Par Claude_Azoulai dans le forum Visual Studio
    Réponses: 2
    Dernier message: 28/03/2011, 18h02
  2. Réponses: 3
    Dernier message: 26/10/2007, 15h49
  3. Intercepter la fermeture d'une vue
    Par nako dans le forum Eclipse Platform
    Réponses: 7
    Dernier message: 09/10/2007, 17h07
  4. intercepter la fermeture d'une vue
    Par gargantua dans le forum Eclipse Platform
    Réponses: 21
    Dernier message: 01/08/2007, 09h55

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