티스토리 뷰

프로그래밍/MFC

MFC 실행 중 메뉴 추가

에어버스 2016. 6. 21. 11:10

실행 중 메뉴 만들기

메뉴는 프레임 윈도우에 붙어 있으므로 메뉴 만들 코드는 프레임 윈도우 클래스에 추가해야 한다.

BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem=0, LPCTSTR lpszNewItem=NULL);

nFlag

의미 

nIDNewItem 

lpszNewItem 

 MF_STRING

 메뉴 항목이 문자열 

 ID 

 메뉴 항목 문자열  

 MF_POPUP

 메뉴 항목이 팝업 메뉴를 가짐 

 팝업메뉴 핸들(HWND타입)

 메뉴항목 문자열

 MF_CHECKED
 MF_UNCHECKED
 MF_ENABLED
 MF_DIABLED
 MF_GRAYED

 Checked, Inactive, Grayed 속성을 지정

 

 

 MF_SEPARATOR

 구분선

 

 

CMenu 클래스를 이용하여 메뉴 생성한 후 최종적으로 CWnd::SetMenu() 를 이용하여 해당 윈도우에 메뉴를 붙이고 마지막에 CMenu::Detach() 를 이용하여 메뉴 객체와 메뉴를 분리해야만 하는 이유는 menuMain변수가 범위를 벗어나 제거되도 메뉴는 남아 있게된다. Drtach() 호출 없이 실행하면 에러 난다. (참고로, CMenu 객체를 외부 변수로 지정하면 Detach() 호출 없이도 에러 안남)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
    CMenu menuMain;
    menuMain.CreateMenu(); // 비어 있는 최상위 메뉴를 만든 후 메뉴 객체와 연결
    CMenu menuPopup;
    menuPopup.CreatePopupMenu(); // 비어있는 팝업메뉴를 만든 후 메뉴 객체와 연결
    menuPopup.AppendMenuW(MF_STRING, 201, L"빨강"); // 새 메뉴 항목을 메뉴 끝에 추가
    menuPopup.AppendMenuW(MF_STRING, 202, L"초록");
    menuPopup.AppendMenuW(MF_STRING, 203, L"파랑");
    menuMain.AppendMenuW(MF_POPUP, (UINT_PTR)menuPopup.Detach(), L"색상(&C)");
    SetMenu(&menuMain); // 새 메뉴를 윈도우 붙임
    menuMain.Detach(); // 메뉴 객체와 메뉴를 분리
    return 0;
}
cs

 

수정 전 프로젝트 기본 메뉴

수정 후

 

 

 

기존 메뉴에 색상 메뉴를 추가하는 코드

1
2
3
4
5
6
7
8
9
10
11
12
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        ...
    CMenu menuPopup;
    menuPopup.CreatePopupMenu();
    menuPopup.AppendMenuW(MF_STRING, 201, L"빨강");
    menuPopup.AppendMenuW(MF_STRING, 202, L"초록");
    menuPopup.AppendMenuW(MF_STRING, 203, L"파랑");
    CMenu* pMenu = GetMenu(); // 최상위 메뉴 주소를 얻는다
    pMenu->AppendMenuW(MF_POPUP, (UINT_PTR)menuPopup.Detach(), L"색상(&C)");
    return 0;
}
cs

 

위 코드에서 메뉴 이벤트 추가

메뉴 ID값을 맞춰 수동으로 메시지 핸들러를 구현해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class CMFCApplication4View : public CView
{
...
private:
    COLORREF m_color;
public:
    afx_msg void OnRed();
    afx_msg void OnGreen();
    afx_msg void OnBlue();
};
 
BEGIN_MESSAGE_MAP(CMFCApplication4View, CView)
    ON_COMMAND(201, &CMFCApplication4View::OnRed)
    ON_COMMAND(202, &CMFCApplication4View::OnGreen)
    ON_COMMAND(203, &CMFCApplication4View::OnBlue)
...
END_MESSAGE_MAP()
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        ...
    CMenu menuPopup;
    menuPopup.CreatePopupMenu();
    menuPopup.AppendMenuW(MF_STRING, 201, L"빨강");
    menuPopup.AppendMenuW(MF_STRING, 202, L"초록");
    menuPopup.AppendMenuW(MF_STRING, 203, L"파랑");
    CMenu* pMenu = GetMenu(); // 최상위 메뉴 주소를 얻는다
    pMenu->AppendMenuW(MF_POPUP, (UINT_PTR)menuPopup.Detach(), L"색상(&C)");
    return 0;
}
 
void CMFCApplication4View::OnRed()
{
    m_color = RGB(25500);
    Invalidate();
}
 
void CMFCApplication4View::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    CRect rect;
    GetClientRect(&rect);
    dc.SelectStockObject(NULL_PEN);
    CBrush brush(m_color);
    dc.SelectObject(&brush);
    dc.Rectangle(&rect);
}
cs

(코드3) 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28