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() 했을 경우에도 뒤에 숨어서 뜨는 경우가 있네요
:
: 뭐때문인지 모르겠네요