2010-06-10 5 views
1

떨어져 그것을립니다 (노란색 영역 PaintBox1의 경계를 보여줍니다) : 는 영역을 채우는 것은 델파이 2007에서 다음 코드를 사용하여 캔버스


procedure TfrmTest.PaintBox1Paint(Sender: TObject); 
const 
    Rect_Size = 10; 
begin 
    PaintBox1.Canvas.Brush.Color := clYellow; 
    PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.width, PaintBox1.height)); 

    PaintBox1.Canvas.Brush.Color := clRed; 
    DrawARect(PaintBox1.Canvas, 0, 0, Rect_Size, Rect_Size); 
end; 

procedure TfrmTest.DrawARect(ACanvas: TCanvas; iLeft, iTop, iWidth, iHeight: Integer); 
var 
    rgnMain: HRGN; 
begin 
    rgnMain := CreateRectRgn(iLeft, iTop, iLeft + iWidth, iTop + iHeight); 
    try 
    SelectClipRgn(ACanvas.handle, rgnMain); 
    ACanvas.FillRect(ACanvas.ClipRect); 
    SelectClipRgn(ACanvas.handle, 0); 
    finally 
    DeleteObject(rgnMain); 
    end; 
end; 

내가이 얻을.

alt text http://www.freeimagehosting.net/uploads/62cf687d29.jpg

은 (이미지 중앙에 노란색 상자 [PaintBox1]와 양식을 보여줍니다. 그러나 내 빨간 rectange이 [rgnMain] 양식에 POS 0,0에 그려져있다)

내 기대를 빨간색 직사각형이 폼의 캔버스가 아닌 PaintBox1 캔버스의 왼쪽 상단에 위치한다는 것입니다. 왜 그렇지 않은가? 영역은 Windows 핸들이있는 컨트롤에서만 사용할 수 있습니까?

감사합니다.

+0

이미지를 표시하도록 게시물을 편집했습니다. –

+0

고마워, 석수 – Xanyx

답변

2

장치 컨텍스트에는 창 핸들이 필요합니다. VCL이 윈도우가 아닌 컨트롤에 대해 수행하는 작업은 TWinControl.PaintControls에서 SetWindowOrgEx을 사용하여 TWinControl에 대해 획득 한 DC의 뷰 포트를 오프셋하는 것입니다. 새보기 포트는 논리 단위입니다. 따라서 TWinControl에서 파생되지 않은 TGraphicControl의 경우 논리 좌표에서 작동하는 GDI 함수를 사용할 수 있습니다. 좌표가 장치 단위로 지정되어야한다고 말하는 SelectClipRgn의 설명 섹션을 참조하십시오. 당신은 offset the region이거나 좌표입니다.

+0

고마워 Sertac, 설명해. – Xanyx

관련 문제