빌더님께서 알려주신대로 코딩해보니 잘 들어옵니다~~~
(빌더님께서 작성하신 다른 글에서도 도움 많이 받고 있습니다.)
항상 감사하게 생각하고 있습니다.
감사합니다~~.
아루스님 답변도 잘 참고하였습니다.
(아루스님 역시, 작성하신 다른 글에서도 도움 많이 받고 있습니다.)
감사합니다~~.
빌더(TWx) 님이 쓰신 글 :
: 워드 님이 쓰신 글 :
: : 빌더 2007에서 테스트 하였습니다.
: :
: : 다른 메세지(WM_RBUTTONUP, WM_MOUSEMOVE, WM_SIZE) 등은 잘 들어오는데,
: : WM_MOUSELEAVE 메세지는 들어오질 않습니다.
: : (GBox는 GroupBox이구요, Panel에서도 테스트해보았는데 증상은 동일합니다.)
: :
: : 제가 어떤 부분을 잘못 코딩해서 이런 증상이 나오는지 도움 부탁드립니다...
: :
: :
: : //-----------------------------------------
: : [헤더부분]
: :
: : TWndMethod m_OrgProc;
: : void __fastcall NewProc(Messages::TMessage &Message);
: : bool __fastcall WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
: : //-----------------------------------------
: :
: : //-----------------------------------------
: : [소스 부분]
: :
: : 1. 생성자 또는 시작부분)
: : m_OrgProc = GBox->WindowProc;
: : GBox->WindowProc = NewProc;
: :
: : 2. 함수 부분 )
: : void __fastcall TForm1::NewProc(Messages::TMessage &Message)
: : {
: : if(!WindowProc(Message.Msg, Message.WParam, Message.LParam))
: : {
: : m_OrgProc(Message);
: : }
: : }
: :
: : bool __fastcall TForm1::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
: : {
: : switch(uMsg)
: : {
: : case WM_PAINT:
: : break;
: : case WM_SIZE:
: : break;
: : case WM_MOUSEWHEEL:
: : break;
: : case WM_RBUTTONDOWN:
: : break;
: : case WM_RBUTTONUP:
: : break;
: : case WM_MOUSELEAVE: //안들어온다.
: : ShowMessage("WM_MOUSELEAVE");
: : break;
: : case WM_MOUSEMOVE:
: : break;
: : default:
: : return FALSE;
: : break;
: : }
: : return TRUE;
: : }
: : //-----------------------------------------
: :
:
:
:
: 답변:
:
:
: 메세지 라우팅이 자유로운 MFC 프레임웍과 달리...
: VCL 프레임웍은 정해져있는 구조를 따라야 합니다.
:
:
:
: __fastcall TForm2::TForm2(TComponent* Owner)
: : TForm(Owner)
: {
: orgGroupWndHandler = GroupBox1->WindowProc;
: GroupBox1->WindowProc = newGroupWndHandler;
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm2::newGroupWndHandler(TMessage& M)
: {
: M.Result = WindowProc(M.Msg, M.WParam, M.LParam);
: orgGroupWndHandler(M);
: }
:
: bool __fastcall TForm2::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
: {
: switch(uMsg)
: {
: case WM_PAINT:
: break;
: case WM_SIZE:
: break;
: case WM_MOUSEWHEEL:
: break;
: case WM_RBUTTONDOWN:
: break;
: case WM_RBUTTONUP:
: break;
: case WM_MOUSELEAVE: // 잘들어온다.
: ShowMessage("WM_MOUSELEAVE");
: break;
: case WM_MOUSEMOVE:
: break;
: default:
: return FALSE;
: break;
: }
: return TRUE;
: }
:
:
:
:
: 원래의 핸들러를 호출해주지 않으면...
: VCL 프레임웍 구조에서는 메세지가 정상적으로 디스패치 되지 않습니다.
:
: 위와 같이 원래의 핸들러는 그대로 호출해주면서 TMessage의 Result 값을 설정해 줘야 합니다.
:
:
: