Message-Wirrwar
-
Hallöchen,
ich habe folgendes Problem.
Ich habe ein Programm bei dem ich eine Trackbar (so ein Schieberegler) und links daneben ein Edit-Feld (Textbox). Jetzt soll man den Schieberegler der Trackbar ändern können und links im Textfeld soll dann der aktuelle Status (sprich, die Position des Reglers) angezeigt werden. Alternativ dazu soll man aber auch im Textfeld den Schritt eingeben können welcher dann vom Regler angenommen wird.
Bisher wird das so gelöst:
Wenn der Regler betätigt wird, ändert sich der Text entsprechend des Status des Reglers.
Wird ein Text ins Textfeld eingegeben so ändert sich der Schiebregler entsprechend der Eingabe.Ich nutze die WM_COMMAND und WM_HSCROLL Message zum Herausfinden, ob eine der beiden Schaltflächen betätigt wurde und starte dann die entsprechende Funktion um den Text an den Regler anzupassen oder andersrum (Regler an Text anpassen).
Das Problem dabei ist, sobald ich jetzt in der Funktion, welche den Text an den Regler anpasst den Textfeldinhalt ändere, wird die WM_COMMAND Message des Textfeldes gesendet. Und dann wird die Funktion, welche den Regler an den Text anpasst, ausgelöst. Also eine Rückkopplung der 2 Schaltflächen wobei die eine jeweils die andere auslöst durch die Message wenn der Inahlt der anderen Schaltfläche editiert wird.
Und genau das soll nicht passieren. Ich möchte nur eine der beiden Messages haben und wenn diese ausgelöst wird soll beim Anpassen der anderen Schaltfläche nicht deren eigene Message gesendet werden welche wiederum die gegengesetzte Funktion auslöst.
Lässt sich das irgendwie einrichten oder hat jemand einen anderen Lösungsansatz für das Problem - Status und Schiebregler zu Synchronisieren?mfg.
Ynnus
-
Hallo,
wenn ich dich richtig verstehe reagierst du auf jede WM_COMMAND Message. Da dürfte auch das problem liegen. Du solltest eine grössere Enschraenkung vornehemn und z.B nur auf EN_CHANGE messages für das Edit-Feld reagieren. Diese kommt in wparam von WM_COMMAND vor.
Ein bisschen code waere evtl auch nicht schlecht, da laesst sich das problem vllt auch besser erkennen/erklaeren.Gruss,
DeSoVoDaMuEDIT: genaugenommen HIWORD von wparam
-
Ja, ich werte auch den EN_CHANGE Teil der Editfelder aus. Nur, genau dieser Code für die WM_COMMAND wird leider mitgesendet wenn man den Text des Feldes per Message ändert. Obwohl man nicht direkt etwas eintippt und sich nur der Text ändert wird dieser EN_CHANGE Part mitgeschickt.

-
Da würd ich einfach eine Variable anlegen, z.B. static bool dontSend = false;
und in deiner Nachrichtenbehandlung schickst du nur eine Nachricht an das andere Controll, wenn dontSend nicht wahr ist. Direkt vor dem Senden der Nachricht setzt du dontSend auf true und danach wieder auf false.
Wenn irgendwo ein PostMessage aufgerufen wird funktioniert es so natürlich nicht, aber das kannst du ja schnell testen.