티스토리 뷰

컨텍스트 메뉴(팝업메뉴) 체크 표시

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 이벤트 처리기에서 메뉴 정보가 없다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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