본문으로 바로가기

ON_UPDATE_COMMAND_UI_RANGE(사용자 UI갱신매크로)

category 개발언어/c++ 2017. 8. 9. 12:03

ON_UPDATE_COMMAND_UI 는 비활성화된 메뉴를 누르면 활성되고, 이미 활성화된 메뉴를 다시 누르면 비활성화가 되도록 하는 매크로이다.
프로그램 수행 도중 번번히 갱신되어야 하는 기능을 하는 매크로 이다.
메뉴나 툴바의 동작을 보면 어떤 조건에 따라 메뉴와 버튼이 Enable 또는 Disable 되는 것을 보았을 것이다.
이와 같이 빈번하게 작동하게 되는 것을 빠르고 쉽게 처리해주는 매크로가 ON_UPDATE_COMMAND_UI이다.

Wizard 생성되는 매크로와 이벤트 핸들러는 바로 아래와  같은 형태로 사용한다.
ON_UPDATE_COMMAND_UI(ID_EDIDCLEARALL, OnUpdateEditClearAll)
afx_msg void OnUpdateEditClearAll( CCmdUI* pCmdUI );

1
2
3
4
5
void CFrameView::OnUpdateEditClearAll(CCmdUI* pCmdUI)
{
   if(b_Clear) pCmdUI->Enable(true);
   else pCmdUI->Enable(false);        
}

ON_UPDATE_COMMAND_UI_RANGE 는 이벤트 마다 각각의 이벤트 핸들러를 만드는 것이 아니라 한꺼번에 이벤트를 해주는 핸들러를 만들수 있다는 것이다.
매크로는
ON_UPDATE_COMMAND_UI_RANGE(ID_ONE,ID_ONE+20, OnUpdateUIRange)
이벤트 핸들러 정의
afx_msg void OnUpdateUIRange(CCmdUI* pCmdUI) ;

구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void CView::OnUpdateUIRange(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
switch(pCmdUI->m_nID-20)
{
case 0:
            pCmdUI->Enable(!b_run);       
        break;
case 1:
            pCmdUI->Enable(b_run);        
        break;
case 2:
            pCmdUI->Enable(b_run);        
        break;
case 3:
            pCmdUI->Enable(!b_run);       
        break;
 case 4:
            pCmdUI->Enable(!b_run);       
        break;
}
}

와 같이 사용할 수 있다

그런데 주의 할 것이 있다.
앞에서 언급 했던 다수의 이벤트 처리 핸들러와 다른 부분이 있다.
아주 사소한 부분이긴 하지만  ON_UPDATE_COMMAND_UI의 핸들러에는 컨트롤 ID가 인자로 넘겨지지 않는다는 것이다.
영역의 이벤트를 처리하는 다른 핸들러처럼
afx_msg void OnCommandRange(UINT nID); ID가 필요한 것으로 착각하지 말아야 한다.
afx_msg void OnCommandRange(UINT nID,CCmdUI* pCmdUI);//이렇게 사용하면 안됨
다른 작업에 집중하다 이렇게 실수를 하게 되면 괜한 시간만 낭비하게 된다