전역 서브클래싱은 SetClassLongPtr 함수가 호출된 이 후 생성되는 클래스에 한 해서 변경된다.
HWND hEdit1, hEdit2;
WNDPROC OldEditProc;
// skip
case WM_CREATE:
hEdit1=CreateWindow(TEXT("edit"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
ES_AUTOHSCROLL,
10,10,200,25,hWnd,(HMENU)ID_EDIT1,g_hInst,NULL);
// 에디트를 생성하고 에디트를 대상으로 전역 서브 클래싱을 할 경우 에디트가 속한 "edit"윈도우 클래스가
// 서브 클래싱의 대상이 되므로 서브 클래싱한 이 후 생겨나는 모든 edit는 서브 클래싱의 영향을 받게된다.
// 전역 클래싱은 윈도우 클래스 자체를 바꾸는 것이지만 다른 프로세스에는 영향을 주지 못한다.
// 전역 클래싱은 이 함수가 호출된 이 후 생성되는 클래스에 한함
OldEditProc=(WNDPROC)SetClassLongPtr(hEdit1,GCLP_WNDPROC,(LONG_PTR)EditSubProc);
hEdit2=CreateWindow(TEXT("edit"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
ES_AUTOHSCROLL,
10,50,200,25,hWnd,(HMENU)ID_EDIT2,g_hInst,NULL);
SetFocus(hEdit1);
return 0;
슈퍼클래싱은 기존클래스(=베이스 클래스)의 정보를 바탕으로 하여 완전히 새로운 클래스를 만드는 것이다.
슈퍼클래싱에 의해 새로 만들어진 윈도우 클래스는 베이스 클래스와 동일하지만 여기에 변화를 주면 원하는대로
윈도우 클래스를 수정할 수 있다.
슈퍼클래싱의 핵심 함수는 GetClassInfo(Ex)함수이다.
case WM_CREATE:
// 외부 함수로 변경 후 Init()
GetClassInfo(NULL,TEXT("edit"),&WndClass); // "edit"클래스에 대한 정보 조사
WndClass.hInstance=g_hInst; // 사본 획득
WndClass.lpszClassName=TEXT("SuperEdit"); // 새로운 이름 등록
WndClass.hCursor=LoadCursor(NULL,IDC_WAIT); // 그냥 커서. 마우스 오버로드시 표시될 커서 모양
OldEditProc=WndClass.lpfnWndProc; // 기존의 윈도우 프로시저 저장
WndClass.lpfnWndProc=SuperProc; // 새로운 프로시저로 변경
RegisterClass(&WndClass); // 수정한 윈도우 등록
hEdit1=CreateWindow(TEXT("SuperEdit"),NULL,WS_CHILD | WS_VISIBLE |
WS_BORDER | ES_AUTOHSCROLL, 10,10,200,25,hWnd,(HMENU)ID_EDIT1,g_hInst,NULL);
SetFocus(hEdit1);
return 0;
사실상 전연클래싱의 상위호환