mfc 콜백함수 예제

프로그래머를 괴롭히는 많은 문제 중 하나는 콜백 메서드를 사용하는 문제입니다. 이러한 콜백은 Windows API의 작동 방식의 일부이며 일부는 기본 Windows 정보 집합에 대한 액세스를 제공하는 열거형의 결과입니다. 세 가지 콜백 함수가 Microsoft 파운데이션 클래스 라이브러리에 나타납니다. 이러한 콜백 함수는 CDC::열거형 개체, CDC::그레이스트링 및 CDC::SetAbortProc에 전달됩니다. 모든 콜백 함수는 예외를 콜백 경계를 넘어 throw할 수 없으므로 Windows로 돌아가기 전에 MFC 예외를 트랩해야 합니다. 예외에 대한 자세한 내용은 예외 문서를 참조하십시오. 이것은 완벽에 너무 가깝습니다. 유일한 단점은 lambda 함수 구문이 약간 기괴하다는 것입니다. 그 외에, 이것의 나머지는 거의 완벽 합니다. 인생을 어렵게 만드는; 여기서 용서할 수 없는 것은 이러한 함수가 디자인되었을 때 LPARAM을 사용하는 방법론이 잘 알려져 있다는 것입니다. 콜백을 구현하는 한 가지 방법은 인터페이스 클래스를 사용하는 것입니다.

인터페이스 클래스에는 디리버에서 재정의할 멤버 함수가 포함되어 있습니다. 콜백 함수입니다. 열거체 함수, 열거형 함수, 열거형 함수를 호출합니다, 이는 일반 C 함수 또는 정적 클래스 멤버 (따라서 CDialog 파생 클래스와 같은 클래스의 인스턴스에 액세스 할 수 없음) EnumWindows를 사용하는 경우, 당신이 호출하는 함수가 있음을 기억 특정 조치를 취하지 않는 한 클래스에 액세스할 수 없습니다. 예를 들어 콜백 함수(OutputFunc)는 (x, y)가 아닌 좌표(0,0)를 기준으로 이미지를 그려야 합니다. 다른 C ++ 콜백 라이브러리가 있습니다. 나는 조금 주위를 둘러보고 분석을 위해 그들 중 일부를 여기에 끌어 들여야합니다. 구글 검색 꽤 빨리 그들을 설정 해야 합니다. 템플릿 Functors (리치 히키 1994)를 사용하여 C ++ 콜백 – 인터페이스 클래스 접근 방식 (Callee Mix-In) 및 함수 포인터 접근 방식 (함수 모델)을 다룹니다.

람다 함수와 리치 히키의 템플릿 펑터 접근 방식 사이에는 두 가지 주요 차이점이 있습니다. 첫째, std:::function을 사용하는 대신 약간 더 어설픈 CBFunctor* 형식을 사용해야 합니다: C++가 콜백을 직접 지원한다면 좋지 않을까요? 주기적으로 호출되는 콜백을 받는 타이머 클래스가 있다고 가정해 보겠습니다. 이 작업을 수행할 수 있는 것이 좋을 것입니다: 다시 호출하려는 클래스는 CallbackInterface에서 파생되고 콜백 함수를 구현합니다. 여기서 트릭은 staticCallbackFunction()가 “p”가 Calllee 개체에 대한 포인터라고 가정한다는 것입니다.

Por
agosto 2, 2019