본문 바로가기
Programming/Tips(C++,C#)

Chapter 08. ATL윈도우 클래스와 WTL

by 곰네Zip 2014. 11. 11.

8.1 ATL윈도우 클래스

  참조링크 : http://devnote.tistory.com/63

  8.1.1 ATL윈도우클래스 개요

    - ATL에서는 윈도우 조작을 위해 윈도우 클래스를 제공한다. (최상위는 CWindow 클래스)


  8.1.2 윈도우 애플리케이션

    - 윈도우 프로그램을 구성하면 WinMain과 윈도우 프로시저로 구성됨.

      -> 프로그램의 진입은 WinMain(). 메인 윈도우를 생성하면 메시지 루프에 들어오는 메시지는 윈도우 프로시저로 전달된다. 


  8.1.3 CWindowImpl클래스. 

    - CWindow에서 파생되어, 윈도우의 생성 및 클래스등록, 메시지 처리등의 기능을 제공. (CWindow만 사용하면 클래스등록과 메시지처리는 직접 구현해야 함)

    - CWindowImple< class T, class TBase = Window, class TWinTraits = CControlWinTraits> 임.

     T는 CWindowImple에서 파생한 클래스. 마지막 변수는 윈도우 스타일을 정의하는 특징 클래스가 지정.

     특징클래스

      i) CWinTraits<기본스타일, 확장스타일>

       http://msdn.microsoft.com/ko-kr/library/c84d8s19.aspx

       자주사용되는 3가지 정의 : CControlWinTraits, CFrameWinTraits, CMDIChildWinTrait이 있음.

      ii) CWinTraitsOR<기본스타일,확장스타일,CWinTrait>

       http://msdn.microsoft.com/ko-kr/library/0kz8t3as.aspx

       기존에 정의된 WinTrait에 새로운 속성을 추가하는데 사용할 수 있음.


  8.1.4 윈도우 프로시저와 메시지 맵

    윈도우의 메시지 루프에서 전달된 메시지는 WindowProc함수에 전달된다. 각 윈도우의 프로시저에서는 정의된 메시지 맵을 보고, 그에 맞는 동작을 수행한다. 아래는 주로 사용되는 맵 모음

 사용방법은

 BEGIN_MSG_MAP(윈도우명)

    매크로(인자)

 END_MSG_MAP()

 

  와 같다. 아래는 매크로 목록.

 매크로

 설명

 MESSAGE_HANDLER( msg, func)

 윈도우 메시지를 핸들러 함수에 매핑

 MESSAGE_RANGE_HANDLER(msgFirst,msgLast,func)

 연속된 윈도우 메시지를 함수에 매핑

 COMMAND_HANDLER(id,code,func)

 WM_COMMAND를 리소스ID,알림코드 기반으로 매핑

 COMMAND_ID_HANDLER(id, finc)

 WM_COMMAND를 리소스 ID기반으로 매핑

 COMMAND_CODE_HANDLER(code, func)

 WM_COMMAND를 알림코드 기반으로 매핑

 COMMAND_RANGE_HANDLER(idFirst,idLast,func)

 연속된 WM_COMMAND를 ID기반으로 매핑

 NOTIFY_HANDLER(id, code, func)

 WM_NOTIFY에 대해 리소스ID,코드 기반으로 매핑

 NOTIFY_ID_HANDLER (id, func)

 WM_NOTIFY에 대해 ID기반으로 매핑 

 NOTIFY_CODE_HANDLER(code, func)

 WM_NOTIFY에 대해 코드 기반으로 매핑

 NOTIFY_RANGE_HANDLER(idFirst,idLast, func)

 연속된 WM_NOTIFY에 ID기반으로 매핑

   메시지를 연결해 주는 체인매크로도 있다.


 매크로

 설명

 CHAIN_MSG_MAP(theChainClass)

 chainclass의 메시지 맵으로 연결

 CHAIN_MSG_MAP_MEMBER(chainMember)

 chainmember의 메시지 맵으로 연결

 CHAIN_MSG_MAP_ALT(chainClass, mapID)

 chainclass의 mapID를 가진 메시지로 연결

 CHAIN_MSG_MAP_ALT_MEMBER(멤버,id)

 멤버의 msgID를 가진 메시지로 연결

 CHAIN_MSG_MAP_DYNAMIC(dynaCainID)

 실행시 다른개체의 메시지맵으로 연결 (인자는 ID)



  8.1.5 CDialogImpl클래스.

    - 윈도우에서 CWindowImpl클래스를 파생받아서 사용하였듯, 다이얼로그 기반도 CDialogImpl기반으로 할 수 있다.

     단, ATL프로젝트 내에서 ATL대화상자를 추가하면, CAxDialogImpl에서 파생받아온다.


8.2 Windows Template Library

  8.2.1 WTL소개

    - 윈도우 프로그래밍에서 MFC가 비록 덩치가 있지만, 엄청 많은 기능들을 제공하여주는 장점이 있다. 하지만 크기가 역시 단점임. WTL은 ATL이 가진 작고 빠른 코드에다 MFC가 지원하는 기능들을 제공하여준다.

   WTL설치는 다음 링크에서 제공한다. (sourceforge : http://sourceforge.net/projects/wtl/. 현재 9.0까지 나와있고, MS사이트에서는 링크가 없다.)


  8.2.2 ATL/WTL 응용프로그램 마법사

    앞에서 WTL파일을 받아서 AppWiz폴더로 들어가면 (WTL9.0기준). setup.js파일이 있다. 이 파일을 더블클릭하면 설치된 VS버전을 찾아주는데, 여기에 등록하면, 응용프로그램 마법사에서 WTL프로젝트를 선택할 수 있다.그리고 VS설정의 c++ include 폴더에 WTL압축파일의 압축을 해제하면 나오는 include폴더를 등록해주어야한다.

  (VS2010에서는 vc++디렉토리를 설정하지 못하기에 프로젝트 생성하면 vc++ include디렉터리에 위 경로를 설정해 주어야 한다. 아니면, 환경변수에 등록해 두고, 해당 경로를 추가하게 해주면 좀 더 편할것 같다)


  8.2.4 다중 SDI 애플리케이션

    - 인터넷 익스플로러처럼, 새로운 SDI윈도우를 띄울 수 있다. 이렇게 뜬 각각의 SDI윈도우는 개별 thread에서 동작.

반응형

댓글