C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[774] [Forms] Modal폼을 띄울때 Disable되는 폼을 Gray톤으로 - 2
장성호 [nasilso] 8625 읽음    2008-06-10 19:13
올초에   Modal폼을 띄울때 Disable되는 폼을 Gray톤으로 바꾸는 팁을 올린적이 있다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=742

위 방식은

Modal폼을 띄울때

  - GetFormImage 로 image를 얻어와서
  - image를 gray톤을 바꾼후에
  - 현재 폼위에 Panel을 올려 그려준후에
  - Modal폼을 띄우는 방식이었다.


위 방식의 단점은?
1. WebBroswer 나 Flash같은 OCX가 올라가 있는 경우 , 또는 DXShow화면인경우 등에는
   해당 화면이 캡쳐가 안되어서 제대로된 Gray톤 이미지를 못보여준다.
2. Form이 클경우 미세하지만 gray톤을 image를 변환하는데 시간이 소요된다.
3. 범용적이지 못하다.
   즉 Modal폼을 띄우는 모든곳에 적용하려면 ShowModal하는 곳마다 붙여넣기 해야 한다.


위와 같은 문제를 해결할 아주 심플한 방법이 있습니다.

[원리]
원리는

1.  Application의 OnModalBegin 이벤트와 OnModalEnd 이벤트 핸들러를 이용하는 방식입니다.
    OnModalBegin 과 OnModalEnd는
    Application에서 특정 폼이 Modal로 뜰때와 close될때 발생하는 이벤트 핸들러 입니다.

2. 투명폼을 이용합니다.
   무슨 말이냐 하면 메인폼과 모달폼 사이에 투명폼을 메인폼과 같은 크기로 올리는것입니다.
   투명도는 50%(또는 적당히) 주구요

폼을 띄우기전


모달폼을 띄운후

보통 모달폼을 띄우면 다른 폼은 Caption만 DeActive되는데 폼 전체가 회색으로 바뀜


메인폼에서는 아래와 같이.. 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	Application->OnModalBegin=AppModalBegin;
	Application->OnModalEnd=AppModalEnd;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppModalBegin(TObject *Sender)
{
	GrayForm->Display();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppModalEnd(TObject *Sender)
{
	GrayForm->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Form3->ShowModal();
}
//---------------------------------------------------------------------------





그리고 GrayForm은?
void __fastcall GrayForm::FormCreate(TObject *Sender)
{
	AlphaBlend=true;
	AlphaBlendValue=128;
	BorderStyle=bsNone;
}
//---------------------------------------------------------------------------
void __fastcall GrayForm::Display()
{

	Left=Application->MainForm->Left;
	Top=Application->MainForm->Top;
	Width=Application->MainForm->Width;
	Height=Application->MainForm->Height;
	Show();
}
//---------------------------------------------------------------------------


위와 같이 하며 아주 간단히 구현된다.

단. C++Builder6.0에서는 TApplication에 OnModalBegin , OnModalEnd 이벤트 핸들러가 없다.
Delphi7.0에서는 가능하고  C++Buider 도 6.0 이후 버젼은 가능하다.

Delphi7은 되는데 BCB6은 왜 안되는거지? 쩝쩝...


앗참 이건 http://delphi.about.com 에 delphi팁으로 올려져있던것이다.
http://delphi.about.com/od/delphitips2008/qt/form_dimmer.htm


그럼..

+ -

관련 글 리스트
774 [Forms] Modal폼을 띄울때 Disable되는 폼을 Gray톤으로 - 2 장성호 8625 2008/06/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.