|
각 Column의 Width계산해서 하려면 머리아픕니다.
그냥 OnDrawCell이벤트에 넘어오는 Parameter를 잘이용하시면 됩니다.
void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
//ACol은 현재 Draw할 Cell의 Column이구
//ARow는 Row
Rect는 (ACol , ARow)가 Draw될 화면상의 좌표입니다.
만약 Grid가 Scroll되어있다면 그만큼 조정된 값으로 나옵니다.
DrawGrid1->Canvas->TextRect(Rect,Rect.left+1,Rect.top+1,IntToStr(ACol)+" , "+IntToStr(ARow));
//뭐 이런식으로요...
}
//---------------------------------------------------------------------------
그럼..
장준식 님이 쓰신 글 :
: 안녕하세요..
:
: 볼렌드 C++ 빌더 2주 사용자입니다. 역시나 초보 ㅋㅋ
:
: 지금 DrawGrid를 이용해서 신호를 그리는 프로그램을 작성하고 있습니다.
:
: 파형에 대한 정의를 입력하면 신호가 grid에 표시되는 건 어느 정도 됐습니다.
:
: 그런데 문제가 주기가 긴 신호를 표시할때 그리드의 폭이 좁으면 당연히 스크롤바를 이용해서 이동을 해야겠지요.
:
: DrawCell method가 셀별로 좌표를 잡다보니 문제가 좀 발생하네요..
:
: 그리드는 54개 행과 100개의 열로 구성이 되어있습니다. 한 열에 20포인트를 그리도록 되어 있구요.
: 따라서 총 2000포인트를 그리게 되어 있습니다. 한 화면에 보이는 그리드 포인트는 약 880 포인트 정도 되구요
: 스크롤바를 움직일때 마다 처음에는 0번 부터 880까지 보이게 하고 스클롤바를 오른쪽으로 당기면 20번 데이터부터 900번 데이터가 표시되도록 하고 싶습니다.
:
: 이부분 소스는 아래와 같습니다.
:
: if((ARow > 0 && ARow < 55) && ACol > 0){
: for(int i = 0; i< 880;i++){
: //GraphPointY는 Y 좌표 값들이 들어 있구요 이걸 DrawGrid에 맞게 변환을 해야겠죠.. pPointData가 Grid에 그려질 좌표값들입니다.
: pPointData[ARow-1][i+columWidth*(ACol-1)].y = Rect.Bottom - GraphPointY[ARow-1][i+columWidth*(ACol-1)];
: // X 좌표는 DrawGrid의 가장 왼쪽 좌표로 고정 시켜 놨구요 이게 LeftPoint 거기서부터 880 포인트까지 구성합니다.
: pPointData[ARow-1][i+columWidth*(ACol-1)].x = LeftPoint + i;
: }
: 이 데이터를 가지고 880 개의 데이터를 그립니다. 원래는 셀별로 들어가는 것만 그려야 하지만(20포인트) 렇게 하면 각 셀의 가장 오른쪽 그릴때 깨져서 부드럽지가 않은 관계로 그냥 880 포인트 한방에 다 그려버립니다. 이렇게 하니 깔끔하게 나오네요.
: pPattenEditorCanvas->Polyline(&pPointData[ARow-1][(ACol-1)*columWidth], 880);
: }
: 여기서 문제는 마지막 라인의 Polyline에서 원하는 좌표만 그리고 싶은데 ACol이 계속 변하는 관계로 그래프가 엉망으로 나옵니다. 아시는 분은 무슨 말인지 아실겁니다. DrawCell의 특성상 그럴수 밖에 없죠.. 어떻게 좋은 방법 좀 있으면 조언 좀 부탁 드립니다.
|