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
[57220] Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다
조안 [] 1441 읽음    2009-06-11 14:55
위의말은 문제가 되는걸 말하는게 아니라 현재 메시지창을 띄우는 방식을 말씀드린것입니다.

예를들어 설명하면. 직원관리 시스템에서

직원 입력및 검색하는 폼이있고
직원 그룹설정하는 폼이 있다고 하면
메인폼에서 그룹설정폼을 띄우고, 직원입력및검색 폼을 띄웁니다

그럼

메인폼위에 그룹설정폼,그위에 입력및검색 폼이 올라가 있는 상태가 되겠죠
그상황에서 직원입력폼에서 직원명을 입력해달라는 메시지박스를 띄웁니다.

그럼 메인폼과 그룹설정폼,입력및검색폼 모두 선택할 수는 없지만
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 메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1678 2009/06/11
57219     Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1421 2009/06/11
57220         Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1441 2009/06/11
57226             Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1779 2009/06/11
57231                 Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1460 2009/06/12
57233                     Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 2759 2009/06/12
57234                         Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1752 2009/06/12
57236                             Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1989 2009/06/12
57237                                 Re:Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 2361 2009/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.