gezeichnetes Rechteck verschwindet



  • Hallo Leute, 🙂

    Ich hab ein SDI Formular und zeichne din meiner Funktion drawrect()
    ein gefülltes Recht eck mittels pMyDC->FillSolidRect in den Client Bereich,
    wenn ich das Fenster mit der Maus neu positioniere verschwindet das Rechteck, wie und was muss ich Updaten, bei Dialogfeldern wars UpdateData aber was ist es denn bei SDI Formularen ?

    ... vielen Dank scon mal für eure Hilfe
    😉
    ShadowEater



  • Du mußt die gesamte Zeichnerei in der OnPaint()-Verarbeitung erledigen, sonst werden deine Daten beim nächsten Neuzeichnen mit der "normalen" Ansicht überschrieben (und das Fenster wird recht oft neu gezeichnet - z.B. beim Verschieben, bei Größenänderungen oder wenn es zwischenzeitlich von einem anderen Fenster überdeckt war).



  • Ich muss also meine Funktion DrawRect aus OnPaint aufrufen und OnPaint aus LButtonDown?
    ist das so richtig ?

    ShadowEater



  • DrwRect musst Du (nur) aus OnPaint aufrufen.
    Und in "LButtonDown" musst Du "InvalidateRect()" aufrufen.



  • Hmmm, aber wenn ich in onPaint DrawRect aufrufe ist das Rechteck gleich zu Programmstart zu sehen, ich möchteb aber dass es erst bei LButtonDown erscheint und sichtbar bleibt wenn das Fenster neu positioniert wird.

    ShadowEater 😕



  • Mach dir doch nen bool, obs gezeichnet werden soll oder nicht. 😉



  • Tut mir leid aber ich komm nict drauf 😞 , hier mal meine beiden Funktionen :

    void CSieb3View::OnFileNew() 
    {	
    	CDC *pDC = new CDC;
    	pDC = GetDC ();
    	mark(pDC);	// mark = markieren, hir wird gezeichnet
    
    	bool zeichnen;
    	zeichnen = ???;
    	if (zeichnen == ???)
    	{
    		OnPaint();
    	}
    	zeichnen = ???;
    }
    
    void CSieb3View::OnPaint() 
    {
    	CPaintDC dc(this); 	
    	CDC *pDC = new CDC;
    	pDC = GetDC ();
    
    	createGrid (pDC);
    	createNumbers (pDC);
    	mark(pDC);	
    }
    

    bin echt dankbar für eure Hilfe !

    ShadowEater



  • Nanana, als lokale Variable hilft dir der bool nicht.
    Mach den mal als Member in der Klasse.

    Und dann sollte es etwa so gehen:

    void CSieb3View::OnFileNew()
    {   
    // Hier wird nicht mehr gezeichnet!
        m_zeichnen = true;
    Invalidate(); // OnPaint ruft man nicht direkt auf, sondern so.
    }
    
    void CSieb3View::OnPaint()
    {
    if (m_zeichnen)
    {
        CPaintDC dc(this);    
        CDC *pDC = new CDC;
        pDC = GetDC ();
    
        createGrid (pDC);
        createNumbers (pDC);
        mark(pDC);   
    }
    }
    


  • Hi estardu,

    hab folgendes von Hand in die View.h eingefügt :

    // Attribute
    public:
    	CSieb3Doc* GetDocument();
    bool m_zeichnen;//<-------------------------------
    // Operationen
    public:
    

    Starte ich den Code ist die Markierung wieder da ! 😞

    regards
    ShadowEater



  • Du musst das im Konstruktor noch initialisieren!

    m_zeichnen = false;
    


  • Jaaa jetzt klapps bis auf ein paar Details 😉

    Danke estardu, nur reis aus Interesse gibts da auch ne Möglichkeit das über Zeiger irgendwie zu machen ?

    regards
    ShadowEater



  • Zeiger? 😕
    Was für Zeiger? Wodrauf sollen die zeigen?


Anmelden zum Antworten