C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75510] Re: 메세지... 서브클래싱 코드가 잘못 되어 있음.
빌더(TWx) [builder] 2380 읽음    2019-08-10 00:28
워드 님이 쓰신 글 :
: 빌더 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 값을 설정해 줘야 합니다.



+ -

관련 글 리스트
75496 서브클래싱에서 WM_MOUSELEAVE 메세지가 안들어옵니다. 도움 부탁드립니다. 워드 2190 2019/07/26
75510     Re: 메세지... 서브클래싱 코드가 잘못 되어 있음. 빌더(TWx) 2380 2019/08/10
75512         해결되었습니다~~ 답변 달아주신 빌더님, 아루스님 감사합니다. 워드 2288 2019/08/12
75501     Re:서브클래싱에서 WM_MOUSELEAVE 메세지가 안들어옵니다. 도움 부탁드립니다. 아루스 2115 2019/08/08
75503         Re:Re:서브클래싱에서 WM_MOUSELEAVE 메세지가 안들어옵니다. 도움 부탁드립니다. 워드 2229 2019/08/08
75507             Re:Re:Re:서브클래싱에서 WM_MOUSELEAVE 메세지가 안들어옵니다. 도움 부탁드립니다. 아루스 2228 2019/08/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.