티스토리 뷰
실행 중 메뉴 만들기
메뉴는 프레임 윈도우에 붙어 있으므로 메뉴 만들 코드는 프레임 윈도우 클래스에 추가해야 한다.
BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem=0, LPCTSTR lpszNewItem=NULL);
nFlag |
의미 |
nIDNewItem |
lpszNewItem |
MF_STRING |
메뉴 항목이 문자열 |
ID |
메뉴 항목 문자열 |
MF_POPUP |
메뉴 항목이 팝업 메뉴를 가짐 |
팝업메뉴 핸들(HWND타입) |
메뉴항목 문자열 |
MF_CHECKED |
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(255, 0, 0);
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)