. 버튼의 상태관리

메인메뉴의 항목들은 프로그램의 현재 상황을 정확하게 보여준다. 예를 들어 보기/자동개행 항목은 현재 활성창이 자동개행을 하고 있는지를 보여주며 편집/취소 항목은 취소가 가능한지를 보여준다. 이처럼 메뉴의 상태를 관리하듯이 툴바의 상태도 관리해야 한다. 즉 선택영역이 있어야 복사, 잘라내기가 가능하고 활성창이 있어야 저장, 검색이 가능하다. 일단 툴바의 상태를 관리하는 다음 함수부터 작성하자.

 

void OnIdle()

{

     HWND hActive;

     SInfo *pSi;

     int s,e;

 

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

     if (hActive) {

          pSi=(SInfo *)GetWindowLong(hActive,0);

          SendMessage(hToolBar,TB_SETSTATE,IDM_FILE_SAVE,MAKELONG(TBSTATE_ENABLED,0));

 

          pSi->Ae.GetSelect(s,e);

          if (s == e) {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_CUT,MAKELONG(0,0));

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COPY,MAKELONG(0,0));

          } else {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_CUT,MAKELONG(TBSTATE_ENABLED,0));

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COPY,MAKELONG(TBSTATE_ENABLED,0));

          }

 

          if (IsClipboardFormatAvailable(CF_TEXT)==FALSE) {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_PASTE,MAKELONG(0,0));

          } else {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_PASTE,MAKELONG(TBSTATE_ENABLED,0));

          }

 

          if (pSi->Ae.GetWrap() == 2) {

              SendMessage(hToolBar,TB_SETSTATE,IDM_VIEW_WORDWRAP,

                   MAKELONG(TBSTATE_ENABLED | TBSTATE_CHECKED,0));

          } else {

              SendMessage(hToolBar,TB_SETSTATE,IDM_VIEW_WORDWRAP,MAKELONG(TBSTATE_ENABLED,0));

          }

 

          if (pSi->Ae.CanUndo()) {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_UNDO,MAKELONG(TBSTATE_ENABLED,0));

          } else {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_UNDO,MAKELONG(0,0));

          }

          if (pSi->Ae.CanRedo()) {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_REDO,MAKELONG(TBSTATE_ENABLED,0));

          } else {

              SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_REDO,MAKELONG(0,0));

          }

 

          SendMessage(hToolBar,TB_SETSTATE,IDM_SEARCH_FIND,MAKELONG(TBSTATE_ENABLED,0));

     } else {

          SendMessage(hToolBar,TB_SETSTATE,IDM_FILE_SAVE,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_CUT,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COPY,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_PASTE,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_UNDO,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_REDO,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_VIEW_WORDWRAP,MAKELONG(0,0));

          SendMessage(hToolBar,TB_SETSTATE,IDM_SEARCH_FIND,MAKELONG(0,0));

     }

}

 

활성창이 없으면 저장, 클립보드 액션, 취소, 개행, 검색 버튼은 모두 사용 불가 상태가 된다. 활성창이 있을 경우 상황에 따라 이 버튼들의 사용 가능 여부가 결정된다. 이 함수의 if 조건들은 OnInitMenu에서 메뉴의 상태를 관리하는 조건과 거의 동일하므로 쉽게 이해가 될 것이다. 다만 조정의 대상이 메뉴가 아니므로 EnableMenuItem 대신 TB_SETSTATE 메시지를 사용한다는 것만 다를 뿐이다.