TCanvas 및 Window의 기본 좌표는 좌측상단에서 ( 0,0 ) 부터 시작됩니다.
그러니까 Y좌표가 위에서 아래로 내려옵니다.
근데 이게 때로 불편할때가 많습니다.
그래서 간단히 Y좌표계를 reverse 시킴으로서
좌측하단이 ( 0 , 0 ) 이 되도록 해서 사용하고자 합니다.
- TCanvas를 이용해구요
- TCanvas를 상속받아 새로운 클래스를 만듭니다.
[새로운 클래스]
class TScaleCanvas : public TCanvas
{
int H; //DC의 높이
public:
void __fastcall LineTo(int X, int Y);
void __fastcall MoveTo(int X, int Y);
void __fastcall Rectangle(int X1, int Y1, int X2, int Y2)/* overload */;
void __fastcall Rectangle(TRect rc)/* overload */;
__fastcall ~TSCaleCanvas()
{
if(Handle)DeleteDC(Handle);
}
};
//----------------------------------------------------
[오버라이딩 함수들]
void __fastcall TSCaleCanvas::MoveTo(int x,int y)
{
TCanvas::MoveTo(x,H-y);
}
void __fastcall TSCaleCanvas::LineTo(int x,int y)
{
TCanvas::LineTo(x,H-y);
}
void __fastcall TSCaleCanvas::Rectangle(int x1,int y1,int x2,int y2)
{
TCanvas::Rectangle(x1,H-y1,x2,H-y2);
}
void __fastcall TSCaleCanvas::Rectangle(TRect rc)
{
rc.top=H-rc.top;
rc.bottom=H-rc.bottom;
TCanvas::Rectangle(rc);
}
//============================================================================
// 사용하기
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSCaleCanvas *sCan=new TSCaleCanvas;
sCan->Handle=GetDC(Panel1->Handle); // TPanel Canvas에 Draw
sCan->H=Panel1->Height;
sCan->MoveTo(10,10);
sCan->LineTo(100,100);
sCan->Rectangle(100,100,200,200);
sCan->Rectangle(Rect(200,200,250,250));
delete sCan;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TSCaleCanvas *sCan=new TSCaleCanvas;
sCan->Handle=Image1->Canvas->Handle; // TIamge Canvas 에 Draw
sCan->H=Image1->Height;
sCan->MoveTo(10,10);
sCan->LineTo(100,100);
sCan->Rectangle(100,100,200,200);
sCan->Rectangle(Rect(200,200,250,250));
delete sCan;
}
//---------------------------------------------------------------------------
제대로 동작하려면 TCanvas의 다른 함수들도 위와같이 구현해서 써야 됩니다.
컴퓨터 프로그램하면서 이제는 Y 좌표가 위에서 아래로 내려오는게 많이 익숙하지만
아직도 노트에 그래프 그려서 분석할때는 Y좌표가 아래서 위로 올라가게 그려놓습니다.
별것 아니지만 저렇게 간단히 만들어 쓰면...
편리할 수 있을것입니다.
초보자용 날 팁 이었습니다.
이런식으로 해도 될것 같습니다.
//---------------------------------------------------------------------------
class TScaleCanvas : public TCanvas
{
public:
void __fastcall LineTo(int x, int y)
{
TCanvas::LineTo(x, ClipRect.Height()-y);
}
void __fastcall MoveTo(int x, int y)
{
TCanvas::MoveTo(x,ClipRect.Height()-y);
}
void __fastcall Rectangle(int x1, int y1, int x2, int y2)
{
TCanvas::Rectangle(x1,ClipRect.Height()-y1,x2,ClipRect.Height()-y2);
}
void __fastcall Rectangle(TRect rc)
{
rc.top=ClipRect.Height()-rc.top;
rc.bottom=ClipRect.Height()-rc.bottom;
TCanvas::Rectangle(rc);
}
};
//----------------------------------------------------
// 사용하기
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TScaleCanvas* sCan = (TScaleCanvas*)Canvas;
sCan->MoveTo(10,10);
sCan->LineTo(100,100);
sCan->Rectangle(100,100,200,200);
sCan->Rectangle(Rect(200,200,250,250));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TScaleCanvas* sCan = (TScaleCanvas*)Image1->Canvas;
sCan->MoveTo(10,10);
sCan->LineTo(100,100);
sCan->Rectangle(100,100,200,200);
sCan->Rectangle(Rect(200,200,250,250));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
TScaleCanvas *sCan=new TScaleCanvas;
sCan->Handle=GetDC(Panel1->Handle); // TPanel Canvas에 Draw
sCan->MoveTo(10,10);
sCan->LineTo(100,100);
sCan->Rectangle(100,100,200,200);
sCan->Rectangle(Rect(200,200,250,250));
delete sCan;
}
//---------------------------------------------------------------------------