xcvbm Geschrieben 25. November 2002 Geschrieben 25. November 2002 Hallo, ich will mal wieder mein Zeichenprogramm erweitern, in der Klasse CView hole ich über die Funktion eines Kontextmenüs die einzustellende Siftbreite. void CTag11View::OnPenwidthFat(m_penwidth) { m_penwidth=25 } void CTag11View::OnPenwidthNormal(m_penwidth) { m_penwidth=5 } void CTag11View::OnPenwidthThin(m_penwidth) { m_penwidth=1; } [/PHP] m_penwidth ist eine Integer Public Variable. in der Klasse CLine, in der Funtion OnDraw will ich die Eingenschaft von CPen einstellen [PHP] void CLine:: Draw(CDC *pDC, m_penwidth) { // Stift erzeugen CPen lpen (PS_SOLID, m_penwidth, m_crColor); //fett (1) // Neuen Stift als Zeichenobjekt festlegen CPen* pOldPen = pDC->SelectObject(&lpen); // Linie zeichnen pDC->MoveTo(m_ptFrom); pDC->LineTo(m_ptTo); // Vorherigen Stift zurücksetzen pDC->SelectObject(pOldPen); } wie muss ich die Variable an die Klasse übergeben, über die Funktion Serialize ? Oder mit Pointern ? Oder ganz anders? Ich gebe zu - ich habs immer noch nich so richtig kapiert. Guten Abend und Danke im Voraus, Christoph Zitieren
Crush Geschrieben 25. November 2002 Geschrieben 25. November 2002 Wenn es fest eingestellt werden soll muß man das beim Erzeugen des CLine-Objekts als konstantes Objekt übergeben und über die Initialisierungsliste das Line-Member damit initialisieren. Oder so wie Du das gemacht hast gibt man den Wert als Parameter mit und speichert Diesen in einer eigenen Variable. Ob man mit Referenzen oder Zeigern arbeitet mache ich v.a. davon abhängig, wieviele Kopiervorgänge notwendig wären, bzw. wie groß die Objekte sein können. Bei simplen Typen bis zum double kann man die Werte direkt rübergeben, weil man da nichts bei einspart und sogar schneller ist ansonsten halt per Referenz. Achtung: Die Lebendauer eines außerhalb gelagerten Objekts spielt dabei aber auch eine Rolle! Zitieren
xcvbm Geschrieben 26. November 2002 Autor Geschrieben 26. November 2002 Hi, leider habe ich es immer noch nicht richtig gemacht. Wie ist es denn ganz genau? Ich habe die Variable m_penwidth in der Klasse CTag11View erstellt. Dann in der Klasse CLine die Variable m_penwidth. Beides als Public Integer. Die Aufrufe des Kontextmenüs schreiben die Variable m_penwidth, und übergeben sie: void CTag11View::OnPenwidthFat(m_penwidth) { m_penwidth=25 } [/PHP] in der Klasse CLine will ich die Variable wieder einfangen, und sie an die Variable m_penwidths übergeben [PHP] CLine::CLine(CPoint ptFrom, CPoint ptTo, COLORREF crColor, m_penwidth) { // Anfangs- und Endpunkte initialisieren m_ptFrom = ptFrom; m_ptTo = ptTo; m_crColor = crColor; m_penwidths=m_penwidth; } Dann will ich sie in der Funktion Draw wie oben gezeigt verwenden. Ich habe die zusätzlichen Variablen Übergaben einfach in die Definition und in die Deklaration der Funktionen geschrieben. Leider habe ich einen Haufen Fehler damit verursacht. Kann es sein das ich etwas grundliegendes vergessen habe? Christoph Zitieren
Klotzkopp Geschrieben 26. November 2002 Geschrieben 26. November 2002 Originally posted by Christoph F. Leider habe ich einen Haufen Fehler damit verursacht. Kann es sein das ich etwas grundliegendes vergessen habe? Du hast auf jeden Fall vergessen, den Parametern der Funktionen einen Datentyp zu verpassen. Wenn es sicht um einen int handelt, muss das so aussehen: CLine::CLine(CPoint ptFrom, CPoint ptTo, COLORREF crColor, int m_penwidth) Außerdem solltest Du den Parametern nicht den Präfix m_ geben, um Verwechslungen mit Membervariablen zu vermeiden. Zitieren
xcvbm Geschrieben 26. November 2002 Autor Geschrieben 26. November 2002 das hat mir auf jeden Fall weitergeholfen. Ich habe jetzt die Variable direkt an Draw übergeben, weil es in der CLine Funktion Probleme habe. So ist es besser. Leider habe ich immer noch ein Problem. Aus einer anderen Klasse wird die Funktion Draw aufgerufen, und das erste vorhandene Argument an Draw übergeben. Da gibt es logischerweise das Problem das die Funktion beim aufruf nun 2 Argumente erwartet, der aufruf aber nur eines übergibt. Da es in der CTag11View Klasse ist und die Variable schon vorhanden ist, habe ich versucht die Variable mit zu übergeben. Dann läuft das Programm zwar, nur leider kann ich nicht mehr Zeichnen. void CTag11View::OnMouseMove(UINT nFlags, CPoint point) { // Prüfen, ob linke Maustaste gedrückt if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { // Wurde Maus aufgefangen? if (GetCapture() == this) { // Gerätekontext holen CClientDC dc(this); // Die Linie ins Dokument aufnehmen CLine *pLine = GetDocument()->AddLine(m_ptPrevPos, point); // Aktuellen Linienzug zeichnen pLine->Draw(&dc, penwidth); //hier // Aktuellen Punkt als vorherigen speichern m_ptPrevPos = point; } } CView::OnMouseMove(nFlags, point); } void CTag11View::OnDraw(CDC* pDC) { CTag11Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen // Anzahl der Linien im Dokument ermitteln int liCount = pDoc->GetLineCount(); // Gibt es Linien im Dokument? if (liCount) { int liPos; CLine *lptLine; // Schleife durch die Linien des Dokuments for (liPos = 0; liPos < liCount; liPos++) { // Anfangs- und Endpunkte für alle Zeilen holen lptLine = pDoc->GetLine(liPos); // Linie zeichnen lptLine->Draw(pDC, penwidth); //hier } } } [/PHP] ich habe die stellen mit "//hier" erkenntlich gemacht. Die erste Funktion ist zum Zeichnen mit der Maus. Die zweite zeichnet eine vorher abgespeicherte Datei neu. Die Variable penwidth habe ich nun dazu geschrieben. gibt es eine möglichkeit nur eine Variable zu übergeben, da es so nicht funktioniert? Zitieren
xcvbm Geschrieben 26. November 2002 Autor Geschrieben 26. November 2002 habe das problem schon erfasst, es liegt wohl daran das in der Variable noch nichts steht, zum zeitpunkt der übergabe, deswegen ist die strichbreite=0 und er zeichnet nix. blöder fehler werde es wohl hinbekommen vielen danke für eure hilfe Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.