2016-04-13 15 views
0

Ich habe versucht, alle Beispiele zu finden, die ich finden konnte, aber ich vermisse etwas, also werde ich alle Stücke hier für andere zur Ansicht stellen. FYI - Ich modifiziere den MFC Feature Pack Beispiel Slider.Hinzufügen einer Dropdown-Menü-Schaltfläche zu einer CMFCToolbar, ohne Menü

Ich sehe die Layer-Schaltfläche (keine Zeichenfolge oder Pfeil nach unten), wenn ich die Schaltfläche auswählen (Klick) Ich sehe die Bewegung drücken und mit der ID der Schaltfläche auf die OnLayers() -Funktion zugreifen. Ich sehe fast aus wie die ReplaceButton() nichts tut.

Irgendwelche Ideen?

Dank

Für die Symbolleiste I ID_LAYERS_1

IDR_MAINFRAME TOOLBAR 16, 15 
BEGIN 
    BUTTON  ID_FILE_NEW 
    BUTTON  ID_FILE_OPEN 
    BUTTON  ID_FILE_SAVE 
    SEPARATOR 
    BUTTON  ID_SLIDER 
    SEPARATOR 
    BUTTON  ID_EDIT_CUT 
    BUTTON  ID_EDIT_COPY 
    BUTTON  ID_EDIT_PASTE 
    SEPARATOR 
    BUTTON  ID_FILE_PRINT 
    SEPARATOR 
    BUTTON  ID_APP_ABOUT 
    SEPARATOR 
    BUTTON  ID_LAYERS_1 
END 

mein Menü ist

IDR_LAYERS MENU 
BEGIN 
    POPUP "Layers" 
    BEGIN 
     MENUITEM "0",       ID_LAYERS_1 
     MENUITEM "1",       ID_LAYERS_2 
     MENUITEM "2",       ID_LAYERS_3 
    END 
END 

und der Code

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) 
    ON_WM_CREATE() 
    ON_WM_CLOSE() 
    ON_COMMAND(ID_SLIDER, OnSlider) 
    ON_COMMAND(ID_VIEW_CUSTOMIZE, OnViewCustomize) 
    ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, OnToolbarReset) 
    ON_REGISTERED_MESSAGE(AFX_WM_TOOLBARMENU, OnToolbarContextMenu) 
    ON_UPDATE_COMMAND_UI_RANGE(ID_LAYERS_1, ID_LAYERS_3, OnUpdateLayers) 
    ON_COMMAND_RANGE(ID_LAYERS_1, ID_LAYERS_3, OnLayers) 
END_MESSAGE_MAP() 

CMFCToolBarMenuButton* CreateLayerButton() 
{ 
    CMenu menu; 
    VERIFY(menu.LoadMenu(IDR_LAYERS)); 

    CMFCToolBarMenuButton* pLayerButton = NULL; 
    CMenu* pPopup = menu.GetSubMenu(0); 
    ASSERT(pPopup != NULL); 
    if (pPopup != NULL) 
    { 
     HMENU hMenu = pPopup->GetSafeHmenu(); 
     pLayerButton = new CMFCToolBarMenuButton(ID_LAYERS_1, hMenu, -1, NULL, FALSE); 
    } 

    return pLayerButton; 
} 

afx_msg LRESULT CMainFrame::OnToolbarReset(WPARAM wp, LPARAM) 
{ 
    UINT uiToolBarId = (UINT)wp; 
    if (uiToolBarId == IDR_MAINFRAME) 
    { 
     CSliderButton btnSlider(ID_SLIDER); 
     btnSlider.SetRange(0, 100); 
     m_wndToolBar.ReplaceButton(ID_SLIDER, btnSlider); 

     // layer button/menu 
     CMFCToolBarMenuButton* pLayerButton = CreateLayerButton(); 
     m_wndToolBar.ReplaceButton(ID_LAYERS_1, *pLayerButton); 
     delete pLayerButton; 
    } 

    return 0; 
} 

void CMainFrame::OnUpdateLayers(CCmdUI* pCmdUI) 
{ 
    //pCmdUI->SetCheck(true); 
} 

void CMainFrame::OnLayers(UINT id) 
{ 
} 

Antwort

0

Ich denke, es Sie verwenden hinzugefügt haben der falsche Weg . Versuchen Sie diesen Weg:

CMenu menu; 
VERIFY(menu.LoadMenu(IDR_LAYERS)); 

CString str; 

str.LoadString (IDS_TEXT_OF_YOUR BUTTON); 
m_wndToolBar.ReplaceButton (ID_LAYERS1, 
    CMFCToolBarMenuButton ((UINT)-1, menu, 
       GetCmdMgr()->GetCmdImage (ID_LAYERS1), str,TRUE)); 
Verwandte Themen