티스토리 뷰
컨텍스트 메뉴(팝업메뉴) 체크 표시
COMMAND_UI 이벤트에서 메뉴 설정이 가능했던걸로 아는데 오늘 해보니 안된다. (마지막 그림 참조)
결국, OnInitDialog() 에서 메뉴 로드하여 멤버변수에 저장하고 WM_CONTEXTMENU 이벤트 처리기에서 팝업메뉴 표시하고 COMMAND_UI 이벤트 처리기에서 강제적으로 해당 메뉴에 체크 표시한다.
OnInitDialog() 에서 멤버변수에 메뉴를 저장하고 COMMAND_UI 이벤트에서 멤버변수로 체크표시하려 했으나 메뉴핸들(m_hMenu) 이 NULL 값이 되어 예외발생하여, 다시 서브메뉴를 지정하고 체크표시를 해야했다.
체크 표시에 ID를 사용하면 MF_BYCOMMAND 옵션을 OR연산 추가하고, 순서 번호를 사용할때는 MF_BYPOSITION 옵션을 사용한다.
또 다른 방법은,
WM_UPDATE_COMMAND_UI 메시지 처리기에서 처리하지 않고 CDlg::OnContextMenu() 에서 팝업 메뉴를 화면 표시하는 pContextMenu->TrackPopupMenu() 호출(45행) 전에 조건에 맞는 메뉴에 체크표시하도록 하면 된다.
|
|
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 |
class CDlg : public CDialogEx
{
...
private:
CMenu m_Menu;
public:
afx_msg void OnUpdateContextAttack0_10(CCmdUI *pCmdUI);
}
BEGIN_MESSAGE_MAP(CHogaBuySellDlg, CDialogEx)
...
ON_UPDATE_COMMAND_UI_RANGE(ID_CONTEXT_ATTACK0, ID_CONTEXT_ATTACK10, &CHogaBuySellDlg::OnUpdateContextAttack0_10)
END_MESSAGE_MAP()
void CDlg::OnUpdateContextAttack0_10(CCmdUI *pCmdUI)
{
CMenu* pContextMenu;
pContextMenu = m_Menu.GetSubMenu(0)->GetSubMenu(11); // 일반/공격매수 메뉴선택, 구분선까지 포함해서 위치값을 지정한다.
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK0, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK1, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK2, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK3, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK4, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK5, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK8, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK10, MF_BYCOMMAND | MF_UNCHECKED);
pContextMenu->CheckMenuItem(pCmdUI->m_nID, MF_BYCOMMAND | MF_CHECKED);
}
BOOL CDlg::OnInitDialog()
{
...
m_Menu.LoadMenuA(IDR_CONTEXTMENU);
CMenu* pContextMenu = m_Menu.GetSubMenu(0)->GetSubMenu(11);
pContextMenu->CheckMenuItem(ID_CONTEXT_ATTACK0, MF_CHECKED); // 메뉴에 일반매수 체크하여 초기화
}
void CDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
...
CMenu* pContextMenu;
pContextMenu = m_Menu.GetSubMenu(0);
pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, point.x, point.y, this);
} |
cs |
위 그림처럼 WM_COMMAND_UI 이벤트 처리기에서 메뉴 정보가 없다.