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
[55272] Re:FromSyle 속성을 fsStayOnTop로 할경우 ShowMessage가 뒤에 숨어 버리는 경우가 생깁니다.
장성호 [nasilso] 2460 읽음    2008-11-25 22:09
ShowMessage가   StayOnTop 폼 뒤에 나온다구요?

음.. 그럴수도 있긴 합니다만..... 잘 나타나지는 않는데....

[원인]

StayOnTop으로 된 폼이
   WndParent가   Application->Handle이 아닌경우이거나
  또는   ExStyle이 ToolWindow일경우 이거나
  또는   ShowMessage 보다 늦게 Show가 호출되거나  등등에 그런 현상이 나타나곤 하는데...


ShowMessage 를 호출하면

    1) 내부적으로 TMessageForm 을 생성해서
    2) TMessageForm 을 ShowModal로 띄워줍니다.

그런데 VCL의 모든 폼은 WndParent가 기본적으로 Application->Handle입니다.

ShowMessage 를 하면
같은 WndParent가  Application->Handle 인 폼들중에서 맨 앞에 뜨게 됩니다.


[해결방법]
   방법1 . ShowMessage를 바로 호출하지 말고
            TMessageForm을 생성한후에
             내용을 집어놓고..
           TMessageForm을 StatOnTop으로 설정한후에
           ShowModal 해보세요

   방법2.
            ShowMessage를 쓰지 않고
           MessagBox를 써보세요
          MessageBox를 호출할때 맨첫번째가 현재 맨 탑에 있는 폼의 핸들을 넘겨주면
           그 폼 앞에 뜹니다.

         MessageBox( TopForm->Handle,"afdasfd","adfasfdafd",MB_YESBO);
          //뭐 이런식으로요..

   방법3.
         Screen 객체에보면 OnActiveFormChange 이벤트가 있습니다.
         Active폼이 바뀌면 이벤트가 발생하죠
         이 이벤트를 걸어두고
         OnActiveFormChange 이벤트 핸들러에서
         Active되는 폼의 classname이 "TMessageForm"이면
         그 폼을 StayonTop으로 바꿔주세요

  기타...
        그밖에도 여러가지 방법이 있을수 있습니다.

       얼마전에 델마당에 비슷한 질문이 올라와서 답변단적이 있는데 참고하시구요
http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=0&st=&keyword=&indx=408162&keyword1=&keyword2=&page=1



      
위 방법들중에  방법3을 추천 합니다.


void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Screen->OnActiveControlChange=OnScreenActiveFormChange;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnScreenActiveFormChange(TObject *Sender)
{
    if( Screen->ActiveForm!=NULL)
    {
        String sClsName=Screen->ActiveForm->ClassName();
        if(sClsName=="TMessageForm")
            SetWindowPos(Screen->ActiveForm->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ShowMessage("이 메세지 항상 Top으로 뜨나?");
}
//---------------------------------------------------------------------------




procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Screen.OnActiveFormChange:=OnScreenActiveFormChange; 
end; 

procedure TForm1.OnScreenActiveFormChange(Sender: TObject); 
begin 
  if Assigned(Screen.ActiveForm) and (Screen.ActiveForm.ClassName='TMessageForm') then 
      SetWindowPos(Screen.ActiveForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); 
end; 



그럼... 



장중섭 님이 쓰신 글 :
: FromSyle 속성을 fsStayOnTop로 할경우 ShowMessage가 뒤에 숨어 버리는 경우가 생깁니다.
:
: 제 컴퓨터에서는 위에 메시지가 뜨는데 다른 컴퓨터에서 뒤에 숨어 버리는 경우가 있습니다.
:
: ShowMessage뿐아니라 폼을 ShowModal() 했을 경우에도 뒤에 숨어서 뜨는 경우가 있네요
:
: 뭐때문인지 모르겠네요

+ -

관련 글 리스트
55271 FromSyle 속성을 fsStayOnTop로 할경우 ShowMessage가 뒤에 숨어 버리는 경우가 생깁니다. 장중섭 1661 2008/11/25
55272     Re:FromSyle 속성을 fsStayOnTop로 할경우 ShowMessage가 뒤에 숨어 버리는 경우가 생깁니다. 장성호 2460 2008/11/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.