2

見つけたすべての例に従ってみましたが、何かが足りないので、他の人が見られるようにすべての部分をここに置きます。参考までに - MFC 機能パックのサンプル スライダーを変更しています。

ボタンを選択すると (文字列や下矢印ではなく) レイヤー ボタンが表示されます (クリック) 押し下げの動きが表示され、ボタンの ID を使用して OnLayers() 関数に到達します。私はほとんど ReplaceButton() が何もしていないように見えます。

何か案は?

ありがとう

ツールバーに 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

私のメニューは

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

そしてコード

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)
{
}
4

1 に答える 1

1

間違った使い方をしていると思います。この方法を試してください:

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));
于 2016-06-04T22:23:10.673 に答える