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
[64748] Re:Re:Re:Re:안 됩니다 ^^
아제나 [azena] 1252 읽음    2011-07-05 09:58
자세한 답변 감사합니다.

MainFormOnTaskBar가 그런 의미였군요.

이름대로 false로 설정하면 TaskBar에서 사라지는 줄 알았습니다 ^^





장성호 님이 쓰신 글 :
: 음...
:
: 답변은 간단한데... 설명을 하려니 길어질듯...
:
: @ 방법1
:
: 
: WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
: {
: 	try
: 	{
: 		Application->Initialize();
: // 다음과 같이 MainFormOnTaskBar=false로 해주세요
: 		Application->MainFormOnTaskBar = false;
: 
:                 }
: }
: 
: 

:
:
: 님께서 쓰시는 버젼이 아마 RAD2007  이후 버젼일듯 하네요
:
:
: 지식1)
: 구 버젼에서는 어플의 MainForm이 실제 메인폼이 아니었습니다.
: Application->Handle이 실제 MainForm이었습니다.
: 실제 Windows작업표시줄(TaskBar)에 나타나는 버튼이 Application->Handle 이었죠
:
: 지식2)
: RAD2007이후 버젼에서는
: 코딩해서 Application->Handle로 할것인지
: Application->MainForm->Handle로 할것인지 결정해줄수 가 있습니다.
:
: 그것이 프로젝트.cpp의 WinMain에서 결정해줄수가 있구요
:
: 지식3)
:   메인폼은 어떻게 결정되나?
:   Application->CreateForm 함수로 생성되는 첫번째 TCustomForm을 상속받은 폼이 MainForm이 됩니다.
:  
:  
: 지식4)
:   왜 모든 Form이 MainForm->Handle위에 나타나는가?
:   그것은 SubForm(MainForm보다 늦게 생성된는 폼)들이 생성될때
:   WndParent를 MainForm->Handle로 기본적으로 설정해주기 때문입니다.
:   TCustomForm 클래스 코드에 있을것입니다
:  
:   WndParent가 windows(os) 화면에 나타나는 Z-Order랑 연관된 놈이 거든요
:
:
:
: @방법2
:    위에 나열한  특징을 이해했다면
:    Application->MainFormOnTaskBar = true; 로 해두고서라도..
:    특정subForm을 MainForm보다 뒤로 가게 할수 있습니다.
:  
:    그것은 SubForm  클래스에서 CreateParams 함수를 Override하여서 WndParent를 바꿔줘 버리면 됩니다.
:
:  
: void __fastcall TForm2::CreateParams(TCreateParams &Params)   
: {   
:     TForm::CreateParams(Params);   
:     Params.WndParent = 0; //뭐 이런식으로요
: }  
: 
: 

:
: 응용
: 새로만드는 폼이 특정폼앞에 항상 나타나게 하고 싶다면
: 위 코드에서 Wndparent를 특정폼.Handle로 설정해주시면 됩니다.
:
:
: 그럼..
:
:
: 아제나 님이 쓰신 글 :
: : 일단 프로젝트를 마무리 해야해서 잡스러운 방법으로 해결을 하였는데요.
: :
: : SubForm들은 서로 겹치기가 잘 되더라고요. BringToFront() 같은 것으로 하면 맨 위로 잘 올라오고요.
: :
: : 그래서 원래는 아래와 같이
: :
: : MainForm -> SubForm 이런 방식인데...
: :
: : 더미 폼을 하나 만들어서...
: :
: : StarterForm -> MainForm -> SubForm
: :
: : 이런 식으로 처리가 되도록 하였습니다.
: :
: : StarterForm 이라고 실제로 화면에 출력되진 않지만,
: :
: : 빌더에 메인폼으로 등록만 되는 폼을 하나 만들고,
: :
: : 이 폼의 역할은 MainForm->Show() 하는 것 이외에는 아무것도 하는 일이 없죠.
: :
: : MainForm 에서 어떤 폼을 생성해도 TApplication 입장에선 같은 창이다보니
: :
: : 서브 폼들보다 아래로 나오게도 되고 위로 나오게도 되고 잘 되더군요 ^^
: :
: : 그런데 장성호님의 오래전 답변을 보니,
: :
: : 이런 삽질법 말고 on/off 시키는 방법이 있는거 같은데... =_=
: :
: : 아시는 분은 답변 부탁드려요 ^^
: :
: :
: :
: : 이용태 님이 쓰신 글 :
: : : 빌더 6.0에선 잘되는데 빌더 2010에서는 진짜 안되네요..;;;
: : :
: : : 게시판 열심히 달려보니.. 대부분의 유저분들이 아제나님과는 반대의 기능(항상 서브폼이 메인폼위에 올라가게)을 질문하셨던데요...;;
: : :
: : :
: : : 항상 메인폼 서브폼보다 위에 있게 하는 방법에 대해 이것저것 시도해봤는데 잘 안되더라구여.. ;;
: : :
: : :
: : :
: : :
: : : 그래서 조금 꼼수를 생각해봤는데요.. 그냥 잠깐 생각해본겁니다..;;; 효용성이 있을지는 모르겠고요..;;
: : :
: : :
: : : 폼 2개를 만듭니다.
: : : Form1 <--- 메인폼
: : : Form2 <--- 서브폼
: : :
: : : 각 폼에 Panel 하나씩 만듭니다. Form1 -> Panel1, Form2 -> Panel2
: : :
: : : Form1에 버튼 하나 올려놓고.. 버튼 클릭시 Form1위에 Form2가 올라가는데요..
: : : Form2위로 Form1이 안올라가니까.. 요걸 올라간것처럼 보이기 위해 각 폼에 있는 패널을 바꿔치기 하는거죠.
: : :
: : : 즉 각 폼에 있는 패널의 부모 포인터를 바꿔치기 하면...
: : : TForm1에 있던 Panel1이 TForm2에 올라가고, TForm2에 있던 Panel2가 TForm1으로 이동하니 겉보기엔 항상 TForm1의 Panel1이 항상 위에 보이는 것처럼 보인다는거죠.
: : :
: : : 물론 TForm2가 닫히면.. TForm2에 있던 Panel1의 부모 포인터는 다시 TForm1으로 되돌려 놔야 겠죠..
: : :
: : : 대충 테스트 해보니 되긴 하는데요.. 출력되는 서브 폼이 많아지면... 예외처리가... 쿨럭;;;;
: : :
: : :
: : :
: : :
: : :
: : :
: : : 아제나 님이 쓰신 글 :
: : : : 작성하신대로 코드를 해도 안 됩니다.
: : : :
: : : : 빌더 버젼에 따라서 다른 모양입니다...
: : : :
: : : : 검색 결과 빌더 2007 이후로 서브폼이 항상 메인폼 위에 올라가도록 되었다고 변경되었다는데
: : : :
: : : : 어떻게 해야지 그것을 끌 수 있는지는 찾을 수 없네요.
: : : :
: : : :
: : : :
: : : :
: : : :
: : : : 이용태 님이 쓰신 글 :
: : : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : :  {
: : : : :    TForm *nf;
: : : : : 
: : : : :    nf = new TForm(Application);
: : : : : 
: : : : :    nf->Show();
: : : : :
: : : : :    this->Show();  //<----- 요렇게 함 해보시죠...
: : : : :  }
: : : : :
: : : : : 테스트 해보니 메인폼이 동적폼 보다 앞에 위치하네요..
: : : : : this->Show()를 적절히 조합하시면 되지 않을까요?
: : : : :
: : : : :
: : : : :
: : : : : 아제나 님이 쓰신 글 :
: : : : : : 동적으로 생성한 서브 폼이 메인 폼 보다 항상 위에 배치되는군요.
: : : : : :
: : : : : : 서브 폼이 클 경우에 메인 폼을 가려버리는데, 메인 폼을 위로 올릴 방법이 없네요.
: : : : : :
: : : : : : 모달 폼도 아닌데 이유를 모르겠네요 =_=
: : : : : :
: : : : : : 서브 폼 위로 메인 폼을 띄울 방법이 있을까요?
: : : : : :
: : : : : : 테스트 코드는 아래와 같습니다.
: : : : : :
: : : : : : 새로 생성한 *nf 폼이 항상 Form1 위에 올라가게 됩니다.
: : : : : :
: : : : : :
: : : : : :
: : : : : :
: : : : : :
: : : : : : 
: : : : : : //---------------------------------------------------------------------------
: : : : : : 
: : : : : : #include 
: : : : : : #pragma hdrstop
: : : : : : 
: : : : : : #include "Unit1.h"
: : : : : : //---------------------------------------------------------------------------
: : : : : : #pragma package(smart_init)
: : : : : : #pragma resource "*.dfm"
: : : : : : TForm1 *Form1;
: : : : : : //---------------------------------------------------------------------------
: : : : : : __fastcall TForm1::TForm1(TComponent* Owner)
: : : : : :   : TForm(Owner)
: : : : : : {
: : : : : : }
: : : : : : //---------------------------------------------------------------------------
: : : : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : : : {
: : : : : :   TForm *nf;
: : : : : : 
: : : : : :   nf = new TForm(Application);
: : : : : : 
: : : : : :   nf->Show();
: : : : : : }
: : : : : : //---------------------------------------------------------------------------
: : : : : : 
: : : : : : 

+ -

관련 글 리스트
64717 동적 생성한 서브 폼이 항상 메인 폼 위에 위치하지 않도록 하는 법 아제나 1167 2011/06/30
64718     Re:동적 생성한 서브 폼이 항상 메인 폼 위에 위치하지 않도록 하는 법 이용태 1735 2011/06/30
64719         안 됩니다 ^^ 아제나 930 2011/06/30
64720             Re:안 됩니다 ^^ 이용태 1003 2011/06/30
64721                 Re:Re:안 됩니다 ^^ 아제나 1086 2011/06/30
64742                     Re:Re:Re:안 됩니다 ^^ 장성호 1501 2011/07/04
64748                         Re:Re:Re:Re:안 됩니다 ^^ 아제나 1252 2011/07/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.