// -------------------------------------------------------------------------------------------- // Bildung einer Konstruktionshilfslinie in Form einer Geraden bool CRestrictLine::BuildStraightLine (KoOrd lFixX, KoOrd lFixY, double dAngle) { Window MWnd(__hWndM); // TRiAS-Hauptfenster Dimension dimMWin = MWnd.GetSize(); // Größe (im Point-Format) des Hauptfensters Point FixPt = BSKoordinaten (lFixX, lFixY); // obwohl die Hilfslinie eine Gerade ist, braucht sie zum Zeichnen auf dem Bildschirm zwei // Endpunkte (m_EPt1, m_EPt2), welche sich aus der Bildschirmbegrenzung ergeben if (Pi/2. != dAngle) { CoOrd b = dimMWin.Width(); // Breite des TRiAS-Hauptfensters CoOrd h = dimMWin.Height(); // Höhe des TRiAS-Hauptfensters double dTanAngle = tan (dAngle); m_EPt1.X() = 0; m_EPt1.Y() = DtoL (-FixPt.X()*dTanAngle + FixPt.Y()); // evtl. Clipping an der Bildschirmbegrenzung (ist für das Zeichnen der Gerade nicht // erforderlich; ich mache es aber trotzdem, damit das Rechteck für UnDraw() nicht // unnötig groß wird) // für m_EPt1.Y() < 0 || m_EPt1.Y() > h kann eigentlich dTanAngle nicht 0 werden (d.h. // eine waagerechte Gerade), sollte der Fall aber unerwartet doch eintreten, mache ich // eben kein Clipping (geht ja auch ohne) if ((m_EPt1.Y() < 0 || m_EPt1.Y() > h) && dTanAngle != 0) { (m_EPt1.Y() < 0) ? (m_EPt1.Y() = 0) : (m_EPt1.Y() = h); m_EPt1.X() = DtoL ((m_EPt1.Y()-FixPt.Y())/dTanAngle + FixPt.X()); } m_EPt2.X() = b; m_EPt2.Y() = DtoL ((b-FixPt.X())*dTanAngle + FixPt.Y()); if ((m_EPt2.Y() < 0 || m_EPt2.Y() > h) && dTanAngle != 0) { (m_EPt2.Y() < 0) ? (m_EPt2.Y() = 0) : (m_EPt2.Y() = h); m_EPt2.X() = DtoL ((m_EPt2.Y()-FixPt.Y())/dTanAngle + FixPt.X()); } } else { m_EPt1.X() = FixPt.X(); m_EPt1.Y() = 0; m_EPt2.X() = FixPt.X(); m_EPt2.Y() = dimMWin.Height(); } m_pKHL = new LineObject (m_EPt1, m_EPt2, &m_MyPen1); if (! m_pKHL) { DEX_Error (RC_RestrictLine, EC_NOMEMORY); return false; } return true; } // BuildStraightLine
// -------------------------------------------------------------------------------------------- // Konstruktionshilfslinie auf dem Bildschirm löschen HRESULT CRestrictLine::UnDraw (void) { HRESULT hrRet = S_OK; Rectangle rcUnDraw; // Rechteck der zu löschenden Konstruktionshilfslinie if (RESTRTYPE_GERADE == m_ResType || RESTRTYPE_STRECKE == m_ResType) { rcUnDraw.Left() = min (m_EPt1.X(), m_EPt2.X()) - iZug; rcUnDraw.Right() = max (m_EPt1.X(), m_EPt2.X()) + iZug; rcUnDraw.Top() = max (m_EPt1.Y(), m_EPt2.Y()) + iZug; rcUnDraw.Bottom() = min (m_EPt1.Y(), m_EPt2.Y()) - iZug; } else if (RESTRTYPE_KREIS == m_ResType) { rcUnDraw.Left() = m_RefPt.X() - iZug; rcUnDraw.Right() = m_RefPt.X() + 2*m_iRad + iZug; rcUnDraw.Top() = m_RefPt.Y() + 2*m_iRad + iZug; rcUnDraw.Bottom() = m_RefPt.Y() - iZug; } else { if (RESTRTYPE_UNKNOWN != m_ResType) _ASSERTE (m_ResType == RESTRTYPE_GERADE || m_ResType == RESTRTYPE_KREIS || m_ResType == RESTRTYPE_STRECKE || m_ResType == RESTRTYPE_UNKNOWN); Window MWnd(__hWndM); // TRiAS-Hauptfenster Dimension dimMWin = MWnd.GetSize(); // Größe (im Point-Format) des Hauptfensters rcUnDraw.Left() = 0; rcUnDraw.Right() = dimMWin.Width(); rcUnDraw.Top() = dimMWin.Height(); rcUnDraw.Bottom() = 0; hrRet = E_UNEXPECTED; } m_bUnDraw = true; // Konstruktionshilfslinie wird auf dem Bildschirm gelöscht DEX_RePaintRectWait (rcUnDraw); m_pVWnd->Update(); return hrRet; } // UnDraw