2010-03-07 3 views
1

Cette question fait suite à ma précédente question. D'abord merci pour les liens et les exemples, ils fonctionnent pour une classe CChildFrame dérivée de CMDIChildWnd, mais pas pour un dérivé dérivé de CMDIChildWndEx.Comment créer une barre d'outils dans CChildFrame dérivé de CMDIChildWndEx?

Ce que je veux faire:

Je veux créer une barre d'outils dans la fenêtre CChildFrame (dérivée de CMDIChildWndEx !!)

Ce que je l'ai fait jusqu'à présent: 1) a créé un document MDI Tabbed Projet CView utilisant l'assistant d'application VS2008Pro. 2) i CChildFrame ajouté OnCreate()

int CChildFrame :: OnCreate (LPCREATESTRUCT lpCreateStruct) {if (CMDIChildWndEx :: OnCreate (lpCreateStruct) == -1) -1 retour;

// TODO: Add your specialized creation code here 
    if (!m_wndToolBar.Create(this) || 
     !m_wndToolBar.LoadToolBar(IDR_CHILDFRAME)) 
    { 
     TRACE0("Failed to create toolbar\n"); 
     return -1;  // fail to create 
    } 


    // TODO: Remove this if you don't want tool tips or a 
    // resizeable toolbar 
    m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | 
     CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 


    // TODO: Delete these three lines if you don't want the toolbar 
    // to be dockable 
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
    EnableDocking(CBRS_ALIGN_ANY); 
    DockControlBar(&m_wndToolBar); // Goes wrong here !! 


    return 0; 

}

il compile et fonctionne et arrête dans un ASSERT dans winfrm2.cpp (ligne 92):

vide CFrameWnd :: DockControlBar (CControlBar * pBar, CDockBar * pDockBar, LPCRECT lpRect) { ENSURE_ARG (pBar! = NULL); // s'assure que CControlBar :: EnableDocking a été appelé ASSERT (pBar-> m_pDockContext! = NULL);

if (pDockBar == NULL) 
    { 
      for (int i = 0; i < 4; i++) 
      { 
        if ((dwDockBarMap[i][1] & CBRS_ALIGN_ANY) == 
          (pBar->m_dwStyle & CBRS_ALIGN_ANY)) 
        { 
          pDockBar = (CDockBar*)GetControlBar(dwDockBarMap[i][0]); 

/* --------> va mal ici ------> */assert (pDockBar! = NULL); // assert échoue lorsque CBRS_ initial de la barre ne // correspond aux sites d'ancrage disponibles, comme défini par EnableDocking() break; } } } ENSURE_ARG (pDockBar! = NULL); ASSERT (m_listControlBars.Find (pBar)! = NULL); ASSERT (pBar-> m_pDockSite == this); // si cette affirmation a eu lieu c'est parce que le parent de pBar était pas initialement // ce CFrameWnd quand OnCreate de pBar a été appelé //-à-dire cette barre de contrôle aurait dû être créé avec un parent différent initialement

pDockBar->DockControlBar(pBar, lpRect); 

}

en ligne 92:

assert (! pDockBar = NULL); // assert échoue lorsque CBRS_ initial de la barre ne // disponibles correspondent à des sites d'amarrage, tel que par EnableDocking()

la source ici donne même une explication de ce qui se passe mal ici mais je ne sais pas comment faire correspondre 'CBRS_ initial de barre avec ceux définis par EnableDocking()' '

Est-ce que cela fonctionne même pour une classe CChildFrame dérivée de CMDIChildWndEx?Eh bien, ma question est de savoir comment ajouter une barre d'outils à une classe CChildFrame dérivée de CMDIChildWndEx ? Des suggestions pour que cela fonctionne?

Mon projet est ici: http://www.4shared.com/file/235762968/49b8b97a/GUI50.html

Toute aide serait grandement appréciée!

Répondre

1

Cela semble fonctionner pour une CMFCToolBar

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1) 
    return -1; 

    m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_CHILDFRAME); 
    m_wndToolBar.LoadToolBar(IDR_CHILDFRAME, 0, 0, TRUE); 
    m_wndToolBar.SetPaneStyle(CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_BOTTOM); 
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
    EnableDocking(CBRS_ALIGN_ANY); 
    DockPane(&m_wndToolBar); 

    return 0; 
} 
1

Vous devez définir m_bEnableFloatingBars = TRUE dans le constructeur MDIChild. Sans cela, votre barre d'outils ne sera pas ancrée à la souris, mais uniquement à l'ancrage statique.

Questions connexes