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
[57237] Re:Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다
조안 [] 2360 읽음    2009-06-12 17:02
감사합니다

구세주님 +_+ 드디어 해결본듯.. 다른에러도 찾아봐야겠지만 현재까지는 정상작동하네요.

밥이라도 한끼 사드려야 되는건 아닌지...ㅋ


장성호 님이 쓰신 글 :
: 그건 ShowMessage를 항상 최상위에 뜨게 하면될듯한데요
: 다름 링크에 해결방법2를 이용해보세요
: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=824
:
: 님께서는  스킨 컴포넌트를 쓰시니까..
: classname에 해당 Compoent 의 클래스이름도 or 로 추가해줘야 할듯...
:
: 그럼..
:
:
: 조안 님이 쓰신 글 :
: : 항상 자세한 답변에 감사드립니다!
: :
: : 쉬운 해결방법으로 적용했더니. 메인화면이 안올라오는 문제는 수정되었습니다.
: : 그러나 아직 태스크바 선택이나 알트탭 선택으로 메시지창이 뒤로 숨어버리는 문제는 해결이안되네요
: :
: : 메시지창을 미리 만든뒤에 stay on top 시켜서 그위에 메시지를 덮어써서 띄우면 될거같은데
: : 그렇게 하려니 내공이 너무 부족하네요..
: : 컴포넌트를 가져다 쓰는것도 허덕거리는마당에 ㅜㅜ
: :
: : 태스크바나 알트탭에서도 아예 선택이 안되도록 하는방법은 없을까요?
: : 또는 현재 뜬 메시지창의 값을 알아내서 stay on top 시켜버리던가 하는 방법이던지요..
: :
: :
: :
: :
: : 장성호 님이 쓰신 글 :
: : : VCL에서는
: : : 메인폼(Application->MainForm)은
: : :    Application->CreateForm 이라는 함수로 제일먼서 생성한 폼이 메인폼이 됩니다.
: : :   
: : :    그런데 작업표시줄에 나타나는 버튼은 Application->MainForm의 버튼이 아니라
: : :    Application->Handle이라는 보이지 않는 윈도우의 버튼입니다.
: : :    참조 http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=602
: : :
: : :    VCL에서는 Application->Handle로 들어오는 메세지중 일부를
: : :    Application->MainForm->Handle 보내버리죠
: : :    메인폼과 Application은 매우 유착관계에 있습니다.
: : :
: : : ShowMessage도 T
: : :      MessageForm이라는 TForm을 상속받은 폼을 ShowModal한것 뿐인데요...
: : :
: : :
: : : VCL에서 생성하는 모든 폼은 기본적으로 WndParent를 Application->Handle로 설정되게 됩니다.
: : :
: : : 님께서 sub-form도 작업표시줄에 나타나도록 CreateParams를 에서 수정하셨다면..
: : :     http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=18
: : :
: : : 메세지 박스 (ShowMessage) 뿐만 아니라 몇가더 문제가 발생합니다.
: : :    1. ShowMessage문제
: : :    2. Hint문제
: : :       (서브폼에서 hint가 뜰때 메인폼이 앞으로 튀어나옴)
: : :    3. OpenDialog같은 공통Dialog를 열때..
: : :      (서브폼에서 opendialog를 띄울때 메인폼이 앞으로 튀어나옴)
: : :     기타..
: : :
: : : 이 모든 경우가 새로띄우는 윈도우의 WndParent기 기본적으로 Application->Handle로 되기때문입니다.
: : :
: : : CBuilder 및 Delphi버젼이 2005이상인경우에는
: : :   Application->ModalPopupMode 라는것을 이용해서 문제를 해결할수 있습니다.
: : :    http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=748
: : :    http://www.codeway.co.kr/board/bbs/board.php?bo_table=Delphi_QNA&wr_id=4528&page=&sca=&sfl=&stx=&spt=&page=&cwin=#c_4543
: : :
: : :
: : : 그런데 CBuilder6 이하 Delphi7 이하의 경우 직접 해결해야 합니다.
: : :    
: : : 간단한  해결방법은?
: : :      * 메인폼의 WndParent도 Application->Handle이 아니라 GetDesktopWindow로 설정하구
: : :         메인폼이 Show될때  Application->Handle을 Hide시켜 버립니다.
: : :
: : : 또다른 해결방법은?
: : :     * ShowMessage의 경우
: : :         TMessageForm을 새로만들어서  TMessageForm의 WndParent를 변경해줘야 하구요
: : :
: : :     * Hint의 경우 에도
: : :          THintWindow클래스를 상속받아서 hint윈도우를 새로 만들고 (예 THintWindowEx )
: : :          hint윈도우의  WndParent를 변경해줘야 합니다.
: : :          그리고 Application에서 Hint를 띄우는데
: : :                 힌트 띄울때 직접만든 hint-class를 사용하도록 HINTWINDOWCLASS를 지정해주면 됩니다.
: : :   
: : :     * 그리고 OpenDialog도
: : :         직접 Comdlg32.dll에 있는 GetOpenFileNameA 를 사용해서 직접 만드시면 되구요...
: : :
: : :  
: : : 님께서 원하는게 정확하게 뭔지 잘 이해가 안가는데..
: : : 여튼 메인폼위에 다른 폼을 작업표시줄에 나타나게 하면 위와같은 문제가 발생할수 있습니다. 
: : :
: : : 그럼...
: : : 
: : :
: : : 조안 님이 쓰신 글 :
: : : : 그룹설정폼과 직원입력및검색폼은 동일 레벨에 존재하는 폼입니다
: : : : 둘다 메인폼에서 띄우고요
: : : : Show 로 띄우고 있습니다.
: : : :
: : : : 이상황에서 메시지 박스를 띄워도
: : : : 다른폼에 포커스가 갈수가 있습니다;
: : : : 제가말했던 alt+tab 이나 taskbar 선택에 의해서요
: : : : 물론 disabled 되어있어서 클릭도안되고 아무것도 안되나
: : : : 포커스는 가게되고, 맨앞으로 오게됩니다.(메인은 안오구요)
: : : :
: : : : 그리고 메인에 다시 포커스를 줘야만 메시지창이 제일위로 올라오게됩니다.
: : : :
: : : : 메시지창은 ShowModal 로 띄우고 있구요
: : : :
: : : : 대신 메시지창은 함수를 쓰는게 아니고 컴포넌트를 사용하는 방식이라
: : : : HWND 를 설정할 수 없는듯합니다.
: : : :
: : : : 현재 createParams 에
: : : : Params.WndParent = GetDesktopWindow(); 이게 모두 주석처리가 되어있는데
: : : : 태스크바에서 없어지지 않고 뜹니다(일부러 뜨게 코딩해놓은듯..)
: : : :
: : : : 지금 현재의 문제점 두개는
: : : :
: : : : 1.차일드폼이 메인폼위에 스태이온탑으로 올라가버립니다.
: : : :  -createparams 에서 screen->active->handle = wndparent 로 바꾸기 전에는
: : : : 메인폼에 포커스가 가면 메인폼이 최상위로 왔습니다.
: : : : 어느부분을 수정해야 할 지 잘 모르겠네요
: : : :
: : : : 2.메시지박스가 뜰때 다른 폼을 태스크바 or Alt+Tab 으로 선택하면 메시지박스가 가려집니다.
: : : : 항상 나오던지(Stay on Tob), 아니면 메시지박스를 띄운 폼을 클릭할시 나오던지
: : : : 둘중에 하나가 되야하는데. 이것도 잘 모르겠네요.
: : : :
: : : : 써주신것중에 답이 있을지도 모르지만. 여러번 읽어보았는데 아직 이해가 잘 안갑니다.
: : : : 귀찮으시겠지만 한번더 자세한 설명 부탁드립니다.
: : : :
: : : : 현재 메시지박스를 만들어서 쓸수는 없는 상황이나
: : : : 컴포넌트를 조금 수정해서 해결할 수 있는 문제라고 한다면 컴포넌트는 수정 할 수 있습니다.
: : : :
: : : : 아래 메시지박스를 띄우는 컴포넌트를 올리겠습니다
: : : :
: : : :
: : : : int __fastcall TUCommon::Get_MessageBox(AnsiString Msg, AnsiString Caption, 
: : : :                                          TMsgDlgType DlgType, TMsgDlgButtons Buttons) 
: : : : { 
: : : :     int rtn_value; 
: : : : 
: : : :     TbsSkinMessage *My_MsgBox; 
: : : : 
: : : :     My_MsgBox = new TbsSkinMessage(Application); 
: : : : 
: : : :     My_MsgBox->CtrlSkinData = MySkin; 
: : : :     My_MsgBox->SkinData     = MySkin; 
: : : :     My_MsgBox->UseSkinFont  = false; 
: : : :     My_MsgBox->DefaultButtonFont = MyFont; 
: : : :     My_MsgBox->DefaultFont       = MyFont; 
: : : : 
: : : :     rtn_value = My_MsgBox->MessageDlg2(Msg, Caption, DlgType, Buttons, 0); 
: : : : 
: : : :     delete My_MsgBox; 
: : : : 
: : : :     return rtn_value; 
: : : : } 
: : : : 
: : : : 

: : : :
: : : :
: : : : function TbsSkinMessage.MessageDlg2;
: : : : begin
: : : :   with CreateMessageDialog2(Msg, ACaption, DlgType, Buttons,
: : : :        FSD, FCtrlFSD, FButtonSkinDataName,
: : : :        FMessageLabelSkinDataName, FDefaultFont, FDefaultButtonFont, FUseSkinFont,
: : : :        FAlphaBlend, FAlphaBlendAnimation, FAlphaBlendValue, FShowAgainFlag, FShowAgainFlagValue,
: : : :        -10001, -10001) do
: : : :   begin
: : : :     try
: : : :       HelpContext := HelpCtx;
: : : :       Result := ShowModal;
: : : :     finally
: : : :       if DisplayCheckBox <> nil
: : : :       then
: : : :         begin
: : : :           Self.ShowAgainFlagValue := not DisplayCheckBox.Checked;
: : : :         end;
: : : :       Free;
: : : :     end;
: : : :   end;
: : : : end;
: : : : 

: : : :
: : : :
: : : : function CreateMessageDialog2(const Msg: string; ACaption: String;
: : : :   DlgType: TMsgDlgType;
: : : :   Buttons: TMsgDlgButtons; ASkinData, ACtrlSkinData: TbsSkinData;
: : : :   AButtonSkinDataName: String;  AMessageLabelSkinDataName: String;
: : : :   ADefaultFont: TFont; ADefaultButtonFont: TFont; AUseSkinFont: Boolean;
: : : :   AAlphaBlend, AAlphaBlendAnimation: Boolean; AAlphaBlendValue: Byte;
: : : :   AShowAgainFlag, AShowAgainFlagValue: Boolean; MX, MY: Integer): TbsMessageForm;
: : : : var
: : : :   BI, ButtonWidth,
: : : :   ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, X, Y: Integer;
: : : :   B, DefaultButton, CancelButton: TMsgDlgBtn;
: : : :   IconID: PChar;
: : : :   W: Integer;
: : : : begin
: : : :   Result := TbsMessageForm.CreateEx(Application, MX, MY);
: : : :   with Result do
: : : :   begin
: : : :     with BSF do
: : : :     begin
: : : :       SkinData := ASkinData;
: : : :       MenusSkinData := ACtrlSkinData;
: : : :       AlphaBlend := AAlphaBlend;
: : : :       AlphaBlendAnimation := AAlphaBlendAnimation;
: : : :       AlphaBlendValue := AAlphaBlendValue;
: : : :     end;
: : : : 
: : : :     ButtonWidth := 70;
: : : :     //
: : : :     if (ACtrlSkinData <> nil) and (not ACtrlSkinData.Empty)
: : : :     then
: : : :       begin
: : : :         BI := ACtrlSkinData.GetControlIndex(AButtonSkinDataName);
: : : :         if (BI <> -1) and
: : : :            (TbsDataSkinControl(ACtrlSkinData.CtrlList.Items[BI]) is TbsDataSkinButtonControl)
: : : :         then
: : : :           begin
: : : :             with TbsDataSkinButtonControl(ACtrlSkinData.CtrlList.Items[BI]) do
: : : :              ButtonHeight := SkinRect.Bottom - SkinRect.Top;
: : : :           end
: : : :         else
: : : :           ButtonHeight := 25;
: : : :       end
: : : :     else
: : : :       ButtonHeight := 25;
: : : :     //
: : : :     ButtonSpacing := 10;
: : : : 
: : : :     ButtonCount := 0;
: : : :     for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
: : : :       if B in Buttons then Inc(ButtonCount);
: : : : 
: : : :     ButtonGroupWidth := 0;
: : : :     if ButtonCount <> 0 then
: : : :       ButtonGroupWidth := ButtonWidth * ButtonCount +
: : : :         ButtonSpacing * (ButtonCount - 1);
: : : : 
: : : :     Caption := ACaption;
: : : : 
: : : :     // add label
: : : :     Result.Message := TbsSkinStdLabel.Create(Result);
: : : :     with Result.Message do
: : : :     begin
: : : :       Font := ADefaultFont;
: : : :       DefaultFont := ADefaultFont;
: : : :       UseSkinFont := AUseSkinFont;
: : : :       SkinDataName := AMessageLabelSkinDataName;
: : : :       SkinData := ACtrlSkinData;
: : : :       Name := 'Message';
: : : :       Parent := Result;
: : : :       AutoSize := True;
: : : :       Caption := Msg;
: : : :       Left := 50;
: : : :       Top := 15;
: : : :       X := Left + Width;
: : : :     end;
: : : : 
: : : :     IconID := IconIDs[DlgType];
: : : :     with TImage.Create(Result) do
: : : :       begin
: : : :         Name := 'Image';
: : : :         Parent := Result;
: : : :         Picture.Icon.Handle := LoadIcon(0, IconID);
: : : :         Y := Result.Message.Top + Result.Message.Height div 2 - 16;
: : : :         if Y < 10 then Y := 10;
: : : :         SetBounds(5, Y, 32, 32);
: : : :       end;
: : : : 
: : : :     ClientHeight := 50 + ButtonHeight + Result.Message.Height;
: : : : 
: : : :     if ButtonGroupWidth < X
: : : :     then
: : : :       ClientWidth := X + 40
: : : :     else
: : : :       ClientWidth := ButtonGroupWidth + 40;
: : : : 
: : : : 
: : : :     // "Do not display this message again" flag
: : : : 
: : : :     if AShowAgainFlag
: : : :     then
: : : :       begin
: : : :         ClientHeight := ClientHeight + 40;
: : : :         Result.DisplayCheckBox := TbsSkinCheckRadioBox.Create(Result);
: : : :         with Result.DisplayCheckBox do
: : : :         begin
: : : :           Name := 'checkbox';
: : : :           DefaultHeight := 30;
: : : :           Checked := not AShowAgainFlagValue;
: : : :           Parent := Result;
: : : :           DefaultFont := ADefaultFont;
: : : :           UseSkinFont := AUseSKinFont;
: : : :           SkinData := ACtrlSkinData;
: : : :           Y := Result.ClientHeight - ButtonHeight - 50;
: : : :           if (ACtrlSkinData <> nil) and (ACtrlSkinData.ResourceStrData <> nil)
: : : :           then
: : : :             begin
: : : :               Caption := ACtrlSkinData.ResourceStrData.GetResStr('MSG_CAP_SHOWFLAG');
: : : :               if Caption = '' then Caption := BS_MSG_CAP_SHOWFLAG;
: : : :             end
: : : :           else
: : : :             Caption := BS_MSG_CAP_SHOWFLAG;
: : : :           if (FIndex <> -1) and UseSkinFont
: : : :           then
: : : :             begin
: : : :               Result.Canvas.Font.Name := FontName;
: : : :               Result.Canvas.Font.Height := FontHeight;
: : : :             end
: : : :           else
: : : :             Result.Canvas.Font.Assign(ADefaultFont);
: : : :           W := Result.Canvas.TextWidth(Caption);
: : : :           W := W + 30;
: : : :           if Result.ClientWidth < W + 30 then Result.ClientWidth := W + 30;
: : : :           SetBounds(5, Y, W + 25, DefaultHeight);
: : : :         end;
: : : :       end;
: : : : 
: : : :     if Width > Result.BSF.GetMaxWidth
: : : :     then
: : : :       Width := Result.BSF.GetMaxWidth
: : : :     else
: : : :     if Width < Result.BSF.GetMinWidth
: : : :     then
: : : :       Width := Result.BSF.GetMinWidth;
: : : : 
: : : :     // add buttons
: : : :     if mbOk in Buttons then DefaultButton := mbOk else
: : : :       if mbYes in Buttons then DefaultButton := mbYes else
: : : :         DefaultButton := mbRetry;
: : : :     if mbCancel in Buttons then CancelButton := mbCancel else
: : : :       if mbNo in Buttons then CancelButton := mbNo else
: : : :         CancelButton := mbOk;
: : : :     X := (ClientWidth - ButtonGroupWidth) div 2;
: : : :     for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
: : : :       if B in Buttons then
: : : :         with TbsSkinButton.Create(Result) do
: : : :         begin
: : : :           Parent := Result;
: : : :           Name := ButtonNames[B];
: : : :           CanFocused := True;
: : : :           Caption := GetButtonCaption(B, ACtrlSkinData);
: : : :           ModalResult := ModalResults[B];
: : : :           if B = DefaultButton then Default := True;
: : : :           if B = CancelButton then Cancel := True;
: : : :           DefaultHeight := ButtonHeight;
: : : :           SetBounds(X, Result.ClientHeight - ButtonHeight - 10,
: : : :             ButtonWidth, ButtonHeight);
: : : :           DefaultFont := ADefaultButtonFont;
: : : :           UseSkinFont := AUseSkinFont;
: : : :           Inc(X, ButtonWidth + ButtonSpacing);
: : : :           if B = mbHelp then
: : : :             OnClick := Result.HelpButtonClick;
: : : :           SkinDataName := AButtonSkinDataName;
: : : :           SkinData := ACtrlSkinData;
: : : :         end;
: : : :   end;
: : : : end;
: : : : 

: : : :
: : : : 장성호 님이 쓰신 글 :
: : : : : 메인폼에서  => 그룹 설정폼  => 직원입력 및 검색폼 => 메세지 박스
: : : : : 이런식으로 띄운다구요
: : : : :
: : : : : 메인폼에서 => 그룹설정폼  띄울때
: : : : :     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:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1420 2009/06/11
57220         Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1441 2009/06/11
57226             Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1778 2009/06/11
57231                 Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1460 2009/06/12
57233                     Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 2758 2009/06/12
57234                         Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 1751 2009/06/12
57236                             Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 장성호 1989 2009/06/12
57237                                 Re:Re:Re:Re:Re:Re:Re:Re:메세지창 팝업 문제에 대해 한번더 질문합니다 조안 2360 2009/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.