Q&A

  • 메시지 트랩핑시 다른유닛에서
아 안녕하세요. 여기에 질문올리는게 첨 이거든요..



잘알고 있는 고수님들 잘 부탁합니다.



질문은요 메시지 트랩핑시에 메시지가 발생하는 폼이 아닌 다른 유닛에서 그 폼의 메시지를 이용할려고 하는데 컴파일이 안되는 군요..



방법이 없는가요. 그폼이 있는 유닛에서 폼의 타입선언에 선언하지 않고는 사용할수 없나요?



제발 알려주셔요..



그럼 욜심히...

1  COMMENTS
  • Profile
    민성기 2000.01.23 02:01
    안녕하세요~ 민성기 입니다.



    제가 질문을 잘 이해하지 못해서 이 답변이 정확할지 별루 자신은 없지만... 폼 없는 유니트에서 프로젝트 내의 다른 윈도컨트롤을 서브클래싱 하려 하시는 것 아닐까 싶네요. 메시지 트래핑 등의 델파이 스타일의 서브클래싱 기법들은 서브클래스 프로시저가 오브젝트 내에 선언되어야 하기 때문에... 귀찮을 때가 많습니다... 이 경우 써먹을 수 있는 한가지 방법을 소개하죠. 다음 소스를 보세요.



    var

    OldWinProc: Integer;



    function NewWinProc(hWnd: HWND; Msg: WORD; wParam: WORD; lParam: LONGINT): LONGINT; StdCall;

    begin

    case Msg of

    WM_USER+1818 : ShowMessage('1818 메시지가 왔군!!');

    end; {end of case Msg }

    Result := CallWindowProc(Pointer(OldWinProc), hWnd, Msg, wParam, lParam)

    end;



    procedure SubClassWin(hWnd: HWND);

    begin

    OldWinProc := SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@NewWinProc));

    end;



    procedure UnSubClassWin(hWnd: HWND);

    begin

    SetWindowLong(hWnd, GWL_WNDPROC, OldWinProc);

    end;



    만약 Form1을 서브클래싱 하구 싶다면 다음과 같이 하시면 됩니다.



    SubClassWin(Form1.Handle);



    이렇게 하면, Form1으로 전달되는 메시지들은 NewWinProc를 지나가게 되죠. 마지막에 해제하시는 거 잊지 마시구요~



    SubClassWin(Form1.Handle);



    객체형 프로시저를 선언하기가 아주 묘한 상황에서는 위의 방법을 알아두심 많은 도움이 될 껍니다. 참, 노파심으로 말씀 드리는 거지만... 위의 코드는 32비트 윈도 환경에서는 같은 쓰레드 내에서만 동작합니다요~ ^^;





    ps. 똑같은 글을 두 번... 음... "원래대로" 버튼... 너무 무섭당~ ^^;



    --------------------------------------------------------------------

    델파이의 모든 것... 델파이 코리아. http://www.delphikorea.com

    --------------------------------------------------------------------