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
[4662] Re:TCanvas에서 ClipRect설정.
박지훈.임프 [cbuilder] 4153 읽음    2000-12-22 00:00
최우택 님이 쓰신 글 :
:
: 쉽게 될것 같았는데 안되는 문제가 있네요.
:
: TCanvas에서 임의 부분만 그려지도록 ClipRect를 설정하려고 했는데,
: 속성 값을 주어도 안되고.. 어떻게 해야지 클립영역을 설정할 수 있는
: 지 아시는 분 가르쳐 주세요.
:
:
: 뭐, 이런식으로 시도했었습니다만..
: Printer()->Canvas->ClipRect.Left = 7;


임펠리테리입니다.

TCanvas::ClipRect 프로퍼티는 리드온리 프로퍼티입니다. 물론 ClipRect의 Left, Top 같은 개개의 멤버들은 세팅이 됩니다만, 제한을 하지 못했을 뿐이지 적용되지 않습니다. VCL의 graphics.pas를 보아도, ClipRect 프로퍼티는 세팅하는 함수가 없습니다.

그래서.. 클리핑을 위해서는 별도의 함수를 써야 합니다. 제 경험으로는 API 함수인 CreateRectRgn() 함수를 쓰니 잘 동작하더군요. 그런데 이 함수가 쬐끔 복잡해서, 함수로 만들어서 쓰고 있습니다. 다음을 참고하세요.

procedure SetClipRect(Canvas:TCanvas; R:TRect); // R 영역을 클리핑
var
  Rgn: HRGN;
begin
  Rgn := CreateRectRgn(R.Left, R.Top, R.Right, R.Bottom);
  ExtSelectClipRgn(Canvas.Handle, Rgn, RGN_AND);
  DeleteObject(Rgn);
end;

procedure SetExcClipRect(Canvas:TCanvas; R:TRect); // R 영역을 제외한 부분을 클리핑
var
  Rgn: HRGN;
begin
  Rgn := CreateRectRgn(R.Left, R.Top, R.Right, R.Bottom);
  ExtSelectClipRgn(Canvas.Handle, Rgn, RGN_DIFF);
  DeleteObject(Rgn);
end;

procedure ClearClipRect(Canvas:TCanvas); // 클리핑 영역 해제
begin
  ExtSelectClipRgn(Canvas.Handle, 0, RGN_COPY);
end;

델파이 컴퍼넌트 만들 때 만든 함수라서 파스칼 코드로 되어있습니다. 하지만 금방 바꿀 수 있을 정도로 간단하지요?

이 함수들을 사용할 때는 다음과 같이, 클리핑영역을 설정하고 해제하는 과정을 반복해야 합니다.(당연하지요?)

SetClipRect(Canvas, Rect);
... (그리는 과정)
ClearClipRect(Canvas);

그럼 참고하시길...

+ -

관련 글 리스트
4657 TCanvas에서 ClipRect설정. bluewing 4126 2000/12/22
4662     Re:TCanvas에서 ClipRect설정. 박지훈.임프 4153 2000/12/22
4674         허걱, C++빌더에 그런점이 있었군요. bluewing 3027 2000/12/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.