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
[57226] Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다
장성호 [nasilso] 1777 읽음    2009-06-11 19:13
메인폼에서  => 그룹 설정폼  => 직원입력 및 검색폼 => 메세지 박스
이런식으로 띄운다구요

메인폼에서 => 그룹설정폼  띄울때
    Show로 하나요 ? 아니면 ShowModal로 띄우나요?

그룹 설정폼 에서  => 직원입력 및 검색폼 을 띄울때는 Show인가요?

질문으로 봤을때는 ..

그룹 설정폼  과  직원입력 및 검색폼 을 TaskBar(작업표시줄)에 나타나도록 수정하신것 같구
그룹 설정폼  과  직원입력 및 검색폼 두개다 띄울때 ShowModal이 아닌 Show로 띄우는것 같은데
맞습니까?

여기까지 상황에서는 어떤폼이 active되어있더라도
작업표시줄에서 다른 윈도우의 버튼을 클릭하면  그 폼이 Active 됩니다.

그런데 마지막 "메세지 박스"를 띄울때는
"메세지 박스"를 어떤 폼에서 띄웠다고 하더라도 ShowModal로 뜨기 때문에..
현재 쓰레드의 모든 폼이 disable됩니다.

이때는 작업표시줄에서 다른 폼을 선택하더라도 그 폼이 active되지 않습니다.
----------------------------------------------------------------

만약 메세지박스를 띄운폼이 그 폼에서만 Modal이 되게 하려면...

ShowMessage와 같은 것을 직접 만드시면 됩니다.
Win32API   "MessageBox" 는 쓰시면 안되구요

----------------------------------------------------------------
메세지 박스가 특정폼에서만 Modal이 되게하려면 ..
이건 약간 신경을 써야 하는데....

ShowModal의 원리를 이해하셔야 합니다.

ShowModal이란 (showModal함수 코드는?)

   1) 현재 쓰레드에 있는 모은 윈도우 핸들을 Disable시키고  메세지 박스만 띄웁니다.
   2) 그리고 메세지 박스가 Close될때까지(ModalResult가 none이 아닐때까지) 계속 대기하면서
       메세지 펌프 루프(while문 )를 돌립니다.
   3) 메세지박스가 clsoe되면 (또는 ModalResult가 None이 아니면) ..
       아까전에 diable시킨 모든 윈도우를 다시 Active시키고
       가장 최근에 Active되어있었던 폼에 Focus를 주고 함수를 빠져나옵니다.

-------------------------------------------------------------------
ShowModal이 위와같은 원리로 되어있는데..
특정 윈도우에 대해서만 Modal이 되려면
메세지 박스를 띄울때 쓰레드의 모든 윈도우를 disable시키는것이 아니라
메세지박스를 띄운 윈도우만 disable시키면 됩니다.                   ****************************>>>>> 핵심
문론 메세지 박스가 close될땐 해당 윈도우만 enable시키구요

이런식으로 ShowMessage를 새로 만들어서 사용하셔야 합니다.
제가 이해한것이 많다면  같은 쓰레드에서 특정 폼에서만 Modal로 되는 메세지 박스는
제가 알기로는 아직까지 VCL에서 지원하지 않습니다.

문론 Win32API도 지원하지 않구요..


즉 만들어 써야 합니다.

그럼..




조안 님이 쓰신 글 :
: 위의말은 문제가 되는걸 말하는게 아니라 현재 메시지창을 띄우는 방식을 말씀드린것입니다.
:
: 예를들어 설명하면. 직원관리 시스템에서
:
: 직원 입력및 검색하는 폼이있고
: 직원 그룹설정하는 폼이 있다고 하면
: 메인폼에서 그룹설정폼을 띄우고, 직원입력및검색 폼을 띄웁니다
:
: 그럼
:
: 메인폼위에 그룹설정폼,그위에 입력및검색 폼이 올라가 있는 상태가 되겠죠
: 그상황에서 직원입력폼에서 직원명을 입력해달라는 메시지박스를 띄웁니다.
:
: 그럼 메인폼과 그룹설정폼,입력및검색폼 모두 선택할 수는 없지만
: Alt+Tab 또는 윈도우 작업표시줄에서는 각 폼을 선택할수가 있게 되어있습니다
: 그럼 선택된 폼(그룹설정(이 최상위로 올라오게 되고. 메시지박스와 다른폼은 뒤로 밀려나게 됩니다.
: 그상황에서 다시 메시지박스를 띄웠던  직원입력폼을 다시 작업표시줄을 사용해 선택합니다.
: 그상황에서 메시지박스가 최상위로 올라왔으면 하나, 메시지박스는 여전히 직원입력폼,그룹설정폼 뒤에 위치하게 됩니다. 그래서 메시지박스 폼이 보이지않죠.
: 이상황에서 메인입력폼을 선택하게 되면 메시지박스가 최상위로 나옵니다. 이부분이 왜그런지 아직 잘 모르겠네요.
:
: 그리고 두번째로. 메인폼에서 아무폼이나 하나 띄운뒤
: 아무것도 하지않고 다시 메인폼을 선택하면, 메인폼이 최상위로 와야하는데
: 최상위로 오지않고 액티브상태만 되게 됩니다.
: 그럼 띄운폼에 가려서 메인폼에서 작업을 할 수가 없게되죠.
:
: 제가좀 두서없이 말을 하네요. 어떻게 설명을 드려야할지 잘 모르겠어서
:
: 부족하시면 그림으로 그려서 올려보겠습니다..
:
: 장성호 님이 쓰신 글 :
: : : 메인 폼이 뜨고. 그위에 차일드폼을 띄우고. 그위에 얼럿이 뜨거나. 세부폼이 한번더뜨고 그위에 얼럿이뜨는
: : : 그런형식으로 짜여져 있습니다
: :
: : 위 말이 무슨 말인지 잘 모르겠네요...
: :
: : ShowMessage나 MessageBox를 사용하면
: : 현재 Thead즉 메인쓰레드에서 는 메세지 박스가 Modal 로 뜨는것 아시죠?
: : 메세지 박스를 닫기 전까지는 다른 폼을 선택할수 없습니다.
: :
: : --------------------------------------------------------------------------------
: : 그리고 중요한 사실한가지가 있는데요
: : 왜 저런 현상이 나타나는가 하니..
: : VCL에서는  작업표시줄에 나타나는 Application버튼이 메인윈도우 핸들에 해당하는 버튼이 아닙니다.
: : (2005이상에서는 조절 가능)
: :
: : 작업표시줄에 나타나는 버튼은 Application->Handle입니다.
: : VCL에서 만든 모든 폼은 Application->Handle을  Params.WndParent 으로 가지게 됩니다.
: : 메인폼이나 다른 폼이나 모두  Application->Handle을 WndParent로 가지게 되는것입니다.
: :
: : 만약 sub-form의 WndParent는 메인폼->Handle로 되면
: : sub-form은 항상 메인폼 앞에 만 오죠(2005이상에서는 옵션으로 가능합니다.)
: :
: :
: : Win32API MessageBox는
: : http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx
: : 첫번째 인자가 HWND입니다.
: :
: : MessageBox(..ActiveForm->Handle , ...) 이렇게 하면 되게죠..
: :
: : 그리고 아래 child 의 변경은
: :    Params.WndParent = GetDesktopWindow();
: :  child폼을 작업표시줄에 버튼이 나타나게 하기 위한것 같네요.
: :
: : 그럼...
: :
: :
: : 조안 님이 쓰신 글 :
: : : 이전 글 : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=57169
: : :
: : : 답해주신 장성호님 감사합니다.
: : :
: : : 장성호님 말씀대로 시도해보다가. createparams 에서
: : :
: : :
: : : void __fastcall TfrmF_014::CreateParams(TCreateParams &Params)
: : : {
: : :     TForm::CreateParams(Params);
: : :     Params.ExStyle = WS_EX_APPWINDOW;
: : : //    Params.WndParent = GetDesktopWindow(); //Before
: : :     Params.WndParent = Screen->ActiveForm->Handle; //After
: : : }

: : :
: : : Before 를 After 로 고쳐서 해결보았습니다.
: : :
: : : 그러나 여기서 문제가 발생했습니다
: : :
: : : 메인 폼이 뜨고. 그위에 차일드폼을 띄우고. 그위에 얼럿이 뜨거나. 세부폼이 한번더뜨고 그위에 얼럿이뜨는
: : : 그런형식으로 짜여져 있습니다
: : :
: : : 그러나 createparams 를 고치니 차일드 폼에 액티브가 가있는상태에서 메인폼에 액티브를 줘도, 스크린폼이 뒤로가지 않아 메인폼을 확인할수가 없더군요.(한마디로 차일드폼이 stay on top 이 되어있는 것과 같이 동작)
: : : 물론 모든 폼의 FormStyle 은 fsNormal 입니다.
: : :
: : : 참고로 메인폼은 createparams 를 코딩하지 않았습니다.
: : :
: : : 게다가 페어런트를 액티브폼으로 바꿔주었는데도. 차일드폼에서 띄운 메시지창이 다른 차일드폼에 의해서 가려졌을때,
: : : 메인창을 선택해야만 (윈도우 바 or Alt+Tab) 메시지창이 뜨고, 메시지창을 띄운 차일드폼을 선택해도
: : : 메시지창이 뒤에있게됩니다.
: : :
: : :
: : : 페어런트 설정에서 뭔가 잘못이 있었는건지. 순서의 잘못인지. 잘모르겠네요
: : :
: : : 또다시 염치불구하고 질문을 드립니다. 도와주세요 ^^

+ -

관련 글 리스트
57217 메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1677 2009/06/11
57219     Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1419 2009/06/11
57220         Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1440 2009/06/11
57226             Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1777 2009/06/11
57231                 Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1458 2009/06/12
57233                     Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 2757 2009/06/12
57234                         Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1750 2009/06/12
57236                             Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1987 2009/06/12
57237                                 Re:Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 2359 2009/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.