2015-01-07 7 views
3

경계가있는 사용자 정의 배경 (TGraphicControl에서 파생 됨)을 그립니다. DrawBorderRect 함수에서 테두리를 그린 후에는 "클라이언트"영역을 반환하고 향후 페인팅을이 새 영역으로 제한하려고합니다. ClipRgn을 사용하지 않으면 모든 것이 작동합니다.Delphi SelectClipRGN 그려진 비트 맵 숨기기

작업 코드 : Output without ClipRGN

하지만, 내가 ClipRgn를 사용하려면, 나는 다음을 시도 : 코드 위

var 
    R : TRect; 

begin; 
    R := GetClientRect;  //(R -> 0, 0, 300, 200) 
    R := DrawBorderRect(R); //(R -> 20, 20, 280, 180) 
    Canvas.StretchDraw(R, FBitmap); //FBitmap is a 3 pixel x 3 pixel square 
end; 

나에게이 있습니다. 이번에는 패턴이 표시되지 않습니다 (그러나 마우스 버튼을 클릭하면 패턴이 나타납니다. 그래서 일종의 작업이지만 어떤 이유로 겹쳐 쓰니?).

문제있는 코드 :

var 
    R : TRect; 
    ClientRegion: HRGN; 

begin; 
    R := GetClientRect;  //(R -> 0, 0, 300, 200) 
    R := DrawBorderRect(R); //(R -> 20, 20, 280, 180) 

    ClientRegion := CreateRectRgn(R.Left, R.top, R.Right, R.Bottom); 
    SelectClipRgn(Canvas.Handle, ClientRegion); 
    try 
    Canvas.StretchDraw(R, FBitmap); //FBitmap is a 3 pixel x 3 pixel square 
    finally 
    SelectClipRgn(Canvas.Handle, HRGN(nil)); 
    DeleteObject(ClientRegion); 
    end; 
end; 

와 무슨 일이 일어나고 있는지 Output with ClipRGN

에 관한 모든 통찰력을 (내가 위의 볼이 경우 마우스 왼쪽 버튼을 클릭하지 않는 한) 나는이를 얻고, 나는 무엇을 놓치고 있습니까?

+0

당신이 [문서]에서이 메모를 봤어 (http://msdn.microsoft.com/en-us/library/dd162955.aspx : 한마디로

, 당신은 당신의 지역을 상쇄하기 위해 필요)? "SelectClipRgn 함수는 영역 좌표가 ** 장치 단위 **로 지정되어 있다고 가정합니다." 좌표를 픽셀 단위로 지정하고 있습니다. 픽셀 좌표를 장치 좌표로 변환하려면 ['LPtoDP()'] (http://msdn.microsoft.com/en-us/library/dd145042.aspx)를 사용하십시오. –

+1

BTW, 언제 어디에서 클립 + 드로잉 코드가 호출됩니까? 드로잉이 나타나는 마우스 클릭에 대한 귀하의 의견은 잘못된 시간에 잘못된 코드를 그리는 것이라고 생각합니다. –

+0

@RemyLebeau ** 폼 디자이너 **에서이 모든 일이 일어나고 있습니다. (이것은 양식에 드롭하는 디자인 타임 구성 요소입니다.) 응용 프로그램을 실행할 때 마우스를 클릭해도 이미지가 표시되지 않습니다. 디자이너에서만 발생합니다. 몇 분 안에 장치 장치를 사용해 봅니다. – ss2006

답변

5

SelectClipRgn은 장치 좌표를 가정합니다.

TGraphicControl 하위 항목에는 상위 창에 대해 검색된 장치 컨텍스트가 있습니다. 뷰포트 원점을 이동하여 클라이언트 원점을 (0, 0)으로 설정할 수 있지만 논리적 좌표입니다.

... 
ClientRegion := CreateRectRgn(R.Left, R.top, R.Right, R.Bottom); 
OffsetRgn(ClientRegion, Left, Top);   // <-- 
SelectClipRgn(Canvas.Handle, ClientRegion); 
... 
+0

잘 들어, 구성 요소가'TGraphicControl' 자손 인 부분을 놓쳤다. –

관련 문제