C++ WniAPI 서브클래싱

야민·2023년 3월 31일
0

전역 서브클래싱

전역 서브클래싱은 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;

사실상 전연클래싱의 상위호환

0개의 댓글