|
최우택 님이 쓰신 글 :
:
: 쉽게 될것 같았는데 안되는 문제가 있네요.
:
: 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);
그럼 참고하시길...
|