본문 바로가기

Robotics/Software Tech.

슈퍼클래싱과 서브 클래싱


슈퍼 클래싱이란 기존의 윈도우 클래스의 기본적인 기능에 새로운 기능을 추가하여 슈퍼 클래스라고 하는 새로운 윈도우 클래스를 생성하는 기법을 말한다.

이것은 C++의 상속성의 개념과 유사하다. 슈퍼 클래스는 슈퍼 클래스 프로시저 라고 하는 자신의 윈도우 프로시저를 갖는다. 이 슈퍼 클래스 프로시저는 운영체제로부터 메세지를 받아 그대로 기존의 윈도우 프로시저에게 넘겨주거나, 메세지를 수정하여 기존의 윈도우 프로시저에게 넘겨줄 수 있다. 또는 기존의 윈도우 프로시저에 메세지를 넘겨주지 않을 수도 있다.

서브 클래싱이란 윈도우 운영체제가 메세지를 처리하기 전에 메세지를 가로채어 특정한 윈도우에게 보내어 메세지를 처리하게 하는 기법을 말한다. 따라서, 윈도우를 서브 클래싱함으로써 윈도우의 행위를 확장시키거나 수정 또는 모니터할 수 있다. 서브 클래싱은 슈퍼 클래싱과는 달리, 원래의 윈도우 프로시저를 서브 클래스 프로시저라고 하는 새로운 윈도우 프로시저로 대체함으로써 윈도우에 전달되는 메세지를 받게 된다.


서브클래싱의 예를 들어보자.
방법에는 두가지가 있다. 정적 서브클래싱(Static SubClassing)과 동적 서브클래싱(Dynamic SubClassing).
정적 서브클래싱을 예로들면, 다이얼로그 기반의 프로젝트에 CStatic기반으로 구성된 컨트롤인 Picture Control을 배치한다. 이것의 컨트롤 멤버변수를 Wizard를 통해서 생성하게되면 CStatic형의 컨트롤 멤버변수가 만들어 질것이다.
그리고, CStatic을 상속받아 해당 컨트롤의 확장된 기능을 하는 CStaticPicture라는 클래스를 만들었다고 가정했을때, 위에서 만든 멤버변수를 이 확장된 기능을 가지는 CStaticPicture로 대체시키면 된다. 즉, 멤버변수의 타입을 바꿔주는 것으로 서브클래싱이 이루어진다.

<Example>

CStatic m_ctrlPicture;

를 이렇게 바꾼다.

#include "StaticPicture.h"
...
CStaticPicture m_ctrlPicture;
...
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 DDX_Control(pDX, IDC_STATIC_PICTURE, m_ctrlPicture);
}

그리고 동적 서브클래싱은

SubClassWindow() 또는 SubClassDlgItem()을 이용하면 된다.

BOOL SubclassDlgItem(UINT nID, CWnd* pParent );
BOOL SubclassWindow(HWND hWnd);