//--------------------------------------------------------------------------- #include #pragma hdrstop #include "TPRuler2D.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(TPRuler2D *) { new TPRuler2D(NULL); } //--------------------------------------------------------------------------- __fastcall TPRuler2D::TPRuler2D(TComponent* Owner) : TGraphicControl(Owner) { Height = 200; Width = 200; FDPI = 160; FCoordinateSystem = csTopLeft; FStartX = 0; FStartY = 0; FThick = 24; FUnit = uDot; FZoom = 1.0; FDegree = true; bDraw = false; } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetDPI(int Value) { if (FDPI!=Value) { FDPI = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetCoordinateSystem(TCoordinateSystem Value) { if (FCoordinateSystem!=Value) { FCoordinateSystem = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetStartX(int Value) { if (FStartX!=Value) { FStartX = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetStartY(int Value) { if (FStartY!=Value) { FStartY = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetThick(int Value) { if (FThick!=Value) { FThick = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetUnit(TUnit Value) { if (FUnit!=Value) { FUnit = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetZoom(double Value) { if (FZoom!=Value) { FZoom = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::SetDegree(bool Value) { if (FDegree!=Value) { FDegree = Value; if (bDraw) bDraw = false; Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::Paint() { int i, iunit, X, Y, D, M, num; double dot, scale, t, den; AnsiString se; TFraction *fraction; switch (FUnit) { case uInch: iunit = 8; dot = FZoom * FDPI; D = 3; break; case uCm: iunit = 10; dot = FZoom * FDPI / 2.54; D = 4; break; default: iunit = 10; dot = FZoom * 100; D = 4; break; } dot = dot / iunit; scale = 1.0 / iunit; if (FZoom < 1.0) { while (true) { if (dot > iunit) break; dot = dot * iunit; scale = scale * iunit; } } else { while (true) { if (dot < 3 * iunit) break; dot = dot / iunit; scale = scale / iunit; } } fraction = new TFraction(10); TGraphicControl::Canvas->Brush->Color = clBtnFace; TGraphicControl::Canvas->FillRect(ClientRect); TGraphicControl::Canvas->Brush->Color = clWhite; TGraphicControl::Canvas->Pen->Color = clBlack; if (FCoordinateSystem==csTopLeft) { //cs TopLeft TGraphicControl::Canvas->FillRect(Rect(FThick, 0, Width, FThick)); TGraphicControl::Canvas->MoveTo(FThick, 0); TGraphicControl::Canvas->LineTo(Width-1, 0); TGraphicControl::Canvas->LineTo(Width-1, FThick-1); TGraphicControl::Canvas->LineTo(FThick, FThick-1); TGraphicControl::Canvas->LineTo(FThick, 0); t = FStartX * FZoom / dot; num = Floor(t); den = t - num; i = 0; while (true) { if (i - den >= 0.0) { X = FThick + (i - den) * dot; if (X > Width-1) break; if (FUnit == uInch) { if (((num + i) % iunit) == 0) M = 1; else M = 2; } else { switch (((num + i) % iunit)) { case 0: M = 0; break; case 5: M = 2; break; default: M = 3; break; } } if(FDegree){ TGraphicControl::Canvas->MoveTo(X, FThick-1); TGraphicControl::Canvas->LineTo(X, FThick / D * M); } else { TGraphicControl::Canvas->MoveTo(X, FThick / D * M); } switch (FUnit) { case uDot: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; case uInch: fraction->Value((num + i) * scale); if (fraction->denominator == 1) se = Format("%d", OPENARRAY(TVarRec, (fraction->numerator))); else se = Format("%d/%d", OPENARRAY(TVarRec, (fraction->numerator, fraction->denominator))); break; case uCm: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; } if (((num + i) % iunit) == 0) TGraphicControl::Canvas->TextOut(TGraphicControl::Canvas->PenPos.x+3, 1, se); } i = i + 1; } TGraphicControl::Canvas->FillRect(Rect(0, FThick, FThick, Height)); TGraphicControl::Canvas->MoveTo(0, FThick); TGraphicControl::Canvas->LineTo(0, Height-1); TGraphicControl::Canvas->LineTo(FThick-1, Height-1); TGraphicControl::Canvas->LineTo(FThick-1, FThick); TGraphicControl::Canvas->LineTo(0, FThick); t = FStartY * FZoom / dot; num = Floor(t); den = t - num; i = 0; while (true) { if (i - den >= 0.0) { Y = FThick + (i - den) * dot; if (Y > Height-1) break; if (FUnit == uInch) { if (((num + i) % iunit) == 0) M = 1; else M = 2; } else { switch (((num + i) % iunit)) { case 0: M = 0; break; case 5: M = 2; break; default: M = 3; break; } } if(FDegree){ TGraphicControl::Canvas->MoveTo(FThick-1, Y); TGraphicControl::Canvas->LineTo(FThick / D * M, Y); } else { TGraphicControl::Canvas->MoveTo(FThick / D * M, Y); } switch (FUnit) { case uDot: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; case uInch: fraction->Value((num + i) * scale); if (fraction->denominator == 1) se = Format("%d", OPENARRAY(TVarRec, (fraction->numerator))); else se = Format("%d/%d", OPENARRAY(TVarRec, (fraction->numerator, fraction->denominator))); break; case uCm: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; } if (((num + i) % iunit) == 0) TGraphicControl::Canvas->TextOut(1, TGraphicControl::Canvas->PenPos.y+2, se); } i = i + 1; } } else if (FCoordinateSystem == csBottomLeft) { //csBottomLeft TGraphicControl::Canvas->FillRect(Rect(FThick, Height-FThick, Width, Height)); TGraphicControl::Canvas->MoveTo(FThick, Height-FThick); TGraphicControl::Canvas->LineTo(Width-1, Height-FThick); TGraphicControl::Canvas->LineTo(Width-1, Height-1); TGraphicControl::Canvas->LineTo(FThick, Height-1); TGraphicControl::Canvas->LineTo(FThick, Height-FThick); t = FStartX * FZoom / dot; num = Floor(t); den = t - num; i = 0; while (true) { if (i - den >= 0.0) { X = FThick + (i - den) * dot; if (X > Width-1) break; if (FUnit == uInch) { if (((num + i) % iunit) == 0) M = 1; else M = 2; } else { switch (((num + i) % iunit)) { case 0: M = 0; break; case 5: M = 2; break; default: M = 3; break; } } if(FDegree){ TGraphicControl::Canvas->MoveTo(X, Height - FThick); TGraphicControl::Canvas->LineTo(X, Height - FThick / D * M); } else { TGraphicControl::Canvas->MoveTo(X, Height - FThick / D * M); } switch (FUnit) { case uDot: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; case uInch: fraction->Value((num + i) * scale); if (fraction->denominator == 1) se = Format("%d", OPENARRAY(TVarRec, (fraction->numerator))); else se = Format("%d/%d", OPENARRAY(TVarRec, (fraction->numerator, fraction->denominator))); break; case uCm: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; } if (((num + i) % iunit) == 0) TGraphicControl::Canvas->TextOut(TGraphicControl::Canvas->PenPos.x+3, Height-TGraphicControl::Canvas->TextHeight(se)-1, se); } i = i + 1; } TGraphicControl::Canvas->FillRect(Rect(0, 0, FThick, Height-FThick)); TGraphicControl::Canvas->MoveTo(0, 0); TGraphicControl::Canvas->LineTo(0, Height-FThick); TGraphicControl::Canvas->LineTo(FThick-1, Height-FThick); TGraphicControl::Canvas->LineTo(FThick-1, 0); TGraphicControl::Canvas->LineTo(0, 0); t = FStartY * FZoom / dot; num = Floor(t); den = t - num; i = 0; while (true) { if (i - den >= 0.0) { Y = Height - 1 - FThick - (i - den) * dot; if (Y<0) break; if (FUnit == uInch) { if (((num + i) % iunit) == 0) M = 1; else M = 2; } else { switch ((num + i) % iunit) { case 0: M = 0; break; case 5: M = 2; break; default: M = 3; break; } } if(FDegree){ TGraphicControl::Canvas->MoveTo(FThick-1, Y); TGraphicControl::Canvas->LineTo(FThick / D * M, Y); } else { TGraphicControl::Canvas->MoveTo(FThick / D * M, Y); } switch (FUnit) { case uDot: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; case uInch: fraction->Value((num + i) * scale); if (fraction->denominator == 1) se = Format("%d", OPENARRAY(TVarRec, (fraction->numerator))); else se = Format("%d/%d", OPENARRAY(TVarRec, (fraction->numerator, fraction->denominator))); break; case uCm: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; } if (((num + i) % iunit) == 0) TGraphicControl::Canvas->TextOut(1, TGraphicControl::Canvas->PenPos.y-TGraphicControl::Canvas->TextHeight(se)-2, se); } i = i + 1; } //================================================================ kjs } else { //csBottomRight TGraphicControl::Canvas->FillRect(Rect(0, Height-FThick, Width-FThick, Height)); TGraphicControl::Canvas->MoveTo(0, Height-FThick); TGraphicControl::Canvas->LineTo(Width-FThick, Height-FThick); TGraphicControl::Canvas->LineTo(Width-FThick, Height-1); TGraphicControl::Canvas->LineTo(0, Height-1); TGraphicControl::Canvas->LineTo(0, Height-Thick); t = FStartX * FZoom / dot; num = Floor(t); den = t - num; i = 0; while (true) { if (i - den >= 0.0) { X = Width - FThick - (i - den) * dot; if (X < 0) break; if (FUnit == uInch) { if (((num + i) % iunit) == 0) M = 1; else M = 2; } else { switch ((num + i) % iunit) { case 0: M = 0; break; case 5: M = 2; break; default: M = 3; break; } } if(FDegree){ TGraphicControl::Canvas->MoveTo(X, Height - FThick); TGraphicControl::Canvas->LineTo(X, Height - FThick / D * M); } else { TGraphicControl::Canvas->MoveTo(X, Height - FThick / D * M); } switch (FUnit) { case uDot: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; case uInch: fraction->Value((num + i) * scale); if (fraction->denominator == 1) se = Format("%d", OPENARRAY(TVarRec, (fraction->numerator))); else se = Format("%d/%d", OPENARRAY(TVarRec, (fraction->numerator, fraction->denominator))); break; case uCm: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; } if (((num + i) % iunit) == 0){ TBrushStyle style = TGraphicControl::Canvas->Brush->Style; TGraphicControl::Canvas->Brush->Style=bsClear; TGraphicControl::Canvas->TextOut(TGraphicControl::Canvas->PenPos.x-TGraphicControl::Canvas->TextWidth(se)/2, Height-TGraphicControl::Canvas->TextHeight(se)-1, se); TGraphicControl::Canvas->Brush->Style=bsSolid; } } i = i + 1; } TGraphicControl::Canvas->FillRect(Rect(Width-FThick, 0, Width, Height-FThick)); TGraphicControl::Canvas->MoveTo(Width-FThick, 0); TGraphicControl::Canvas->LineTo(Width-1, 0); TGraphicControl::Canvas->LineTo(Width-1, Height-FThick); TGraphicControl::Canvas->LineTo(Width-FThick, Height-FThick); TGraphicControl::Canvas->LineTo(Width-FThick, 0); t = FStartY * FZoom / dot; num = Floor(t); den = t - num; i = 0; while (true) { if (i - den >= 0.0) { Y = Height - 1 - FThick - (i - den) * dot; if (Y<0) break; if (FUnit == uInch) { if (((num + i) % iunit) == 0) M = 1; else M = 2; } else { switch ((num + i) % iunit) { case 0: M = 0; break; case 5: M = 2; break; default: M = 3; break; } } if(FDegree){ TGraphicControl::Canvas->MoveTo(Width - FThick, Y); TGraphicControl::Canvas->LineTo(Width - FThick / D * M, Y); } else { TGraphicControl::Canvas->MoveTo(Width - FThick / D * M, Y); } switch (FUnit) { case uDot: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; case uInch: fraction->Value((num + i) * scale); if (fraction->denominator == 1) se = Format("%d", OPENARRAY(TVarRec, (fraction->numerator))); else se = Format("%d/%d", OPENARRAY(TVarRec, (fraction->numerator, fraction->denominator))); break; case uCm: se = Format("%f", OPENARRAY(TVarRec, ((num + i) * scale))); break; } if (((num + i) % iunit) == 0){ TBrushStyle style = TGraphicControl::Canvas->Brush->Style; TGraphicControl::Canvas->Brush->Style=bsClear; TGraphicControl::Canvas->TextOut(Width-FThick+1, TGraphicControl::Canvas->PenPos.y-TGraphicControl::Canvas->TextHeight(se)/2, se); TGraphicControl::Canvas->Brush->Style=bsSolid; } } i = i + 1; } } //=================================================== delete fraction; } //--------------------------------------------------------------------------- void __fastcall TPRuler2D::PositionBar(TPoint P) { TPenMode OldPenMode; TColor OldPenColor; TPenStyle OldPenStyle; int OldPenSize; int v; OldPenMode = TGraphicControl::Canvas->Pen->Mode; OldPenColor = TGraphicControl::Canvas->Pen->Color; OldPenStyle = TGraphicControl::Canvas->Pen->Style; OldPenSize = TGraphicControl::Canvas->Pen->Width; TGraphicControl::Canvas->Pen->Mode = pmNot; TGraphicControl::Canvas->Pen->Color = clFuchsia; TGraphicControl::Canvas->Pen->Style = psDot; TGraphicControl::Canvas->Pen->Width = 1; if (FCoordinateSystem==csTopLeft) { //csTopLeft if (bDraw) { v = FThick+Floor((FPos.x - FStartX) * FZoom); TGraphicControl::Canvas->MoveTo(v, 0); TGraphicControl::Canvas->LineTo(v, FThick-1); v = FThick+Floor((FPos.y - FStartY) * FZoom); TGraphicControl::Canvas->MoveTo(0, v); TGraphicControl::Canvas->LineTo(FThick-1, v); } v = FThick+Floor((P.x - FStartX) * FZoom); TGraphicControl::Canvas->MoveTo(v, 0); TGraphicControl::Canvas->LineTo(v, FThick-1); v = FThick+Floor((P.y - FStartY) * FZoom); TGraphicControl::Canvas->MoveTo(0, v); TGraphicControl::Canvas->LineTo(FThick-1, v); } else if (FCoordinateSystem == csBottomLeft) { //csBottomLeft if (bDraw) { v = FThick+Floor((FPos.x - FStartX) * FZoom); TGraphicControl::Canvas->MoveTo(v, Height-1-FThick); TGraphicControl::Canvas->LineTo(v, Height-1); v = Height-1-FThick-Floor((FPos.y - FStartY) * FZoom); TGraphicControl::Canvas->MoveTo(0, v); TGraphicControl::Canvas->LineTo(FThick-1, v); } v = FThick+Floor((P.x - FStartX) * FZoom); TGraphicControl::Canvas->MoveTo(v, Height-1-FThick); TGraphicControl::Canvas->LineTo(v, Height-1); v = Height-1-FThick-Floor((P.y - FStartY) * FZoom); TGraphicControl::Canvas->MoveTo(0, v); TGraphicControl::Canvas->LineTo(FThick-1, v); } else { //csBottomRight if (bDraw) { v = Floor((FPos.x - FStartX) * FZoom); //FThick+Floor((FPos.x - FStartX) * FZoom); TGraphicControl::Canvas->MoveTo(v, Height-1-FThick); TGraphicControl::Canvas->LineTo(v, Height-1); v = Height-1-FThick-Floor((FPos.y - FStartY) * FZoom); TGraphicControl::Canvas->MoveTo(Width-FThick, v); TGraphicControl::Canvas->LineTo(Width-1, v); } v = Floor((P.x - FStartX) * FZoom); //Floor((FPos.x - FStartX) * FZoom); TGraphicControl::Canvas->MoveTo(v, Height-1-FThick); TGraphicControl::Canvas->LineTo(v, Height-1); v = Height-1-FThick-Floor((P.y - FStartY) * FZoom); TGraphicControl::Canvas->MoveTo(Width-FThick, v); TGraphicControl::Canvas->LineTo(Width-1, v); } FPos = P; bDraw = true; TGraphicControl::Canvas->Pen->Mode = OldPenMode; TGraphicControl::Canvas->Pen->Color = OldPenColor; TGraphicControl::Canvas->Pen->Style = OldPenStyle; TGraphicControl::Canvas->Pen->Width = OldPenSize; } //--------------------------------------------------------------------------- namespace Tpruler2d { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TPRuler2D)}; RegisterComponents("Texpia", classes, 0); } } //---------------------------------------------------------------------------