Zum Inhalt springen

werte aus einer klasse in eine andere?


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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!

Geschrieben

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

Geschrieben
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.

Geschrieben

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?

Geschrieben

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 :P

werde es wohl hinbekommen

vielen danke für eure hilfe

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...