Dialog Refresh 2



  • Hi,

    wie ja schon mal im Tread
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-168627.html
    deutlich geworden ist habe ich si meine Problehme mit dem Refreshen meines Dialogs.

    ich habe mir nun gedacht ich lege mir einen zwischenspeicher an für den inhalt des Static Text. den vergleich ob der text der gesetzt wird neu ist hab ich den vollgenden code erstellt, die Funktion ist ja eindeutig denk ich mal, wenn der inhalt der beiden var´s nicht gleich ist dann den neuen inhalt in den zwischenspeicher und neuzeichnen.

    // dieser bereich wird mit Timer gesteuert 1 mal pro Sek. aufgerufen
    // der inhalt von ausgabe wir vorher erzeugt.
    
    m_Ctiteltext.SetWindowText(ausgabe);
    
    if ( strcmp (titelalt,ausgabe) != 0)
    {
             titelalt = ausgabe;
    	Invalidate();
    }
    

    Was für mich dabei nicht zu erklähren ist, das ganze Funktioniert genau ein mal.
    Beim zweiten durchlauf bei dem er feststellt das die inhalte nicht gleich sind, wird zwar der inhalt der if durchlaufen, aber das Invalidate hat keinerlei wirkung. Das es so ist sehe ich daran das ich mir zum test "titelalt" und "ausgabe" im dialog ausgeben lasse, wobei man eine gewisse verzögerung bei der übernahme festellen kann.

    ich habe alles mögliche ausprobiert, egal ob UpdateWindow oder sonstige möglichkeiten mein Dialog wird nicht neu gezeichnet.

    dann habe ich mich noch mit dem Refresh einzelner bereiche beschäftigt, also nen RECT etc pp erzeugt und ein Invalidate das Resultat ist imemr das gleiche. Nämlich keins, kann mir den keiner der alten hasen hier sagen warum mein Invalidate nicht ordnungsgemäss Funktioniert 😕



  • so ich hab jetzt so lange gefummelt bis ich was Funktionierendes gefunden habe.

    CRect Ctext3Rect;
    	CWnd *ptext3Wnd = GetDlgItem(IDC_STATIC3);
             ptext3Wnd->GetWindowRect(Ctext3Rect);
    	ScreenToClient(Ctext3Rect);
             InvalidateRect(Ctext3Rect, TRUE);
    	UpdateWindow();
    

    an die stelle an der ich vorher das Invalidate hatte hab ich diesen code als ersatz stehen.

    Für die unter euch die es nicht wissen was das macht ne erklährung.
    ich hole mir die koordinaten des CStatic welches sich verändert hat und führe auf diesen Bereich ein Refresh aus.
    Der aufwand loht sich für mich in diesem fall, es wird nur der bereich refresht der sich verändert hat, das heist das wilde geflacker wie ich es schon im ersten Beitrag beschrieben habe ist damit vergangenheit.

    jetzt Flackert nix mehr selbst wennich alle 30 ms nen refesh mache (was es ja nich braucht, habs aber mal getestet 😃 )

    Und trotz der geringen Teilnahme an meinem Beitrag ein Lob an die Betreiber und Teilnehmer des Forum, grade der FAQ Bereich ist für einen Anfänger sehr hilfreich 🙂


  • Mod

    Das Invaliadte ist nach meinem Wissen unnötig. Es genügt den SetWndowtext auszuführen und anschließend UpdateWindow auszuführen.

    Dein Problem ist, dass Du keine nachrichtenschleife hast, die erst dazu führt, dass Fenster Ihre ausstehenden WM_PAINT Nachrichten erhalten.



  • hmmm da frag ichmich was da wohl fehlen könnte 😕

    afx_msg void OnPaint();
    	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    	afx_msg void OnDraw(CDC* dc);
    

    braucht man mehr als diese fürs zeichnen 😕
    Im OnEraseBkgnd habe ichnur ein return TRUE.
    ich denk mal das Problehm wird eher in der OnPaint sitzen, da ich dort meinen Background zeichne ist das CDialog::OnPaint(); auskommentiert.

    Naja das übertagen des Textes und ein UpdateWindow haben ja nichts mehr gemacht, genauso wehnig hat das Invalidate Funktioniert.
    Jetzt wo ich ihm mitteile das sich in dem Bereich etwas verändert hat zeichnet er es ja neu. Ich weiss es ja noch nicht aber ich habe das einfach für das notwendige übel gehalten wenn man einen Bitmaphintergrund hat und alle objekte darauf Transparent dargestellt werden. 🙄

    Ich denk mal wenn ich mir den source in einige rzeit noch mal ansehe wird mir eh schlecht 😃


  • Mod

    Zeig mal ein paar Teile Deiner OnPaint Funktion. Gerade den Anfang.
    Onraw kannst Du wegschmeissen, die benötigt man nur in Views.



  • if (IsIconic())
    	{
    	... hab ich mal entferntis ja nur das icon zeichnen drin ....
             }
    	else
    	{
    		CPaintDC dc( this );
    		CBitmap bmp, *poldbmp;
    		CDC memdc;
    		bmp.LoadBitmap( IDB_BITMAP1 );
    		memdc.CreateCompatibleDC( &dc );
    		poldbmp = memdc.SelectObject( &bmp );
    		dc.BitBlt( 0, 0, 563, 237, &memdc, 0, 0, SRCCOPY );
    		memdc.SelectObject( poldbmp );
    		//CDialog::OnPaint();
    	}
    }
    

    das is auch schon alles, dann noch in erasebkng nen return True damits nich flackert.


  • Mod

    Das ist ja OK. Ich bleibe dabei. Wenn Du in ein Control einen neuen Wert setzt mit SetWindowText und anschließend UpdateWindow ausführst genügt das!



  • naja is ja schön das du dabei bleibst, aber es geht nun mal nicht.
    es nutzt mnir nichts wennich im laufe der zeit 10 verschiedene texte übereinander stehen habe, weil er nicht refresht wenn neuer text raus geht 🙂
    ein Beispiel wies ausschaut hab ich ja schon im alten tread gepostet.
    Wenn du sagst das der aufbau ok ist und es gehen müsste frage ich mich weiterhin warum es nicht geht.


Anmelden zum Antworten