본문 바로가기
C & C++/MFC 컨트롤

[ToolBar] 툴바에 추가된 버튼을 DROPDWON 속성지정 후 메뉴붙이는

by izen8 2011. 11. 8.
반응형

툴바에 추가된 버튼을 DROPDWON 속성지정 후 메뉴를 붙이는 방법에 대해서 알아보겠습니다.
 
ResourceView 탭의 Toolbar(IDR_MAINFRAME) 아이템을 선택 오픈한 후 하나의 버튼을 추가하고.
그 버튼의 ID를 ID_DROPDOWN_TEST 으로 지정한다.
 


 
// MainFrm.cpp 파일에 아래 다섯개의 define 문을 추가한다.(드롭다운 툴바메뉴의 아이템 인덱스)
#define ID_MENU0_1                 1
#define ID_MENU1_1                 2
#define ID_MENU1_2                 3
#define ID_MENU1_3                 4
#define ID_MENU2_1                 5
#define ID_MENU2_2                 6
 

// OnCreate 함수에 툴바를 만들고난 직후에 아래의 코드를 추가한다.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
            | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
            !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    }
 
    // 아래의 4개줄을 삽입한다.
    m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
    DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_DROPDOWN_TEST));
 
    // dwStyle에 DROPDOWN style을 추가한다.
    dwStyle |= TBSTYLE_DROPDOWN;
    m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_DROPDOWN_TEST), dwStyle);
   
    .............. 중간 생략  ..............
 
    }
 

// MainFrm.cpp 파일의 메시지맵에 아래의 코드를 추가한다. (메시지맵에 수동으로 메시지 핸들러를 등록한다.)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
 
    ............. 중간 생략 .............
 
    ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
    ON_UPDATE_COMMAND_UI(ID_MENU0_1, OnUpdatePopupMenu0_1)
    ON_UPDATE_COMMAND_UI(ID_MENU1_1, OnUpdatePopupMenu0_1)
    ON_UPDATE_COMMAND_UI(ID_MENU1_2, OnUpdatePopupMenu0_1)
    ON_UPDATE_COMMAND_UI(ID_MENU1_3, OnUpdatePopupMenu0_1)
    ON_UPDATE_COMMAND_UI(ID_MENU2_1, OnUpdatePopupMenu0_1)
    ON_UPDATE_COMMAND_UI(ID_MENU2_2, OnUpdatePopupMenu0_1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
 

// MainFrm.h 파일에 아래의 코드를 추가한다. (메시지맵에 수동으로 메시지 핸들러를 등록한다.)
//{{AFX_VIRTUAL(CMainFrame)
 
............. 중간 생략 .............
 
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
afx_msg void OnUpdatePopupMenu0_1(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupMenu1_1(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupMenu1_2(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupMenu1_3(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupMenu2_1(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupMenu2_2(CCmdUI* pCmdUI);
//}}AFX_VIRTUAL
 

// ClassWizard를 이용해 ID_DROPDOWN_TEST 의 UPDATE_COMMAND_UI 를 등록하고,


 
 
// 핸들러에 아래의 코드를 추가한다.
void CMainFrame::OnUpdateDropdownList(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE); 
}
 

// MainFrame.cpp 파일에 아래의 코드를 사용자가 수동으로 추가한다.
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
    CWnd *pWnd = NULL;
 
    // 메시지를 보낸 콘트롤이 ID_DROPDOWN_TEST이면 pWnd에
    // 툴바의 포인터를 아니면 리턴한다.
    if(pnmtb->iItem == ID_DROPDOWN_TEST) pWnd = &m_wndToolBar;
    else return;
 
    CRect r;
    pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&r);
    pWnd->ClientToScreen(&r);
 
    CMenu pop1;
    pop1.CreatePopupMenu();
    pop1.AppendMenu(MF_STRING, ID_MENU1_1, "팝메뉴1 아이템1");
    pop1.AppendMenu(MF_STRING, ID_MENU1_2, "팝메뉴1 아이템2");
    pop1.AppendMenu(MF_STRING, ID_MENU1_3, "팝메뉴1 아이템3");
 
    CMenu pop2;
    pop2.CreatePopupMenu();
    pop2.AppendMenu(MF_STRING, ID_MENU2_1, "팝메뉴2 아이템1");
    pop2.AppendMenu(MF_STRING, ID_MENU2_2, "팝메뉴2 아이템2");
 
    CMenu menu;
    menu.CreatePopupMenu();
    menu.AppendMenu(MF_POPUP|MF_STRING, (UINT)pop1.GetSafeHmenu(), "팝메뉴 1 보기");
    menu.AppendMenu(MF_POPUP|MF_STRING, (UINT)pop2.GetSafeHmenu(), "팝메뉴 2 보기");
    menu.AppendMenu(MF_STRING, ID_MENU0_1, "그냥메뉴 아이템");
 
    int id = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD, r.left, r.bottom, this, &r);
    pop1.DestroyMenu();
    pop2.DestroyMenu();
    menu.DestroyMenu();
 
    switch(id){
        case ID_MENU0_1: AfxMessageBox("그냥메뉴 아이템를 선택했습니다."); break;
        case ID_MENU1_1: AfxMessageBox("팝메뉴1 아이템1를 선택했습니다."); break;
        case ID_MENU1_2: AfxMessageBox("팝메뉴1 아이템2를 선택했습니다."); break;
        case ID_MENU1_3: AfxMessageBox("팝메뉴1 아이템3를 선택했습니다."); break;
        case ID_MENU2_1: AfxMessageBox("팝메뉴2 아이템1를 선택했습니다."); break;
        case ID_MENU2_2: AfxMessageBox("팝메뉴2 아이템2를 선택했습니다."); break;
    }
}
 
void CMainFrame::OnUpdatePopupMenu0_1(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
 
void CMainFrame::OnUpdatePopupMenu1_1(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
 
void CMainFrame::OnUpdatePopupMenu1_2(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
 
void CMainFrame::OnUpdatePopupMenu1_3(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
 
void CMainFrame::OnUpdatePopupMenu2_1(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
 
void CMainFrame::OnUpdatePopupMenu2_2(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
 
 
<< 실행화면 >>

반응형

댓글