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
[21113] Re:Re:Re:Re:[질문] 메뉴를 그림으로 캡쳐할려면... (안되는데여. -__-)
하느리 [handebug] 808 읽음    2002-08-30 10:43
소스를 올릴까 하는 생각도 해 보았는데, 소스가 워낙 걸레가 되어서 오히려 문제의 원인을 파악하는데 방해가 될 것 같습니다. 그래도 필요하면 소스 올리겠습니다.
현재 하는 방식은 CBT 방식의 훗킹을 이용하여 시스템 전체의 윈도우 관련 이벤트를 감시하고 있다가 이벤트가 발생하면 해당지역을 그림으로 캡쳐합니다. 그런데, 문제는 일반 윈도우는 상관이 없으나 메뉴(파일, 편집 등의 메뉴)가 팝될 때, 이벤트는 발생을 하는데, 그림으로 캡쳐를 잡은 것을 보면 메뉴가 캡쳐되는 것이 아니라 메뉴 뒤에 있는 그림이 캡쳐됩니다. 그리고 캡쳐시 해당 윈도우 크기에 맞추어서 그림으로 저장하는데, 캡쳐된 크기는 메뉴의 크기와 꼭 맞고 위치도 맞습니다. 그러나 그림의 내용은 엉뚱한 뒷 그림이 들어가 있습니다.
테스트 해 보실 수 있도록 실행파일을 첨부합니다.


유영인.Chris 님이 쓰신 글 :
: 메뉴라면..
:
: 파일, 편집, 보기 이런 메뉴들을 말씀하시는 건지요..?
: 이것들을 전부 펼쳐진 상태로 캡쳐를 하시기 원하시는 건가요?
:
:
: 하느리 님이 쓰신 글 :
: : 우선 답변 감사드립니다.
: : 저도 처음에는 그렇게 생각했습니다. 그래서 이것저것 해 보는데(영인님이 설명하신 것을 포함하여), 않되는군요. 시작메뉴라든가 각 프로그램에 있는 메뉴를 캡쳐할 수가 없네요.
: :
: : 참고로 현재 프로그래밍하고 있는 운영체제는 XP입니다.
: :
: :
: :
: : 유영인.Chris 님이 쓰신 글 :
: : : 메뉴라면 어떤 메뉴를 말씀하시는 건지요.
: : :
: : : DC = GetDC(0); 으로 전체화면을 얻고,
: : : BitBlt(bmp->Canvas->Handle, 0, 0, width, height, DC, left, top, SRCCOPY);
: : :
: : : 위와같이 작업하시면 전체 화면을 캡쳐하실 수 있습니다. 메뉴가 화면에 보이는 것이라면, 캡쳐가 분명히 되겠지만, 화면에 보이지 않는 것이라면 캡쳐를 하실 수 없습니다. 후자에서는 무언가의 다른 작업이 필요하겠네요.
: : :
: : : 그리고, GetDC는 메모리 누수가 발생할 수 있는 함수입니다. 아래 첨부해주신 소스중에 GetCRT 라는 소스의 호출이 빈번하다면, OnCreate 같은 곳에서 GetDC 로 DC를 하나 얻어서 계속 작업하신 다음, OnDestroy 에서 Release 시켜 주는 식으로 하시는 방법이 좋습니다.
: : :
: : :
: : : 하느리 님이 쓰신 글 :
: : : : 일반적인 경우, 화면을 캡쳐할려면,
: : : : void __fastcall GetCRT (Graphics::TBitmap *bmp, TRect& area, int width, int height)
: : : : {
: : : :     bmp->Width  = width;
: : : :     bmp->Height = height;
: : : :     int col_num = GetCRTColorBit ();
: : : :     if ( col_num == 4 )         bmp->PixelFormat = pf4bit;
: : : :     else if ( col_num >= 16 )   bmp->PixelFormat = pf16bit;
: : : :     else                        bmp->PixelFormat = pf8bit;
: : : :
: : : :     HWND desktop    = GetDesktopWindow ();
: : : :     HDC dt_dc       = GetDC (desktop);
: : : :         SetStretchBltMode (bmp->Canvas->Handle, STRETCH_HALFTONE);
: : : :         StretchBlt (bmp->Canvas->Handle, 0,0, width, height,
: : : :                     dt_dc, area.Left, area.Top, area.Right - area.Left, area.Bottom - area.Top, SRCCOPY);
: : : :     ReleaseDC (desktop, dt_dc);
: : : : }
: : : :
: : : : 이렇게 하면 되는데, 메뉴는 이렇게 해서 그림으로 저장할 수가 없네요.
: : : : 아마도 윈도우핸들 (HWND) 때문인 것 같기도 한데,
: : : : 메뉴를 그림으로 캡쳐할려면, 어떻게 해야 하나요 ?
: : : :

+ -

관련 글 리스트
30441                 Re:Re:Re:Re:[질문] 메뉴를 그림으로 캡쳐할려면... (안되는데여. -__-) 하느리 709 2002/08/30
21113                 Re:Re:Re:Re:[질문] 메뉴를 그림으로 캡쳐할려면... (안되는데여. -__-) 하느리 808 2002/08/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.