올초에 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
그럼..