drop arrow on toolbar

 위에서 보듯이 툴바에 메뉴를 덧붙이는 예제입니다. 여기서는 MRU(기존에 불러들였던 파일들) 가 표시되게 해놓은 예제지만 메뉴 ID를 다른 걸루 바꾸어서 쓰면 다른 메뉴명령도 넣을 수 있습니다. 물론 다음에 나올 함수에서 조금 바꿀 부분이 있지만요..

1. ResourceView에서 메뉴를  추가합니다. 메뉴 ID는 처음 생긴 그대로 IDR_MENU1이라고 쓰죠.

2. 새로 추가한 이 메뉴를 다음 그림과 같이 속성을 정합니다.

 위와 같이 ID를 ID_FIEL_MRU_FILE1으로 정하면(이건 기존에 있던 거죠) 그 위치가 MRU로 알아서 채워집니다. 그리구 이 MRU 갯수는 디폴트로 4개로 정해져 있는데, 이건 AppWizard에서 프로젝트를 만드는 도중에 변경할 수 있습니다.

3. 먼저 MainFrm.h에다가 다음 한줄을 추가합니다.

// Generated message map functions
protected:
        //{{AFX_MSG(CMainFrame)
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);  // 추가
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};

4. 다음은 MainFrm.cpp 파일의 메시지 맵에 추가할 부분입니다.

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
        //{{AFX_MSG_MAP(CMainFrame)
        ON_WM_CREATE()
        ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)   // 추가
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

5. MainFrm.cpp 파일에 다음 함수를 추가합니다. 메뉴가 나타나는 위치를 바꾸고 싶을 때나 메뉴가 ID를 바꾸었을 때는 다음 함수의 빨간색 부분과 6번째 순서의 빨간색 부분을 적당히 바꾸어 주면 됩니다.

void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
    CWnd *pWnd;
    UINT nID;

    // Switch on button command id's.
    switch (pnmtb->iItem)
    {
    case ID_FILE_OPEN:
        pWnd = &m_wndToolBar;
        nID = IDR_MENU1;
        break;
    default:
        return;
    }
    
    // load and display popup menu
    CMenu menu;
    menu.LoadMenu(nID);
    CMenu* pPopup = menu.GetSubMenu(0);
    ASSERT(pPopup);
    
    CRect rc;
    pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);
    pWnd->ClientToScreen(&rc);
    
    pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
    rc.left, rc.bottom, this, &rc);
}

6. MainFrm.cpp 파일의 OnCreate 에다 다음의 코드를 추가합니다.

        // 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);

    // Set the drop arrow. ' 아래의 굵은 글씨부분을 추가해 주는 겁니다.
    m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);

    DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
    dwStyle |= TBSTYLE_DROPDOWN;
    m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(
ID_FILE_OPEN), dwStyle);

        return 0;
}

 

(NOTE)

5번과 6번의 순서에서 빨간색 부분을 적당히 바꾸면 메뉴의 ID나 위치를 바꿀 수 있습니다. 그런데 툴바의 핸들러가 없으면 툴바가 Disable 상태를 표시하는 Gray 로 표시되죠.. 그런 위치에서 메뉴를 표시하려고 하면 메뉴표시하는 부분도 같이 Disable 상태가 되니 알아두시길...