3 verschiedene Frames gleichzeitig aktualisieren



  • Erstens du hast wieder den DC in einen lokale Variable gespeichert, aber na ja zum test geht das schon.

    Da alle deine Pains von der gleichen Klasse sind und du die Zeichenfunktion in der Draw hast, dann ist das doch Logisch das überall die gleichen kreise gezeichnet werden. Willst du immer unterschiedliche Sachen zeichnen die auf den gleichen Daten berugen, dann solltest du die Daten in deinem Dokument ablegen und für jedes Pain eine andere Klasse erstellen die dann die Daten aus dem Dokument unterschiedlich aufbereitet beim zeichnen.

    Wobei ist es niocht einfacher wenn dir schon die grundlagen fehlen das ganze erstmal mit einen View zu versuchen und dann sich an Splitterwindows zu wagen?

    SetAcxtivePain setzt doch auch nur das aktive Pain welchen den Eingabefocus hat.

    Mit GetPain(0,0) bekommst du einen CWnd Zeiger den du meiner Meinung mit InvalidateRect() aktualisieren kannst, ob das so geht kann ich dir aber nicht mit sicherheit sagen, ist nur eine vermutung.



  • ich danke dir vielmals. Werde es jetzt weiter versuchen, aber ich weiß jetzt, (was ich befürchtet habe) dass eine View klasse hierbei nicht ausreichen würde.

    Werde deinem Rat folgen und erstmal mit kleineren Sachen testen.

    Vielen Vielen DANK!!!!
    Grüsse - Mischa



  • na ja das geht schon mit einer View-Klasse, dann musst du nur irgendwie auswerten welches Pain es ist und dann in der Draw mit ner Switch Verzweigen, ob das dann übersichtlich wird steht auf einen anderen Blatt.



  • ja stimmt, ich kann es ja so machen:

    CMFCKlasseView *pView1 = new CMFCKlasseView(101);
    	CMFCKlasseView *pView2 = new CMFCKlasseView(110);
    	...
    	newSplitter->CreateView( 0, 0, pView1->GetRuntimeClass() , CSize(rect.Width()/2, rect.Height()/2), &context );
    	newSplitter->CreateView( 0, 1, pView2->GetRuntimeClass(), CSize(rect.Width()/2, rect.Height()/2), &context );
    

    und der Viewer wäre dann so:

    class CMFCKlasseView : public CView
    {
    protected: // Nur aus Serialisierung erstellen
    	DECLARE_DYNCREATE(CMFCKlasseView)  
    public: 
    	CMFCKlasseView(int cols);
    	int iCurrentPain;
    ...
    }
    CMFCKlasseView::CMFCKlasseView(int cols){
        iCurrentPain = cols;
    }
    
    void CMFCKlasseView::OnDraw(CDC* pDC){
    ... if(iCurrentPain == 101) ...
        else if(iCurrentPain  == 110) ...
    }
    

    habs schnell ausprobiert, aber blöderweise krieg ich dabei nen compiler fehler

    MainFrm.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CMFCKlasseView::CMFCKlasseView(void)" (??0CMFCKlasseView@@QAE@XZ)" in Funktion ""protected: void __thiscall CMainFrame::onViewStaticSplitter(void)" (?onViewStaticSplitter@CMainFrame@@IAEXXZ)".
    

    😞



  • der Konstructor is Protected den kannst du nicht überschreiben, aber du kannst durch aus die Variable nach dem erstellen befüllen, das sollte den gleichen effekt haben.

    CMFCKlasseView *pView1 = new CMFCKlasseView();
    pView1->iCurrentPain = 101;
    CMFCKlasseView *pView2 = new CMFCKlasseView();
    pView2->iCurrentPain = 110;
    

    wobei du auch ganz einfach da mit 1,2,3 und 4 arbeiten kannst solange du weisstwelche Pain gemeint ist. Was auch noch geht und ich meist bei soplchen Sachen benutze ist enum da kannst du anstatt Nummern zu Verwenden direkt namen benutzen für Pain_links_oben, Pain_rechts_oben und so weiter was dann die Lesbarkeit erhöht.



  • genau das habe ich auch bereits probiert.

    Ich initialisiere das Klassenobjekt und setze meine Variable auf einen bestimmten Wert.

    CMFCKlasseView *pView1 = new CMFCKlasseView(); pView1->iCurrentPain=1;
    	newSplitter->CreateView( 0, 0, pView1->GetRuntimeClass(), CSize(rect.Width()/2, rect.Height()/2), &context );
    

    In der OnDraw habe ich dann:

    CString s;	
    	s.Format(TEXT(" \n Pain: %d"),iCurrentPain);
    	TRACE0(s); 
    
    	COLORREF qCircleColor;
    	if(iCurrentPain==4){
    		qCircleColor = RGB(0,255,0);
    		CPen qCirclePen(PS_SOLID, 7, qCircleColor);
    		CPen* pqOrigPen = pDC->SelectObject(&qCirclePen);
    		pDC->Ellipse(200,200,300,300);
    	}
    

    in der Ausgabe habe ich:

    Pain: -842150451
    

    Das scheint, aber die Registeradresse zu sein 😞


  • Mod

    Das kann so nicht gehen. CreateView erzeugt selbst das View Objekt. Das Objekt, dass Du hier erzeugst wird nicht verwendet!
    Wo denn auch? Übergibst Du dieses pView Objekt an irgend jemanden?
    Wer soll es denn benutzen.
    Es ist einfach nur ein Speicherleck.

    Tipp: Entsprechende Daten sollen nicht im View stehen sondern im Dokument.

    Wenn Du an den View ran willst, den CreateView erzeugst musst Du ihn Dir holen mit GetPane.



  • danke dir,

    habs dank dir hingekriegt:

    CMFCKlasseView *nk;
    	nk = (CMFCKlasseView*)newSplitter->GetPane(0,0);	nk->iCurrentPain=1;
    	nk = (CMFCKlasseView*)newSplitter->GetPane(1,0);	nk->iCurrentPain=2;
    	nk = (CMFCKlasseView*)newSplitter->GetPane(0,1);	nk->iCurrentPain=3;
    	nk = (CMFCKlasseView*)newSplitter->GetPane(1,1);	nk->iCurrentPain=4;
    


  • iCurrentPain , lol 😃
    Das heisst "pane" du Keks.



  • hustbaer schrieb:

    iCurrentPain , lol 😃
    Das heisst "pane" du Keks.

    Woher willst du das wissen vielleicht ist es für ihn doch eher eine Qual und damit besser zu handhaben. Oder willst Du jetzt jemanden vorschreiben wie er seine Variablen benennt?



  • 😃
    um es mal zu erklären: zuerst dachte ich es soll "Paint" heissen nur waren die MFC Proggies zu faul und haben ein "t" vergessen.
    Nachdem ich raus gefunden was Pane heißt, hat es mir nicht sehr gefallen und ich habe mit Pain weiter gemacht 😃



  • CTecS schrieb:

    hustbaer schrieb:

    iCurrentPain , lol 😃
    Das heisst "pane" du Keks.

    Woher willst du das wissen

    Ich weiss es einfach. Guck dir doch bloss den Code an, ich würde sagen die Bedeutung der Variable ist ziemlich klar.

    CTecS schrieb:

    Oder willst Du jetzt jemanden vorschreiben wie er seine Variablen benennt?

    So lange "jemand" in meiner Firma arbeitet: ganz sicher will ich das!
    Soweit kommt's noch dass ich die komischen Namen die manche Leute da meinen verwenden zu müssen unkommentiert stehen lasse.

    Trifft auf MishaP natürlich nicht zu. Trotzdem darf man wohl noch was sagen. War ja nicht unfreundlich - "du Keks" ist ja keine Beleidigung. Ist bloss kurz für "Scherzkeks".



  • hustbaer schrieb:

    War ja nicht unfreundlich - "du Keks" ist ja keine Beleidigung. Ist bloss kurz für "Scherzkeks".

    habe ich auch nicht als Beleidigung empfunden 🙂


Anmelden zum Antworten