BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
77915 Visitors up to today!
Today 12 hit, Yesterday 95 hit
'서브클래싱'에 해당되는 글 1건
[폭주기관차, 2007/02/06 11:18, [Programming]/Visual C++ API/MFC]
서브클래싱이란 쉽게 말해 윈도우 메세지를 가로채오는 것을 말한다.

EDIT BOX      →     WM_KEYDOWN

이런식으로 돌아가는데 내가 WM_KEYDOWN 메세지가 발생했을 때 다른 기능을 수행하고
싶다하면

EIDT BOX                    WM_KEYDOWN
         ↘                               ↑
          내가 만든 WM_KEYDOWN 수행


이렇게 패턴을 바꾸게 할 수가 있는 것이다.

서브 클래싱을 위해서는 우선 다음과 같은 변수들이 필요하다

HWND hSub;        // 서브클래싱할 윈도우 핸들
WNDPROC wp_OldSubProc;        // 서브클래싱하기 전의 윈도우 프로시져 주소


그리고 서브 클래싱을 위한 Proc Callback함수도 필요하다.

LRESULT CALLBACK Test1Proc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);


이 콜백 함수는 기본적으로 아래와 같이 구성되어있다.
LRESULT CALLBACK Test1Proc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    switch( iMessage )
    {
    case WM_KEYDOWN:
        break;
    }

    return CallWindowProc( wp_OldSubProc, hWnd, iMessage, wParam, lParam);
}


CallWindowProc는 내가 WM_KEYDOWN수행을 한 후 다시 원래 처리를 해야하는 코드를 위해
호출 한다.
만약 이 함수를 호출 하지 않으면 내가 구현한 코드만 수행 후 그냥 끝나게 된다.
구조를 보면 아래와 같다.

EIDT BOX                                   WM_KEYDOWN
        ↘
        내가 만든 WM_KEYDOWN → return 0;



EIDT BOX                                   WM_KEYDOWN
        ↘                                              ↑
        내가 만든 WM_KEYDOWN → CallWindowProc(...)



참, 중요한 설정하는 부분을 빼먹을 뻔 했다.

서브클래싱을 설정하는 함수는 SetWindowLong이란 함수를 사용한다.
아래와 같이 하면 된다.

wp_OldSubProc = (WNDPROC)SetWindowLong( hSub, GWL_WNDPROC, (LONG)Test1Proc );



hSub        => 서브클래싱 대상 윈도우 핸들
GWL_WNDPROC    => hSub 윈도우의 프로시져 주소를 다음 매개변수로 바꾸겠다.
Test1Proc    => 교체할 프로시져 주소
wp_OldSubProc    => 프로시져 주소가 교체되기 전 원래의 프로시져 주소


그리고 이렇게 설정해준 후 종료할때는 다시 원래의 프로시져 주소를 넣어주어야 한다.
대개 WM_DESTROY 이 메세지에 넣어 준다.

// 프로그램 종료시 다시 원래의 프로시져 주소로 교체 해준다.
SetWindowLong( hSub, GWL_WNDPROC, (LONG)wp_OldSubProc );



이 서브클래싱을 이용하면 다른 Process의 윈도우를 서브클래싱은 할 수가 없고
(여러 방면으로 테스트해봤지만 안되더라...)
자기 Process내의 Child Window Class에 한해서만 서브클래싱을 할 수가 있다.
다른 Process의 Child Window Class를 서브클래싱 하려면 아무래도 훅을 사용해야할 듯 싶다.


전역 클래싱 : 서브 클래싱은 특정 윈도우 클래스를 상대로 하지만,
                   전역 클래싱은 윈도우 클래스의 기본 셋팅을 변경하여 이후로 생성되는 윈도우는
                   전역 클래싱에서 설정한 대로 생성되게 된다.


Trackback Address :: http://kongmks.cafe24.com/trackback/87
Name
Password
Homepage
Secret
*1