2011-11-27 4 views

답변

8

당신은 당신이 사용자 정의 영역 무엇을 의미하는 언급하지 않은 당신은 "선택 영역"에 대해 이야기. 무슨 뜻인지 모르겠다.

간단한 직사각형의 경우 일반적으로 TCanvas.FillRect으로 직사각형을 채 웁니다. R

Canvas.Brush.Style := bsSolid; 
Canvas.Brush.Color := Color; 
Canvas.FillRect(R); 

사각형을 지정하는 TRect이다.

더 복잡한 영역의 경우 Windows GDI 기능 FillRgn으로 되돌아 가야합니다. 이 함수는 TCanvas으로 래핑되지 않지만 단순히 TCanvas.HandleHDC으로 전달하면됩니다.

+2

그냥 직사각형이 아닌 영역에 대해 'ExtFloodFill' 함수를 제안합니다. –

+0

@Magicmaster 저는 그렇게 생각하지 않았습니다. 그래도 좋은 제안입니다. Flood 채우기는 FillRect/FillRgn과 약간 다르지만 여기에 적합 할 수 있습니다. –

2

당신은 훨씬 더 구체적으로 필요하지만, 이것은 당신이 올바른 방향으로 가야한다 :

procedure DoMyDrawing(Canvas: TCanvas; L, T, R, B: Integer; Color: TColor); 
var 
    Rec: TRect; 
begin 
    Rec.Left:= L; 
    Rec.Top:= T; 
    Rec.Right:= R; 
    Rec.Bottom:= B; 
    //SAME AS Rec:= Rect(L, T, R, B); 
    Canvas.Brush.Color:= Color; 
    Canvas.Brush.Style:= bsSolid; 
    Canvas.Pen.Style:= psClear; 
    Canvas.FillRect(Rec); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    DoMyDrawing(Self.Canvas, 10, 10, 50, 50, clNavy); 
end; 

편집 :

좀 더-그래서를 사용하는 것이 좋습니다 것입니다 TRect에는 이미 4 개가 모두 포함되어 있기 때문에 4 개 좌표 (왼쪽, 위쪽, 오른쪽 및 아래쪽) 대신 TRect를 사용합니다. TopLeft TPoint와 BottomRight TPoint를 사용하여 TRect를 읽을 수도 있습니다.

procedure DoMyDrawing(Canvas: TCanvas; const R: TRect; const Color: TColor); 
begin 
    Canvas.Brush.Color:= Color; 
    Canvas.Brush.Style:= bsSolid; 
    Canvas.Pen.Style:= psClear; 
    Canvas.FillRect(R); 
end; 

훨씬 쉽게, 그것은되지 않습니다 :

다음

의 동일한 절차의 또 다른 버전 -

은 (Canvas.FillRect(R);Canvas.FillRect(Rec); 있어야했다 또한 위의 오타가 수정)?


ANOTHER 편집 :

이 또한 내가 Rect(Left, Top, Right, Bottom)을 사용하고 기능을 주 -이 너무 간단한 일을합니다. 불행히도 Rect: TRect;이라는 매개 변수를 사용하는 이벤트가있는 표준 VCL 컨트롤을 보았습니다.이 컨트롤은 classes 유닛에서 원래 함수를 사용할 수있는 기능을 망칩니다. 따라서 Rect이라는 이름의 변수를 사용하지 마십시오. Rect 함수를 사용할 수 없으므로 (4 줄의 코드 만 1로 바꾸기 때문에) 사용하지 마십시오.

+3

네 개의 숫자 (Left, Top, Right, Bottom)를 사용하지 말고 TRect를 사용하십시오.이 4 개가 모두 함께 결합되어 있습니다. –

+0

자신의 답변에 댓글을 쓰는 대신 편집 할 수 있습니다. 그것은 위키입니다. 사실 누구든지 당신의 답을 편집 할 수 있습니다. –

+0

네, 저도 알다시피, 나는 그 의견을 남겼을 때 상당히 서두 릅니다. –

관련 문제