Dialog Refresh
-
hi,
ich habe einen Dialog mit bitmap als Hintergrund.
damit ich die bitmap auch hinter dem text habe steht natürlich
der Background auf Transparent.Naja mein Problehm ist nun das durch die Transparens der alte text in den
statictext feldern natürlich nicht gelöscht sondenr überschrieben wird.
Also es sammelt sich immer mehr text übereinander.zur lösung dachte ich nun ich setze einfach ein Invalidate();
gut und schön aber das resultat ist leider das meine hintergrundbittmap flackert, meine frage ist nun an welcher stelle ist das Invalidate(); am besten um das zu vermeiden.
Oder kann ich es irgendwie auswerten das mein programm den inhalt in einer der Statictext bereiche verändert hat, um an der stelle dann ein Invalidate(); zu setzen ?
es einfach mit in den bereich zu setzen wo der text generiert wird geht leide rnicht, da es sich dabei um einen timer handelt, der im 2 sec tackt abfragen macht und einfach den gefundenen inhalt neu schreibt.
-
Du solltest Deine Bitmap unter nem OnPaint-Handler in einen Speicherkontext zeichnen, danach(=darauf) den Text in den Speicherkontext zeichnen und anschließend den Speicherkontext auf den Bildschirm-Gerätekontext blitten.
Falls das nicht hilft, würde ich noch das Fenster-Style-Flag WS_CLIPCHILDREN setzen.
-
Ich würde den Hintergrund in OnEraseBkGnd sezen und zeichnen. Andernfalss wird erst der Hintergrund leer gesetzt und dann die Bitmap drüber gelegt. Das führt meistens zu einem Flackern.
-
Danke das waren die denk mal tritte die mir gefehlt haben

-
ich glaub so richtig hab ich es noch nicht hinbekommen.
BOOL CDimuRadioDlg::OnEraseBkgnd(CDC* pDC) { 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 ); return TRUE; }Jetzt bekomme ich zwar meinen HintergrundBitmap flackerfrei, aber die transparenten Objekte flackenr wild vor sich hin.
Und Invalidate(); funktioniert auch nicht mehr um einen refresh auszulösen.
Sprich ich bekomme den inhalt der transparenten textbereiche nicht mehr erneuert.ich dnek mal ich hab noch was wichtiges vergessen, meine festellung ist nämlich das sich der gewünschte refresh einstellt so wie ich einen button auf dem dialog anklicke.
kann mir vileicht noch mal wer auf die sprünge helfen

-
Wenn Du transparente Objekte hast kannst Du nicht mit WS_CLIPCHILDREN arbeiten! Du kannst das mehr oder weniger nicht vermeiden. Oder zumidnest nur so vermeiden, dass Du eben nicht alles neu anzeigst.
-
Gibts den ne bessere Möglichkeit?
Man merkt ja das ich noch nich grad der erfahrenste bin ums mal so auszudrücken
Ich hab mir zum Lernen ein Programm geschrieben das verschiedene Slider und Buttons hat, zusätzlich sind 3 Static text vorhanden.
Den inhalt der Textfelder tausche ich durch einen Timer.
Da ich nicht weiss ob ich irgendwie festellen kann ob sich ein feld geendert hat mache ich halt nen Refresh sowie der Timer aufgerufen wurde.
im grunde müsste nur das Textfeld selbst Refresht werden.Oder lieber ne bitmap in das Textfeld einkopieren und dadurch dem Hintergund anpassen ?
Teoretisch hab ich da ne menge Ideen, aber ob die umszusetzen sind keinen schimmer

-
Um nur ein Textfeld zu ändern musst Du dochnur dem Textfeld seinen neuen Wert zuweisen. "Refreshen" musst Du gar nichts. Windows macht das selbst!
-
Nein grade nicht.
Wenn ich meine bitmap als Hintergrund einfüge nicht.
Ich möchte ja das man meinen Hintergund überall sieht deshalb sind wie gesagt die textfelder transparent.
Der Effekt der dabei entsteht ist das der neue Text über den alten geschrieben wird, is doch auch klar er schreibt nur die Pixel des neuen Textes in das Textfeld der transparente Bereich, der Pixel des alten Textes enthalten kann bleibt wie er ist.ich hab dir mal nen screenausschnitt gemacht damit du siehst was ich meine.
http://84.19.176.171/textfeld.jpg
so sieht das textfeld aus nachdem der vorhandene Text des feldes durch einen anderen ersetzt wurde. die schnörkel im background machen auch nen bissl deutlich warum ich das Transparent habe.Dieses Problehm liese sich dadurch lösen wenn ich dem einzelnen Textfeld sagen könnte "löschen/neuzeichnen" statt den ganzen Dialog zu refreshen.
Oder ist es möglich das ich zb den bereich den das Textfeld überdeckt aus dem hintergund in das Textfeld kopiere, also so das es nicht mehr transparent ist aber trotzdem als Hintergund meine Bitmap enthält ?
Wäre zwar ne Fummelei aber der drang zum Design treibt einen ja zu manscher schandtat