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
[647] [Forms] MDI 폼에서 Client 영역에 배경 그리기 2 - 더욱 쉽게
장성호 [nasilso] 8762 읽음    2007-05-25 01:57
여기 tip 게시판에 이미 같은 내용의 tip을  민병권님께서 올려놓은것이  있습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=357

위에 tip은 한가지가 문제가 있던데.. Form을 Resize할때는
WM_ERASEBKGND 메세지가 발생하지 않아  잔상이 있거나 이상하게 되더군요

위 팁에 문제점을 보완하려면
그냥  Form의 Resize 이벤트에서 다시 한번 똑같이 그려주면 문제가 해결되더군요

----------------------------------------------------------------------------------

[쉬운방법]

그런데 위 팁에서 또하나 불편한것은 sub-classing 을 해야한다는 것입니다.
뭐 서브클래싱이 그렇게 어렵고 복잡한것은 아니지만....


sub-classing  하지않고 하는 쉬운방법은
그냥 Form의 Repaint 이벤트와 Resize 이벤트에  배경을 그려주면 됩니다.

여기서 중요한 것은 Form의 Handle과  MDI Client의 Handle이 다르다는데 있습니다.

그러므로 그려져야할 HDC도 Form의 DC인 Canvas에 그려주는것이  아니라
MDI  Client의  HDC에 그려줘야 하는것입니다.


즉 아래와 같이 간단히 하면 됩니다.

문론 bmp 에 배경 이미지가 들어있어야 하구요

//---------------------------------------------------------------------------
void __fastcall TDLG_MAIN::FormPaint(TObject *Sender)
{
        HDC DC=GetDC(ClientHandle);
       BitBlt(DC,0,0,bmp->Width,bmp->Height,bmp->Canvas->Handle ,0,0,SRCCOPY	);
       //StretchBlt(DC, 0, 0, Width, Height, bmp->Canvas->Handle, 0, 0, bmp->Width, bmp->Height, SRCCOPY);
}
//---------------------------------------------------------------------------
void __fastcall TDLG_MAIN::FormResize(TObject *Sender)
{
        HDC DC=GetDC(ClientHandle);
       BitBlt(DC,0,0,bmp->Width,bmp->Height,bmp->Canvas->Handle ,0,0,SRCCOPY	);
       //StretchBlt(DC, 0, 0, Width, Height, bmp->Canvas->Handle, 0, 0, bmp->Width, bmp->Height, SRCCOPY);

}
//---------------------------------------------------------------------------



[응용 방법]

이를 좀더 응용하여서 하는 쉬운방법이 있는데요

VCL의 Canvas를 이용하는 방법입니다.
여기 tip에 보면 김태선님의 "바탕화면을 TCanvas로 만들어 주는 클래스"라는 것을 응용한것으로
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=551

TCanvas를 하나 new 하시고  그 canvas의 HDC를   MDI Clinet 영역의 HDC로 설정해주면 됩니다
그러면 아래와 같이 Paint 나 Resize 이벤트때 코딩이 더 짧아질수 있습니다.

TCanvas *MDICanvas;

void __fastcall TDLG_MAIN::FormCreate(TObject *Sender)
{
       MDICanvas=new TCanvas;
       MDICanvas->Handle=GetDC(ClientHandle);
}
//---------------------------------------------------------------------------
void __fastcall TDLG_MAIN::FormPaint(TObject *Sender)
{
        MDICanvas->Draw(0,0,bm_bg);
}
//---------------------------------------------------------------------------
void __fastcall TDLG_MAIN::FormResize(TObject *Sender)
{
      MDICanvas->Draw(0,0,bm_bg);
}
//---------------------------------------------------------------------------



그리고 또 이렇게 Client영역에 Canvas로 접근할수 있으므로 
아래와 같이 쉽게 원하는 내용을 client 영역에 그릴수 있습니다.

void __fastcall TDLG_MAIN::FormPaint(TObject *Sender)
{
        MDICanvas->Draw(0,0,bm_bg);

        MDICanvas->Brush->Color=clRed;
        MDICanvas->Pen->Color=clWhite;
        MDICanvas->Rectangle(Rect(100,100,200,300));

}
//---------------------------------------------------------------------------


요즘에 MDI로 프로그램하는경우가  많이 없는것 같기는 한데
혹 누군가 필요하실수도 있을것 같아서 올려봅니다.

+ -

관련 글 리스트
647 [Forms] MDI 폼에서 Client 영역에 배경 그리기 2 - 더욱 쉽게 장성호 8762 2007/05/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.