2017-10-28 9 views
2

하십시오 슬라이더 구성된 컨트롤의 삼중, 숫자 편집 상자를 해당 숫자 입력란에 대해 회 전자입니다.MFC 슬라이더 + 편집 + 스피너 내가보고 "손잡이"행동과 유사의 무리가 외부 장치 제어 내 대화 상자 기반 UI에서 패턴

값이 변경되면 해당 외부 장치로 왕복하므로 자연스럽게 "변경"당 한 번 긴 API를 호출하려고합니다. 변경 사항은 3 개의 컨트롤 중 하나에서 가져올 수 있으며 분명히 동기화되어야합니다. 실제로 편집 상자가 변경되면 슬라이더의 위치를 ​​변경해야한다는 것을 의미합니다. 그리고 그 반대도 마찬가지입니다.

API 호출은 값 변경이 UI 프레임 워크에 의해보고 될 때마다 호출되는 별도의 함수로 구현됩니다.

문제 : 컨트롤 외모의 (a bool m_processingUserInput;처럼) 재귀 가드를 소개 서로

  • 업데이트를 시작하면

    1. 은 "에서 동기화"패러다임의 솔직 순진 구현은 자연스럽게 재귀 호출을 발생 그리고 솔직히, 꽤 못생긴 느낌이 들다.
    2. 더 많은 컨트롤이 추가 될 때 한 가지 유형의 컨트롤에서만 API 호출을하고 다른 유형에서는 (예 : 슬라이더에서만) API 오류를 발생시키는 경향이있다. 게다가이 방법을 사용하면 코드가 복잡해질뿐만 아니라 (자체적으로) 재귀 문제도 해결되지 않습니다.

    내 질문은 여기 있습니다. 사람들이이 UI를 코딩하는 데 사용하는 잘 정립 된 패턴이 없습니다. 상호 작용? 이것을 우아하고 효율적으로하는 방법을 알려주십시오.

  • +0

    이되지 않습니다 : 당신은 기본적으로 Model-View-Controller 패턴의 구현 인 MFC에 내장 된 문서보기 아키텍처, 윈도우 API의 상단에이를 구축하거나 사용할 수 있습니다 프로그래밍 방식으로 변경 될 때 언급 한 컨트롤 중 어느 것도 "변경된"알림을 보내지 않으므로 재귀가 발생합니다. 알림은 * 사용자 * 수정에 대한 것입니다. – zett42

    +0

    'SetDlgItemInt (ID, val)'가 "변경시"처리기를 확실히 트리거합니다. – YePhIcK

    +0

    좋습니다. 그것은 필자 자신을 테스트하는 대신 MS 문서를 그대로 읽음으로써 나온다. 재귀 경비원은 그렇게 나쁘지 않습니다. 예외 핸들러와 정적 변수를 생성자에서'true'로 설정하고 예외 안전성과 사용 용이성을 위해 소멸자에서'false'로 설정하는 RAII 클래스의 로컬 변수를 사용하여이 작업을 수행 할 수 있습니다. – zett42

    답변

    1

    변경된 첫 번째 컨트롤은 "값 업데이트 됨"이벤트를 발생시켜야합니다. 다른 컨트롤은 해당 이벤트에 가입하고 OnUpdate 메서드에서 시각적 요소를 다시 그려야합니다.

    https://www.codeproject.com/Articles/30291/An-Introduction-to-a-Model-View-Controller-Impleme

    +0

    이 모델을 지원하기 위해 서브 클래 싱이 많이 필요할 것 같습니다. 아니면 "이벤트 구독"방법론을 잘못 해석하고 있습니까? – YePhIcK

    +0

    응용 프로그램의 복잡성에 따라 모델이 정당화되는지 여부는 사용자가 결정해야합니다. 빠르고 더러운 솔루션을 찾고 있다면 항상 업데이트가 필요한 컨트롤을 무효화하고 새 값으로 다시 칠하도록 할 수 있습니다. – mnistic

    +0

    새 값으로 다시 칠하기 때문에 처음에 새 값을 설정해야합니다. 설명 된 재귀 문제로 돌아갑니다. ( – YePhIcK