경계가있는 사용자 정의 배경 (TGraphicControl에서 파생 됨)을 그립니다. DrawBorderRect 함수에서 테두리를 그린 후에는 "클라이언트"영역을 반환하고 향후 페인팅을이 새 영역으로 제한하려고합니다. ClipRgn을 사용하지 않으면 모든 것이 작동합니다.Delphi SelectClipRGN 그려진 비트 맵 숨기기
작업 코드 :
하지만, 내가 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;
와 무슨 일이 일어나고 있는지
에 관한 모든 통찰력을 (내가 위의 볼이 경우 마우스 왼쪽 버튼을 클릭하지 않는 한) 나는이를 얻고, 나는 무엇을 놓치고 있습니까?
당신이 [문서]에서이 메모를 봤어 (http://msdn.microsoft.com/en-us/library/dd162955.aspx : 한마디로
, 당신은 당신의 지역을 상쇄하기 위해 필요)? "SelectClipRgn 함수는 영역 좌표가 ** 장치 단위 **로 지정되어 있다고 가정합니다." 좌표를 픽셀 단위로 지정하고 있습니다. 픽셀 좌표를 장치 좌표로 변환하려면 ['LPtoDP()'] (http://msdn.microsoft.com/en-us/library/dd145042.aspx)를 사용하십시오. –
BTW, 언제 어디에서 클립 + 드로잉 코드가 호출됩니까? 드로잉이 나타나는 마우스 클릭에 대한 귀하의 의견은 잘못된 시간에 잘못된 코드를 그리는 것이라고 생각합니다. –
@RemyLebeau ** 폼 디자이너 **에서이 모든 일이 일어나고 있습니다. (이것은 양식에 드롭하는 디자인 타임 구성 요소입니다.) 응용 프로그램을 실행할 때 마우스를 클릭해도 이미지가 표시되지 않습니다. 디자이너에서만 발생합니다. 몇 분 안에 장치 장치를 사용해 봅니다. – ss2006