Kreis zeichnen; was ist falsch
-
Hi Leute!
Versuche einen Kreis mit folgendem Code in einem Dialogfeld zu zeichnen (Visual C++6.0):
CClientDC *dc = new CClientDC(this); CPen pen; pen.CreatePen(PS_SOLID,4,RGB(0,0,0)); dc->SelectObject(pen); dc->Ellipse(x1, y1, x2, y2);
Das ganze befindet sich in der OnInitDialog()
Hab das leider nicht selbst geschrieben, da ich mich momentan noch zu wenig auskenne
Könnte mir bitte jemand erklären, warum die Ellipse nicht angezeigt wird !?Die Anwendung wird ohne Fehlermeldungen ausgeführt.
Bin euch für die Hilfe zu großem Dank verpflichtet,
chiao cha-OS
-
Zeichnen tut man in OnPaint!
-
Danke für deine Antwort,
in der OnPaint geht er aber auch nicht, muss was mit dem Code zu tun haben
Any Ideas
chiao cha-OS
-
Zeich doch nochmal Deinen ganzen Code in der OnPaint!
Woher hast Du die Koordinaten?
-
Das ist der vollständige Code, den ich in die OnPaint geschrieben habe!
Der Rest ist automatisch generiert worden (Das kennst du ja ;-)):void CEllipseDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } CClientDC *dc = new CClientDC(this); CPen pen; pen.CreatePen(PS_SOLID,4,RGB(0,0,0)); dc->SelectObject(pen); dc->Ellipse(50, 50, 50, 50); }
Die Koordinaten hab ich definiert, aber es ändert auch nichts wenn ich die Werte reinschreibe.
Danke
chiao cha-OS
-
Ersetze mal bitte
CClientDC *dc = new CClientDC(this);
durch
CPaintDC *dc = new CPaintDC(this);
-
Und Deine Zeichen-Sachen natürlich in den "else"-zweig rein und den dc richtig erzeugen oder korrekt löschen!!!!
void CEllipseDlg::OnPaint() { CPaintDC dc(this); // Gerätekontext für Zeichnen if (IsIconic()) { SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CPen pen; pen.CreatePen(PS_SOLID,4,RGB(0,0,0)); dc.SelectObject(pen); dc.Ellipse(50, 50, 50, 50); } }
-
Hab ich gemacht! Der Kreis wird aber noch nicht dargestellt.
Devise: Nicht aufgeben
chiao cha-OS
-
Fragen wir mal so: Wo soll den der Kreis überhaupt gezeichnet werden? Ich gehe davonaus, dass Du eine SDI-MFC-Projekt erzeugst hast...
-
Möchte den Kreis in einem Dialogfeld anzeigen lassen.
Muss ich jetzt rot werden??chiao cha-OS
-
Du solltest eine eigene Klasse machen, die von CWnd abgeleitet ist. Darin dann die OnPaint überschreiben. Diese kannst Du dann in Deinen Dialog einbinden.
Hab aber gerade kein Beispiel da...
-
Jochen Kalmbach schrieb:
Ersetze mal bitte
CClientDC *dc = new CClientDC(this);
durch
CPaintDC *dc = new CPaintDC(this);
Nö daran liegts nicht, er soll lieber
CPaintDC dc(this);
benutzen. Wozu new, wenn es nicht notwendig ist.
Desweiteren da der DC in jedem Fall gebraucht wird, kann das Objekt an den Anfang der OnPaint-Methode und die beiden anderen Objektdefinitionen vom DC können dafür weg.
-
Du hast die OnPaint-Nachricht mit dem Assistenten erzeugt, oder per Hand?
-
Jochen Kalmbach schrieb:
Du solltest eine eigene Klasse machen, die von CWnd abgeleitet ist. Darin dann die OnPaint überschreiben. Diese kannst Du dann in Deinen Dialog einbinden.
Hab aber gerade kein Beispiel da...
Sagt dir "Overkill" was?
-
weiss nicht wo das Problem liegt
Die Lösung von Jochen funktioniert er hat nur die maße der ellipse etwas komisch gesetzt (radius 0)
void CDrawDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); CPen pen; pen.CreatePen(PS_SOLID,4,RGB(0,0,0)); dc.SelectObject(pen); dc.Ellipse(50, 50, 150, 150);//<-- DA //CDialog::OnPaint(); } }
so funktionierts jedenfalls
-
Taelan schrieb:
Die Lösung von Jochen funktioniert er hat nur die maße der ellipse etwas komisch gesetzt (radius 0
)
Ich habs einfach vom OP übernommen
-
@taelan CClientDC vor die if-Schleife ziehen, wenner doch eh in beiden fällen gebruacht wird.
Ich könnt mir raten, er hat die OnPaint per Hand reingeschrieben. Dann würde natürlich das Makro in der MessageMap fehlen und seine OnPaint würde nie aufgerufen werden ... .
-
Ne. Woher soll dann der Code mit IsIconic kommen? Die Funktion wurde garantiert nicht von Hand erzeugt.
Und: "if-Schleife" *g*
-
Jochen Kalmbach schrieb:
Taelan schrieb:
Die Lösung von Jochen funktioniert er hat nur die maße der ellipse etwas komisch gesetzt (radius 0
)
Ich habs einfach vom OP übernommen
Ah seh ich grad, sry ^^
hatte mich schon über so nen banalen Fehler von dir gewundertPellaeon schrieb:
@taelan CClientDC vor die if-Schleife ziehen, wenner doch eh in beiden fällen gebruacht wird.
Ich könnt mir raten, er hat die OnPaint per Hand reingeschrieben. Dann würde natürlich das Makro in der MessageMap fehlen und seine OnPaint würde nie aufgerufen werden ... .
Ja funktioniert im Prinzip beides und das vor die If abfrage zu stetzen is wohl sinnvoller, war halt auch copy&past ^^
-
dEUs schrieb:
Ne. Woher soll dann der Code mit IsIconic kommen? Die Funktion wurde garantiert nicht von Hand erzeugt.
Und: "if-Schleife" *g*
Mist^^ Peinlich *im Boden versink*