CWindowImpl을 사용하여 창 구현

창을 구현하려면 .에서 CWindowImpl클래스를 파생합니다. 파생 클래스에서 메시지 맵 및 메시지 처리기 함수를 선언합니다. 이제 세 가지 방법으로 클래스를 사용할 수 있습니다.

새 Windows 클래스를 기반으로 창 만들기

CWindowImpl 에는 Windows 클래스 정보를 선언하는 DECLARE_WND_CLASS 매크로가 포함되어 있습니다. 이 매크로는 GetWndClassInfo CWndClassInfo를 사용하여 새 Windows 클래스의 정보를 정의하는 함수를 구현합니다. CWindowImpl::Create 호출되면 이 Windows 클래스가 등록되고 새 창이 만들어집니다.

참고 항목

CWindowImpl 는 NULL을 매크로에 DECLARE_WND_CLASS 전달합니다. 즉, ATL에서 Windows 클래스 이름을 생성합니다. 고유한 이름을 지정하려면 문자열을 전달하여 파생 클래스에서 CWindowImplDECLARE_WND_CLASS.

예: 창 구현

다음은 새 Windows 클래스를 기반으로 창을 구현하는 클래스의 예입니다.

class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(_T("MyName")) 
              // If this macro is not specified in your
              // class, ATL will generate a class name

   BEGIN_MSG_MAP(CMyCustomWnd)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some painting code
      return 0;
   }

};

창을 만들려면 인스턴스 CMyWindow 를 만든 다음 메서드를 호출합니다 Create .

참고 항목

기본 Windows 클래스 정보를 재정의하려면 멤버를 GetWndClassInfo 적절한 값으로 설정하여 파생 클래스에서 CWndClassInfo 메서드를 구현합니다.

기존 Windows 클래스 수퍼클래싱

DECLARE_WND_SUPERCLASS 매크로를 사용하면 기존 Windows 클래스를 슈퍼클래싱하는 창을 만들 수 있습니다. 파생 클래스에서 이 매크로를 지정합니다 CWindowImpl. 다른 ATL 창과 마찬가지로 메시지는 메시지 맵에서 처리됩니다.

DECLARE_WND_SUPERCLASS 사용하면 새 Windows 클래스가 등록됩니다. 이 새 클래스는 지정한 기존 클래스와 동일하지만 창 프로시저를 이 메서드를 재정의하는 함수로 CWindowImpl::WindowProc 바꿉니다.

예: Edit 클래스 수퍼클래스

다음은 표준 Edit 클래스를 슈퍼클래싱하는 클래스의 예입니다.

class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
   // "Edit" is the name of the standard Windows class.
   // "MyEdit" is the name of the new Windows class
   // that will be based on the Edit class.
   DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))

   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
   END_MSG_MAP()

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some character handling code
      return 0;
   }
};

상위 클래스 편집 창을 만들려면 인스턴스 CMyEdit 를 만든 다음 메서드를 호출합니다 Create .

기존 창 서브클래싱

기존 창을 서브클래싱하려면 이전의 두 경우와 같이 클래스 CWindowImpl 를 파생시키고 메시지 맵을 선언합니다. 그러나 기존 창을 서브클래싱하므로 Windows 클래스 정보는 지정하지 않습니다.

호출 CreateSubclassWindow 하는 대신 호출하고 서브클래싱하려는 기존 창에 핸들을 전달합니다. 창이 서브클래스되면 메시지를 메시지 맵으로 보내는 데 사용됩니다 CWindowImpl::WindowProc (또는 이 메서드를 재정의하는 함수). 개체에서 서브클래싱된 창을 분리하려면 .를 호출 UnsubclassWindow합니다. 그러면 창의 원래 창 프로시저가 복원됩니다.

참고 항목

창 구현