Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WTL 소개

2,141 views

Published on

Windows Template Library 소개입니다.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

WTL 소개

  1. 1. WTL Windows Template Library
  2. 2. WTL 이란.. • 윈도우즈 응용프로그램을 만드는데 사용 • 윈도우즈 응용프로그램을 만드는데 크게 2가지 방법이 있음 • C 수준에서 직접 API 함수를 호출해서 만드는 SDK 방법 • C++로 API를 클래스화 하여 사용하는 MFC 방법 • SDK는 빠르지만 생산성이 낮고 MFC는 느리지만 생산성이 좋다 • 이 둘의 장점을 합친것이 WTL임
  3. 3. 버려진 WTL? • 애초에 마소에서 공식 지원하지 않음.. • Win32와 뭐가 다른거지.. • Win32에 비해 마법사, 메시지 맵 편집 등 일부 기능이 자동화되어 있다. • 자료가 없음.. • 이도저도 아님.. • 마소에서도 자기들이 쓰려고 만든 것..
  4. 4. WTL은 가벼워야한다 • 내부적으로 상속을 엄청 많이 받는다 • 메인 프래임, UI 갱신, 메시지 필터링 등등을 위한 클래스를 다 중상속한다. class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler { public: DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME) CWTLFirstView m_view; .... BEGIN_MSG_MAP(CMainFrame) MESSAGE_HANDLER(WM_CREATE, OnCreate) .... END_MSG_MAP() .... };
  5. 5. 그래서.. • 템플릿을 이용한 가상 함수 구현 • class CWTLFirstView : public CWindowImpl<CWTLFirstView> • 그냥 상속을 받는 것이 아니라 기반 클래스를 상속받고, 자기 자 신을 템플릿 인수로 넘겨준다 • class Child : public Parent<Child>
  6. 6. 일반적인 상속 #include <stdio.h> class Dog { public: virtual void Bark() { printf("mung mungrn"); } }; class MadDog : public Dog { public: virtual void Bark() { printf("yaong yaongrn"); } }; void KickDog(Dog *pDog) { pDog->Bark(); } void main() { Dog Happy; MadDog DdangChil; KickDog(&Happy); KickDog(&DdangChil); }
  7. 7. WTL의 상속? #include <stdio.h> template <typename T> class DogBase { public: void KickDog() { T* pDog=(T *)this; pDog->Bark(); } }; class Dog : public DogBase<Dog> { public: void Bark() { printf("mung mungrn"); } }; class MadDog : public DogBase<MadDog> { public: void Bark() { printf("yaong yaongrn"); } }; void main() { Dog Happy; MadDog DdangChil; Happy.KickDog(); DdangChil.KickDog(); }
  8. 8. 왜 이럴까.. • 효과는 거의 동일하다 • 가상함수를 사용하는것고 동일하다 • 장점이 있겠지 • 멤버 함수 호출에 객체를 직접 사용하므로 포인터 사용할 필요가 없음 • 그래서 NULL 포인터 호출이 없음 • 가상 함수를 위한 vtable을 만들지 않아도 됨 • 가상 함수 테이블은 포인터를 저장하므로 용량이 크지는 않지만, 다중 상속을 겹겹이 해대고 가벼워야 하는 목적을 둘 다 달성하기 위해 사용 됨
  9. 9. 믹스인 클래스 #include <stdio.h> #include <windows.h> template <typename T> class Sentinel { public: void OnThief() { T* pDog=(T *)this; for (int i=0;i<5;i++) { pDog->Bark(); printf("왔다리 갔다리...rn"); Sleep(500); } } }; class Dog : public Sentinel<Dog> { public: void Bark() { printf("mung mungrn"); } }; class Cow : public Sentinel<Cow> { public: void Bark() { printf("ume umern"); } }; void main() { Dog Happy; Happy.OnThief(); Cow So; So.OnThief(); }

×