starkes Flackern in DialogBar
-
Mittwoch, 20. Februar 2013 12:12
Hallo zusammen,
ich habe eine Problem mit dem Flackern der Dialogbar. In der DialogBar soll die aktuelle Mausposition angezeigt werden. Die Werte werden entsprechend über MouseMove übergeben und dann kommt es zum Flackern.
Ich habe schon OnEraseBkgnd(CDC* pDC) sofort wieder mit TRUE zurückkommen lassen, auch dies ändert nichts an dem Problem.
Ich erstelle die DialogBar mit
if(!m_wndLagerControlDlgBar.Create(this, IDD_LAGERCTRLDLGBAR, CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_LAGERCTRLDLGBAR,pContext))
Hat jemand vielleicht noch einen Tip wie ich diese lästige Flackern weg bekomme?
Danke im vorraus, Torben
- Bearbeitet Torben Gliem Mittwoch, 20. Februar 2013 12:13
Alle Antworten
-
Mittwoch, 20. Februar 2013 13:35Moderator
Wir ist das gelöst in dem CDialogBar mit der Anzeige, sind das Statics die da eingebettet sind?
Wire stösst Du an, dass die Anzeige aktualsiert wird. Doch nicht etwa durch jeden OnMouseMove?
Es ist viel einfacher einen OnUpdae Handler für die Sektion zu bauen, die bei Bedarf (das macht sie selbr), die Cursorposition holt und anzeigt. Genauso wie das mit den Anzeigen ür UMSCHALT, LOCK, NUM-LICK gemacht wird.
Der Vorteil ist, dass das Update erfolgt, wenn keie weiteren Nachrichten einlaufen und nicht bei jedem Mausmove.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
-
Mittwoch, 20. Februar 2013 13:58
Der Ablauf bei der Aktualisierung der Koordinaten ist wie folgt:
Ich habe einen Quader mit X- und Y-Koordinaten.
Wenn ich diesen verschiebe wird OnDraw aufgerufen die den Quader an die neue Stelle zeichnet und die X- und Y-Koordinaten an die DialogBar sendet.
Dabei kommt es zu dem Flackern.
-
Mittwoch, 20. Februar 2013 14:33Moderator
Das erklärtnicht, was Du für Controls in dem Dialog hats, was Du für Methoden verwendest.
Wie schon gesagt, würde ich das erst machen, wenn es nötig ist, also im OnUpdate Handler.
Nichts desto trotz, wenn es klackert gibt es mehrere Probelem entweder mit dem Parent, odermit dem Control selbst das die Daten anzeigt. Wo hast Du denn WM_ERASEBKGND behandelt? Im Toolbar bringt das nichts, wenn da noch ein weiteres Control im Spiel ist.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
-
Donnerstag, 21. Februar 2013 14:05
Hallo Herr Richter,
ich hoffe ich kann Ihnen Ihre Fragen beantworten:
Die OwnDialogBar enthält einen Dialog mit 25 Labels, einer ComboBox und einem Button.
Die OwnDialogBar selbst ist von CDialogBar abgeleitet.
Im MouseMove wird überprüft ob sich die Position bei gedrücker linker Maustaste geändert hat. Dann wird Parent der "Zeichenfläche" benachrichtigt welches in der OwnDialogBar direkt den Text ändert und dann ein Invalidate aufruft. Dadurch wird in der OwnDialogBar OnPaint aufgerufen. Die OwnDialogBar enthält einen Farbverlauf der in der OnPaint gezeichnet wird. Hierzu wird ein CMemDC verwendet. Die OnEraseBgnd wird in OwnDialogBar direkt mit True zurückgegeben.
-
Donnerstag, 21. Februar 2013 19:36Moderator
Das verhindert aber nicht das Flackern durch das neu Zeichnen der Controls!
Dir muss klar sein, adss CMemDC dann nurim Parent funktioniert. Aber oft genaug haben solche Dialgbars WS_CLIPSIBLINGS. Damit werden genau die Cleints vom Redraw ausgenommen und Flackern natürlich. Es kann gut sein, dass gerade Dein CMemDc im Diaogbar kontroproduktiv wirkt.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort vorgeschlagen Martin RichterMVP, Moderator Donnerstag, 28. Februar 2013 08:26
-
Freitag, 22. Februar 2013 18:57
Danke Martin für den Hinweis.
ich werde mir das nochmal in aller Ruhe anschauen, auch in Bezug zu deinem Hinweis mit dem WS_CLIPSIBLINGS. Ich denke ich werde die Sache mit dem OnUpdate-Handler auch versuchen umzusetzen.
Erstmal vielen Dank für die Infos.

