반응형
툴바에 추가된 버튼을 DROPDWON 속성지정 후 메뉴를 붙이는 방법에 대해서 알아보겠습니다.
ResourceView 탭의 Toolbar(IDR_MAINFRAME) 아이템을 선택 오픈한 후 하나의 버튼을 추가하고.
그 버튼의 ID를 ID_DROPDOWN_TEST 으로 지정한다.
그 버튼의 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
#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");
| 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));
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_DROPDOWN_TEST));
// dwStyle에 DROPDOWN style을 추가한다.
dwStyle |= TBSTYLE_DROPDOWN;
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()
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
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);
}
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;
// 툴바의 포인터를 아니면 리턴한다.
if(pnmtb->iItem == ID_DROPDOWN_TEST) pWnd = &m_wndToolBar;
else return;
CRect r;
pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&r);
pWnd->ClientToScreen(&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");
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");
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, "그냥메뉴 아이템");
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();
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;
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);
}
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdatePopupMenu1_1(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdatePopupMenu1_2(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdatePopupMenu1_3(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdatePopupMenu2_1(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdatePopupMenu2_2(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
{
pCmdUI->Enable(TRUE);
}
<< 실행화면 >>
반응형
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
툴바의 위치를 레지스트리에 저장하자 (0) | 2011.11.17 |
---|---|
프로그램 시작시 About박스를 표시하려면 등... (0) | 2011.11.08 |
[Button] 버튼에 색상넣기 (0) | 2011.11.03 |
Visual C++,MFC 에서 로그인창 띄우고 메인화면 띄우기 (0) | 2011.11.03 |
[MFC] [List] OnItemchanged 한번만 호출되게 (0) | 2011.11.02 |
댓글