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
[61080] Re:폼 자동 숨김...
장성호 [nasilso] 1530 읽음    2010-05-17 00:33
네..
원래 그렇습니다.


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 1383 2010/05/15
61084     [내용무]정말 감사합니다. 많은 도움이 되었습니다. happymin 1280 2010/05/17
61080     Re:폼 자동 숨김... 장성호 1530 2010/05/17
61081         Re:Re:폼 자동 숨김... Lyn 1996 2010/05/17
61082             Re:Re:Re:폼 자동 숨김... 장성호 1613 2010/05/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.