2009-12-11 4 views
1

J'ai un problème avec CPaneDialog. J'ai testé avec des exemples de projets de pack de fonctions SetPaneSize MFC. Ce qui est bizarre, c'est que CPaneDialog ne peut pas être ancré à MainFrm alors que CDockablePane peut l'être. CPaneDialog est également une classe enfant du CDockablePane, mais ce n'est pas possible. Seul DockToWindow (& autre_CPaneDialog_instance ...) est possible. Si j'appelle DockToPane(), le contenu de CPaneDialog n'est pas dessiné ou actualisé correctement.Comment ancrer CPaneDialog à MainFrm et ..?

Comment un CPaneDialog peut-il être ancré à la fenêtre MainFrm?

Un autre problème concerne le dessin. Si vous supprimez des codes pour le contrôle d'arborescence dans l'exemple SetPaneSize, le contenu de view1 (une instance de CDockablePane) n'est pas redessiné correctement. Après avoir fait quelques expériences, j'ai décidé que quelque chose devrait être fait dans sa méthode OnSize et OnPaint. (OnSize est plus critique.) Est-ce que ce comportement est attendu?

Répondre

0

Conversion de HexEdit en MFC9 (voir http://www.hexedit.com) J'ai rencontré ce problème. J'ai testé dans VS2010 (MFC10) et ce bug semble avoir été corrigé.

Notez également que ce problème n'est pas majeur car vous pouvez simplement utiliser DockToWindow dans CMainFrame :: OnCreate pour ancrer à un CDockablePane (si vous en avez un). L'utilisateur peut faire flotter la fenêtre ou l'ancrer ailleurs et la position sera mémorisée et restaurée lorsque le programme sera rouvert. Je suis sûr que quelqu'un de nouveau à propos de ce bug dans MFC9 - d'où la solution de contournement évidente dans la démo SetPaneSize (appelant CDockablePane :: DockToWindow plutôt que DockPane comme c'était le cas pour toutes les autres fenêtres ancrables). Mais au moins, il est corrigé dans MFC10. Un autre bug que j'ai trouvé est que si un CPaneDialog est flottant lorsqu'il est fermé (caché), alors quand vous redémarrez l'application, le volet est rouvert, plutôt que d'être restauré dans l'état correct (caché). Cela ne se produit pas si le volet est ancré lorsqu'il est fermé. Cela a également été corrigé dans MFC10.

+0

Merci pour les de nouvelles informations –

2

Lors de la conversion d'une ancienne application MFC, j'ai rencontré des problèmes similaires avec le module de fonctions. Je ne l'ai pas eu le temps de le résoudre correctement, mais je suit solution de contournement:

  1. prendre votre ressource de dialogue et de le mettre dans une classe CDialogBar.
  2. maintenant dériver une classe de CDockablePane
  3. dans la méthode OnCreate du volet, créez votre boîte de dialogue.

2 choses: plus

void CInputPane::OnSize(UINT nType, int cx, int cy) 
{ 
    CDockablePane::OnSize(nType, cx, cy); 
    m_pInputBar->SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE | SWP_NOZORDER); 
} 

BOOL CInputPane::OnBeforeFloat(CRect& /*rectFloat*/,AFX_DOCK_METHOD /*dockMethod*/) 
{ 
    return FALSE; 
} 

Ceci assure le dimensionnement correct de la boîte de dialogue et d'empêcher l'utilisateur de glisser la barre autour.

HTH, ça a marché pour moi.

+0

Merci. En fait, j'ai vu une solution similaire ailleurs, mais CPaneDialog ne serait-il pas dans ce but? En outre, contrairement à d'autres dérivées CDockablePane, CPaneDialog se comporte bizarrement en ce sens qu'il ne peut pas être ancré en utilisant DockPane(). –

Questions connexes