Kreis zeichnen; was ist falsch



  • 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 gewundert 🙄

    Pellaeon 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*



  • Wow, Danke für die zahlreiche Hilfe, es funktioniert 😃

    Jetzt hab ich in der MSDN gesehen, dass man mit GDI+ tolle Verläufe machen kann. Genau das was ich für meinen Zweck brauche!!! Ich kenn mich mit GDI+ aber noch weniger aus, als mit GDI, deswegen möchte ich fragen, ob es noch andere Möglichkeiten (z.B mit GDI) gibt einen Verlauf zu erstellen 😕

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/usingGDIPlus/fillingshapeswithagradientbrush/creatingapathgradient.asp

    Könnt ihr mir bitter weiterhelfen,

    Danke und chiao cha-OS



  • Afaik nur durch einen API Call gehts nicht aber du kanst natürlich die Länge des zu zeichneten Rechtecks hohlen. Die zwei Farben nehmen und dann viele kleine rechtecke zeichnen und die Farben Interpolieren.



  • Wieso willst du nicht die GDI+ nehmen?
    Wir haben dazu in unserem C++-Magazin auch einen sehr schönen Artikel dazu. 👍
    Solltest du dir auf jedenfall ansehen!



  • das klingt komplizierter als das mit GDI+, aber danke für den Tipp! Gibt es irgendwo Codebeispiele für meine Zwecke mit GDI+, denn ich hab noch nichts brauchbares gefunden!

    ciao cha-OS


Anmelden zum Antworten