2016-08-02 2 views
1

"drawball"을 사용하여 "dungeon"맵을 표시하고 있습니다. 각 셀에 어떤 유형의 물리적 기능이 있는지 설명하는 데이터로 채워진 배열이 있습니다. 객실 및 복도 등의 기본 레이아웃. 각 순열마다 PNG가 있습니다.Delphi XE6 TDrawGrid에 PNG 그리기에 대한 지침이 필요합니다.

나는 drawgrid의 각 셀에 적절한 PNG를 그려서지도를 "그린"려고합니다. DrawGrid1.Canvas.Draw (x, y, pngImage)을 사용하여 더 많이 또는 덜 직접적으로 할 수 있지만 픽셀 단위로 정확한 x, y를 알아내는 것은 눈금 선으로 인해 실망 스럽습니다 (적어도 필자는 좌절감을 느낍니다.), 그리고 내가 다른 길에 뛰어 들어갈 다른 이슈에 대해 확신 할 수 없다.

는 또한 pngImage.Draw (DrawGrid1.Canvas, 사각형)를했지만, 다시 한번, 나는 세포와 PNG 파일은 모두 40x40 픽셀이기 때문에 정말 불필요한 보인다 사각형을 계산해야합니다.

주어진 ARow 및 ACol에 대해 지정된 셀의 Rect가 미리 계산되어 있기 때문에 OnDrawCell이 더 좋은 방법입니다 (단, 여러 곳에서 읽은 내용을 잘못 해석하지 않는 한). 그러나 내가 실제로 발견 한 예제 중 어느 것도 OnDrawCell이 실행되는 방법을 보여주지 않습니다. 쉬운 대답은 "무언가가 세포 안으로 끌어 들여질 때"가 실제로 훨씬 더 잘 설명하지 않는다는 것입니다. 그건 내가하려는 일이입니다.

는 (나는 종종이 델파이의 문서의 경우 것으로 확인했습니다)하여 주어진 사용 사례에 대해 항상 정확하게 (설명하는 방법 만, 언제 신비 ...에 싸여 남아있는 이유)의

물론 셀을 클릭 할 때 PNG를 지우지 않도록 드로우 그리드를 제어하는 ​​것과 같은 몇 가지 다른 사항도 있습니다.

관련 제안 사항을 크게 높이 평가할 것입니다. TFRM

+1

세포를 그릴 필요가있을 때 OnDrawCell이 시작될 때 쉽게 대답 할 수 있습니다. 셀을 칠해야 할 때 OS에 의해 결정되지만 그렇게하도록 강제 할 수 있습니다. –

+0

왜 OnDrawCell에 PNG를 그리지 않습니까? 나는 그 질문을 이해하지 못한다고 생각한다. –

+0

나는 OnDrawCell을 이해하지 못한다고 생각합니다. 그리드를 사용하는 유일한 이유는 PNG가 그려진 후 사용자가 인접한 (연결된) 셀을 클릭하여 "이동"할 수 있기 때문입니다. 나는 아마도 그것들을 모두 TImage 나 다른 것으로 끌어 올 수있을 것입니다. OnDrawCell을 실행하여 실제 그리기 작업을 수행하기 위해 특별한 목적없이 캔버스에 "그리기"만 할 수 있습니다. 앞서 언급했듯이 질문은 방법이 아니라시기 또는 이유입니다. – Pete

답변

-1

정확히 X와 Y를 픽셀 단위로 정확하게 계산하는 이유는 무엇입니까? 사실 꽤 간단합니다.

사각형의 왼쪽 테두리를 얻으려면 열 너비와 눈금 선 너비에 열 수를 곱하면됩니다. 그리고 첫 번째 열의 맨 왼쪽에 눈금 선이있는 경우 눈금 선의 너비를 추가하십시오.

그리고 직사각형의 오른쪽 테두리를 얻으려면 단순히 열의 너비를 이전 결과에 추가하십시오.

그리고 당신은 단지 대신 폭

의 높이를 사용 Y 계산 그래서 코드는 다음과 같은 (내 마음에서 작성 및 검증되지 않은)

const 
    CellWidth = 40; 
    CellHeight = 40; 
    GridLineThickness = 1; 

procedure DrawCell(Row, Column: Integer; Image: Bitmap); 
var Rect: TRect; 
begin 
    Rect.Left := ((CellWidth + GridLineThickness) * Column) + GridLineThickness; 
    Rect.Right := Rect.Left + CellWidth; 
    Rect.Top := ((CellHeight + GridLineThickness) * Row) + GridLineThickness; 
    Rect.Bottom := Rect.Top + CellHeight; 
    PaintBox1.Canvas.StretchDraw(Rect, Image); 
end; 

를보고 할에 대한

당신은 확대 할 수있는 능력을 원하는 경우 확대/축소 기능을 사용하여 CellWidth 및 CellHeight에 줌 배율을 곱하면됩니다. 축소 할 때 그리드 선 렌더링을 생략하면됩니다.

관련 문제