(WinAPI) Zeichnen



  • Hallo.

    Bin mir nicht sicher, ob ich im richtigen Forum dafür bin.

    Ich wollte gerade einen Kreis in ein Eingabefeld zeichnen. Das klappt aber nicht. Bekomme unbehandselte Ausnahme.

    Kurz mein Code:

    CPaintDC *dc;
    
    //einen Stift zum Zeichnen deklarieren
    CPen lSolidPen(PS_SOLID,1,RGB(0,0,0));
    
    //alten Stift speichern, um ihn am Ende der Funktion wieder zu setzen
    CPen *lOldPen;
    //lOldPen = dc->SelectObject(&lSolidPen);
    
    //Abmaße und Koordinaten des Zeichenfeldes beschaffen
    CRect lRect;
    m_Bild.GetClientRect(lRect);
    lRect.NormalizeRect();
    
    //Mittelpunkt der Zeichenfläche berechnen
    CPoint Mittelpunkt;
    Mittelpunkt.x = (lRect.left - lRect.right)/2;
    Mittelpunkt.y = (lRect.top - lRect.bottom)/2;
    
    //Test
    CRect test;
    test.left = Mittelpunkt.x-10;
    test.right = Mittelpunkt.x+10;
    test.bottom =Mittelpunkt.y+10;
    test.top = Mittelpunkt.y-10;
    
    dc->Ellipse(test);
    UpdateData();
    RedrawWindow();
    

    Bei dc->Ellipse(test) kommte der Fehler.

    Hier kann eine Menge falsch sein, probiere mich das erste mal am Zeichnen.

    Bin für jeden Hinweis und Tipp dankbar.

    Cu
    Oli



  • Der Zeiger "dc" zeigt ins Nirvana. Gib ihm Speicher mit new oder leg ihn auf dem Stack an.



  • Sobald ich bei CPaintDC *dc was ändere, meckert er.

    Habe irgendwo gelesen, das ich es so deklarieren muß: CPaintDC dc(this)

    Da meckert er aber auch.

    Könntest Du mir die Zwei Zeilen für CPaintDC und Ellipse schicken?

    Würde mir echt weiter helfen.

    Cu
    Oli



  • Habe es jetzt hinbekommen.

    Leider ist aber nicht zu sehen.
    Wollte den Kreis genau in die Mitte eines Eingabefeldes setzen.

    Weiß bei sowas noch jeman Rat oder ist es besser auf eine andere Unterfläche zu zeichnen?

    Cu
    Oli



  • Stell dich doch nicht so dumm an. Sag doch wenigstens die Fehlermeldungen. Normalerweise macht man

    CPaintDC dc(this);

    Das setzt natürlich voraus, das du den Code in einer Fensterklasse schreibst, so das this vom Typ CWnd* ist.



  • So.

    Habe CPaintDC dc(this) angewandt.

    Funktion läuft nur mit dem einen Problem, das überhaupt nichts von der Ellipse zu sehn ist.

    Cu
    Oli



  • Du zeichnest die Ellipse in die Mitte eines Eingabefeldes? Blende mal das Feld aus, und sag mir was du siehst ;).

    cya 🙂



  • Hallo.

    Habe das Eingabefeld jetzt komplett raus gelöscht. Es ist nichts zu sehen.

    Habe es auch mit fester Vorgabe von Koordinaten probiert.
    x1= 200;
    y1 =100;
    x2= 300;
    y2=200;

    oder so ähnlich, aber auf jedenfall in der nähe.

    Bei solchen Koordinaten müßte es auf jeden Fall auf dem Dialogfeld zu sehen sein.

    Dialogfeld ist in der Bildschirm mitte eingeblendet.

    Hast Du noch einen Rat, woran ein liegen könnte?

    Cu
    Oli



  • bei dem RedrawWindow() löscht er aber nicht wieder die Ellipse oder?



  • Habe kein RedrawWindow()mehr drin.

    Mein Code sieht nach rum probieren so aus:

    //Kontext zum zeichnen holen
        CPaintDC dc(this);
    
        //einen Stift und Pinsel zum Zeichnen deklarieren
        CPen lSolidPen(PS_SOLID,1,RGB(255,0,0));
        CBrush lSolidBrush(RGB(255,0,0));
    
        //alten Stift speichern, um ihn am Ende der Funktion wieder zu setzen
        CPen *plOldPen;
        plOldPen = dc.SelectObject(&lSolidPen);
        CBrush *plOldBrush;
        plOldBrush=dc.SelectObject(&lSolidBrush);
    
        //Abmaße und Koordinaten des Zeichenfeldes beschaffen
        CRect lRect;
        GetClientRect(lRect);
        lRect.NormalizeRect();
    
            //Mittelpunkt der Zeichenfläche berechnen
        CPoint Mittelpunkt;
        Mittelpunkt.x = (lRect.right - lRect.left)/2;
        Mittelpunkt.y = (lRect.bottom - lRect.top)/2;
    
            dc.SelectObject(&lSolidPen);
        dc.SelectObject(&lSolidBrush);
    
    dc.Ellipse(Mittelpunkt.x,Mittelpunkt.y,Mittelpunkt.x+50,Mittelpunkt.y+100);
    
           //Alten Stift und Pinsel wieder übergeben
        dc.SelectObject(plOldPen);
        dc.SelectObject(plOldBrush);
    

    Habe ich noch irgend einen Fehler??

    Cu
    Oli 😕 😕



  • Ab nach Winapi mit dir 😉


Anmelden zum Antworten