示例#1
0
// --------------------------------------------------------------------------------------------
// 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
示例#2
0
// --------------------------------------------------------------------------------------------
// 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