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
[1010] [VCL] VCL Control 캡쳐하기
장성호 [nasilso] 11656 읽음    2010-09-28 12:37
음...

일반적인 캡쳐방법
일반적으로 Windows에서 화면을 캡쳐할때 가장많이 쓰는 방법은?
Desktop의 dc를 이용해서 캡쳐한다.

전체 화면을 캡쳐할때든.. 특정 영역을 캡쳐할때든..


현재process의 특정 vcl-control 캡쳐

오늘 살펴보고자 하는것은 Delphi나 CBuilder로 만든 어플에서 어플리케이션 내에 있는
특정Control을 캡쳐하는 방법에 대해 기술하고자 한다.


방법1
  먼저 가장 일반적인 방법인 Desktop dc를 이용하는 방법으로 Control을 캡쳐하는 방법이다.

Graphics::TBitmap * CaptureControl1(TControl *ctrl)
{
    Graphics::TBitmap *bmp=new Graphics::TBitmap;
    bmp->Width=ctrl->Width;
    bmp->Height=ctrl->Height;
    TPoint pt(0,0);
    pt=ctrl->ClientToScreen(pt);
    HDC dc=GetDC(0);
    BitBlt(bmp->Canvas->Handle,0,0,bmp->Width,bmp->Height,dc,pt.x,pt.y,SRCCOPY);
    ReleaseDC(0,dc);
    return bmp;
}


방법1-문제점
  위 방법은 현재 Screen의 전체혹은 특정 영역을 짤라서 Capture하는것이기때문에..
  1. 캡쳐하고자 하는 영역이 화면 밖에 있거나
  2. 또는 캡쳐하고자 하는 Control위에 다른 window가 올라와 있는경우 제대로 캡쳐가 되지 않는다.
   

방법2
   ; VCL-Control의 기능을 이용하여 다음과 같이 캡쳐가 가능하다.
//---------------------------------------------------------------------------
Graphics::TBitmap * CaptureControl2(TControl *ctrl)
{
    Graphics::TBitmap *bmp=new Graphics::TBitmap;
    bmp->Width=ctrl->Width;
    bmp->Height=ctrl->Height;
    ctrl->Perform(WM_PAINT,(int)bmp->Canvas->Handle,0);
    return bmp;
}


방법2의 장단점
  방법2는 ..
  장점은?
  직접 Control에 WM_PAINT 메세지와 DC를 보내, dc에 paint하도록 하는 방법이므로..
  방법1의 단점인 Screen영역을 벗어나거나 , 다른 Window에 가려져 있어도 캡쳐가 가능하다는 것이다.

단점은
     현재 Control이 TPanel같은 Container컨트롤인경우
     Control위에 올려진 child-Control까지는 캡쳐하지 못한다.

방법3
   ; 방법1,방법2의 문제점을 보완한 방법으로..
      vcl에서 TCustomForm의 GetFormImage 메소드의 구현 원리를 이용하면 된다.
     참조 http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=753

Graphics::TBitmap * CaptureControl3(TControl *ctrl)
{
    Graphics::TBitmap *bmp=new Graphics::TBitmap;
    bmp->Width=ctrl->Width;
    bmp->Height=ctrl->Height;
    if(ctrl->InheritsFrom(__classid(TWinControl)))
    {
        TWinControl *wCtrl=(TWinControl *)ctrl;
        bmp->Canvas->Lock();
        if(GetWindowLong(wCtrl->Handle, GWL_STYLE) & WS_BORDER ) 
                wCtrl->PaintTo(bmp->Canvas->Handle, 1,1);
        else wCtrl->PaintTo(bmp->Canvas->Handle, 0,0);
        bmp->Canvas->Unlock();
    }
    else
    {
        ctrl->Perform(WM_PAINT,(int)bmp->Canvas->Handle,0);
    }
    return bmp;
}


위와같이 하면
현재 Control위에 child-control이있더라도 함께 캡쳐해준다.
문론 화면밖을 벗어나거나.. 다른 window에 가려져 있더오 캡쳐가 가능하다.


상황에 따라 현재 screen에 나타난 화면을 캡쳐해야 하는 경우도 있겠지만..
screen상태에 관계없이.. 특정 control의 상태를 캡쳐해야 한다면..
위 방법2 또는 방법3을 이용하면 유용할것이다.

그럼..

+ -

관련 글 리스트
1010 [VCL] VCL Control 캡쳐하기 장성호 11656 2010/09/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.