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
[61081] Re:Re:폼 자동 숨김...
Lyn [tohnokanna] 1997 읽음    2010-05-17 00:51
WM 계열 메세지는 System 이 아니라 Windows
장성호 님이 쓰신 글 :
: 네..
: 원래 그렇습니다.
:
:
: VCL Control에서 발생하는 메세지 종류 3가지
:
: 1. WM_xxx 로 시작하는 메세지
:     WM 으로 시작하는 메세지는  System에 정의 되어져 있는 메세지 입니다.
: 2. CM_xxx 로 시작하는 메세지
: 3. CN_xxx 로 시작하는 메세지
: ( 더있나?)
: 그런데 VCL에서는 WM 으로 시작하는 메세지 말고
: CM  또는 CN 으로 시작하는 메세지들이 있습니다.
: CM 그리고 CN으로 시작하는 메세지는 VCL에만 있는것들입니다.
:
: 다시말해  시스템에서 메세지가 발생해서 메세지큐에서 메세지를 가져오는게 아니라
: VCL에서 적당한 상황에 메세지를 발생시켜주는것입니다.
:
: 그중에 CM_MOUSEENTER, CM_MOUSELEAVE 메세지도 있는데요
:
: CM_MOUSEENTER, CM_MOUSELEAVE 메세지는 언제 발생하나?
:    아시는 바와같이 CM_MOUSEENTER, CM_MOUSELEAVE  메세지는
:    어떤 Control의 영역에 마우스가 들어가거나 벗어날때 발생하는 메세지 입니다.
:
:    그런데 이 메세지는 앞에서 설명했듯이 시스템에서 발생하는 메세지가 아니라
:    VCL에서 직접 만들어서 Control에 던져주는데요
:
:    언제 만들어주냐?
:
:    그것은 System메세지큐에 메세지가 없을때..
:    즉 휴지(Idle)상태일때   마우스의 위치를 확인해보고 .. 
:    마우스위치가 이전에 있던 위치에서 움직여 다른 control영역으로 넘어가면
:    메세지를  해당control에 던져줍니다.
:
: 님코드에서 문제점
: Application->ProcessMessage(); 라는 코드는
: 시스템 메세지 큐에서 메세지만 가져와서 처리해주는 코드입니다.
: 시스템 메세지큐에 메세지가 없는 Idle상태일때 처리루틴은 없는것이죠
:
: Idle상태일때 처리는
: Idle상태일때 처리는
: procedure TApplication.Idle(const Msg: TMsg);  함수에서 처리하고 있습니다.
: 그런데 이 Idle함수는 protected 로 되어있네요
:
: 시스템큐 메세지와 Idle상태일때 모두다 처리해주려면?
: 함수내 while문에서
: 시스템 메세지큐 메세지 처리와 Idle상태의 vcl동작까지 함께 하려면 어떻게 해야할까요?
:
:
:  while(1){
:   Application->ProcessMessage();
:   Application->Idle();  //이 함수는 procted 임
:   //... 다른 작업
:  }
: 

: 위와깉이  해줄수 있으면 좋겠지만.
: 앞에 얘기했듯이 Idle함수는 protected입니다.
:
:
: 테스트 해보진 않았지만
: 다음과 같이 하면 Idle상태에 vcl동작도 함께 처리할것입니다.
:
:  while(1){
:   Application->ProcessMessage();
:   Application->HandleMessage();
:    //.... 다른 작업..
: 
:  }
: 

:
: 다음은 vcl의  TApplication클래스의
: ProcessMessages 함수와 HandleMessage함수의 코드입니다.
:
:
: procedure TApplication.ProcessMessages;
: var
:   Msg: TMsg;
: begin
:   while ProcessMessage(Msg) do {loop};
: end;
: 
: procedure TApplication.HandleMessage;
: var
:   Msg: TMsg;
: begin
:   if not ProcessMessage(Msg) then Idle(Msg);
: end;
: 

:
:
: ProcessMessages와 HandleMessage 의 중요한 차이점
: 위 코드를 잘 보시면 아시겠지만
: ProcessMessages와 HandleMessage 의 중요한 차이점이 있습니다.
:
: 차이점 1. ProcessMessages 는 메세지 큐에 메세지가 빌때까지 모두 더 처리해줍니다.
:     반면 HandleMessage 는 하나의 메세지만 처리합니ㅏㄷ.
:
: 차이점2. 앞에서 얘기했듯이 HandleMessage는 메세지큐에 메세지가 없으면
:               Application->Idle을 호출해줘서 Idle상태일때 동작을 처리해주는데 ProcessMessage는 그런게 없습니다.
:
: 위 차이점을 잘 알고 사용하면 될것 같습니다.
:
: 그럼..
:
:
:
:
:
: happymin 님이 쓰신 글 :
: : 안녕하세요...
: :
: : while(1){
: :  Application->ProcessMessage();
: :
: : }
: : 자동 숨김할 폼에서 MESSAGE_MAP에서 CM_MOUSELEAVE처리를 하고 있습니다.
: :
: : while문이 돌고 있을때는 CMMOUSELEAVE가 들어오지를 않습니다.
: : 방법이 없을까요?

+ -

관련 글 리스트
61077 폼 자동 숨김... happymin 1386 2010/05/15
61084     [내용무]정말 감사합니다. 많은 도움이 되었습니다. happymin 1282 2010/05/17
61080     Re:폼 자동 숨김... 장성호 1531 2010/05/17
61081         Re:Re:폼 자동 숨김... Lyn 1997 2010/05/17
61082             Re:Re:Re:폼 자동 숨김... 장성호 1615 2010/05/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.