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 :

CControlBar flottant : mais où est-il ?


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut CControlBar flottant : mais où est-il ?
    Bonjour,

    J'ai besoin de repérer un changement de position d'une CControlBar lorsque celle-ci est flottante, et par exemple, elle est déplacée par l'utilisateur.

    Lorsqu'elle est "dockée" elle reçoit tous les messages standard qui me permettent de voir un chagement de position : WM_WINDOWPOSCHANGED me suffit amplement.

    Par contre, une fois flottante : nada ! Pas un WM_WINDOWPOSCHANGED, ni WM_MOVE, voire même un WM_NCLBUTTONUP qui aurait pu m'aider (ni même un WM_SHOWWINDOW). Elle a l'air transparente à toute communication ...

    Pourquoi ces cachotteries ? Y a-t-il une solution ? Merci de votre aide !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Ah moi aussi ça m'intéresse parce que la seule méthode que j'ai trouvé
    par rapport au CControlBar (moi j'utilise des CDialogBar mais c'est pareil), c'est
    de surcharger le PreTranslateMessage de la MainFrame (CFrameWnd).

    Par exemple pour détecter la fermeture de la boite :
    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
     
     
    BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 
    {
        //catch the event when the DBar wants to be closed
     
        if (pMsg->hwnd != this->m_hWnd)
        {
           if ((pMsg->message == WM_SYSCOMMAND &&  pMsg->wParam == SC_CLOSE) || 
               (pMsg->message == WM_NCLBUTTONDOWN && pMsg->wParam == HTCLOSE))
           {
                    if (MyControlBar->GetDockingFrame()->m_hWnd == pMsg->hwnd)
                    {
                         ...
                    }       
           }
        }
        return CFrameWnd::PreTranslateMessage(pMsg);
    }
    Je reconnais que c'est pas très pratique.

  3. #3
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    Par contre, une fois flottante : nada ! Pas un WM_WINDOWPOSCHANGED, ni WM_MOVE, voire même un WM_NCLBUTTONUP qui aurait pu m'aider (ni même un WM_SHOWWINDOW). Elle a l'air transparente à toute communication ...
    c'est parce que ta CControlBar est encapsulée dans une CMiniFrameWnd, et c'est la CMiniFrameWnd qui reçoit tous les messages...

    Il me semble meme qu'il y a une CDockBar, qui est parent de la CControlBar et enfant de la CMiniFrameWnd

    Appelle la fonction GetParentFrame() de ta CControlBar, et surveille la CMiniFrameWnd retournée par la fonction.

    @+

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut
    CControlBar est encapsulée dans une CMiniFrameWnd, et c'est la CMiniFrameWnd qui reçoit tous les messages
    Ouaip ! J'ai trouvé un article sur le site de RogueWave (j'utilise Stingray, et c'est un SECControlBar en fait), mais ça marche aussi en MFC de base.

    http://www.roguewave.com/kb/?EntryID=132&View=entry

    En gros, CFrameWnd a un membre m_pFloatingFrameClass de type CRuntimeClass (il est protected et n'est donc pas documenté, merci Bill)

    Il suffit de dériver une classe de CMiniFrameWnd et d'y rajouter les handlers que l'on veut, puis dans le constructeur du CFrameWnd parent de la toolbar, d'initialiser m_pFloatingFrameClass

    m_pFloatingFrameClass = RUNTIME_CLASS(MonMiniFrameWndDerive);

    Merci pour vos infos

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    en fait, pour les MFC, c'est de CMiniDockFrameWnd qu'il faut dériver. cette classe est définie dans le fichier bardock.cpp et n'est pas documentée.

    mais comme tu utilises une lib Stingray, ce n'est plus valable.

    pour m_pFloatingFrameClass, je connaissais, j'avais deja eu à modifier la Frame de base des MFC. Maintenant tu peux aussi faire ça via un PreTranslateMessage() sans surcharger la classe, comme l'a dit coincoin73...

    @+

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

Discussions similaires

  1. Mais où est GLU ?
    Par djar dans le forum OpenGL
    Réponses: 5
    Dernier message: 29/03/2005, 10h34
  2. mais où est pg_hba.conf ??
    Par punky_brooster dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 10/01/2005, 23h08
  3. Mais quel est l'intérêt de XML ?
    Par darkbauer dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 01/06/2004, 18h03
  4. [VC++ .NET] mais où est passée SignedXML ???
    Par benoitB dans le forum MFC
    Réponses: 4
    Dernier message: 30/04/2004, 08h14
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47

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