[펌] 서브클래싱 1
서브클래싱이란 윈도우 프로시저로 보내지는 메시지를 중간에 가로채는 프로그래밍 기법입니다.
중간에 서서 오고가는 메시지를 마음대로 조작하여 부득히하게 불필요한 메시지는 없애거나 어떤 메시지는 원래 동작과는 다른 동작을 하도록 할때 쓰입니다.
대표적인 사용사례(?)로는 다이얼로그 박스 윈도우가 아닌 메인 윈도우에서 Tab키로 포커스를 이동할 때... 입니다.
특정 윈도우의 윈도우 프로시저 번지를 새로 만든 윈도우 프로시저의 번지로 변경하면 모든 메시지는 새로 만든 윈도우 프로시저로 전달됩니다.
그냥 원래 윈도우로 전달되는 메시지를 새로 만든 프로시저가 가로채서 먼저 받도록 한다는 것이 서브클래싱입니다.
간단히 에디트박스와 버튼을 서브클래싱하여 Tab키로 포커스이동이 가능하게 해보았습니다.
LRESULT CALLBACK EditSubProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message) {
case WM_KEYDOWN:
switch(wParam) {
case VK_TAB:
SetFocus(g_hWndButton);
return 0;
}
break;
}
return CallWindowProc(g_OldEditProc, hWnd, Message, wParam, lParam);
}
LRESULT CALLBACK ButtonSubProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message) {
case WM_KEYDOWN:
switch(wParam) {
case VK_TAB:
SetFocus(g_hWndEdit);
return 0;
}
break;
}
return CallWindowProc(g_OldButtonProc, hWnd, Message, wParam, lParam);
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message) {
case WM_CREATE:
...