2009-03-01 2 views
4

MFC를 사용하여 작성된 Windows에서 실행되는 응용 프로그램이 있습니다. 메뉴 항목의 활성화/비활성화 상태는 많은 조건에 따라 다릅니다. 예를 들어 조건 A가 충족되거나 조건 B가 충족되면 메뉴 항목을 활성화해야하지만 A와 B가 동시에 TRUE 인 경우에는 비활성화해야합니다. 코드에서 어떻게 모델링합니까? 일종의 상태 머신을 사용해야한다고 생각하지만 상태 머신에 너무 많은 상태가있는 것으로 보입니다. 그러한 문제를 다루는 일반적인 방법은 무엇입니까? 위의 예는 단지 예일 뿐이며, 이와 같은 조건이 더 많을 것임을 유의하십시오. 또한 메뉴를 비활성화해야하므로 메뉴를 항상 활성화 된 상태로 유지하고 사용자가 누를 때 오류 메시지가 표시되는 옵션이 없습니다.UI 상태 처리

명확히하기 위해, MFC에서 메뉴 항목을 비활성화하는 방법을 찾고 있지 않습니다. 상호 의존 상태가 많을 때 메뉴 항목의 사용 가능/사용 불가능 여부를 결정하는 가장 좋은 방법은 무엇을 찾고 있습니까? 관련되어있다.

답변

0

모든 UI 작업 후에 호출되는 updateUIStatus() 메서드를 작성해보십시오. 이 메서드는 조건에 따라 메뉴 항목 (및 기타 UI 구성 요소)의 활성화 또는 비활성화 상태를 설정합니다.

모든 UI 상태 업데이트를 할 수있는 하나의 방법을 가진 좋은 점은 if (condition A && condition B) menu.setEnabled(true);

+0

하지만, 거대한 비즈니스 로직 방법을 사용하는 위험이 있습니다. ( – cwap

+0

나는 그 점도 생각했습니다.하지만 UI 측면에 있기 때문에 비즈니스 로직이 아닙니다. 비즈니스 로직이 있다면 의사 결정은 거기에 다음 다른 클래스 (즉, 일부 비즈니스 로직 클래스에서 "isOptionValid()"를 호출해야한다) 호출 –

+0

점 찍은 - 실제 비즈니스 로직, 더 "논리처럼".. – cwap

0

MFC가있다, 당신이 대신 말, 여러 통화를 필요없이 한 곳에서이 모든 로직을 중앙 집중화한다는 것입니다 내장 명령 라우팅 및 ON_UPDATE_COMMAND_UI 매크로 형식으로 메뉴 항목을 활성화 및 비활성화하는 메커니즘. 자세한 내용은 How to: Update User-Interface Objects 및 MSDN의 CCmdUI 클래스 설명서를 참조하십시오.

상태 시스템이 반드시 필요한 것은 아닙니다. 각 메뉴 명령에 대해 문서,보기 또는 기본 프레임 클래스에서 명령을 처리 할 위치를 결정한 다음 OnUpdate 처리기를 구현하고 적절한 클래스에 대해 ON_UPDATE_COMMAND_UI 메시지 맵 항목을 추가하십시오.

예를 들어, 내가 대답 this question에 준보세요.

+0

ON_UPDATE_COMMAND_UI는 상대적으로 쉬운 메뉴 및 툴바에서만 처리됩니다. 주요 문제는 ON_UPDATE_COMMAND_UI가 처리하지 못하는 대화 상자에서 컨트롤을 활성화/비활성화하는 방법입니다. – zar

관련 문제