Editfeld - nach unten scrollen
-
Moin.
Ich habe ein Editfeld erstellt, in dem nun automatisch Nachrichten ausgegeben werden sollen. Naja und dabei ist es natürlich sinnvoll, wenn immer die letzte Nachricht angezeigt wird. Aber wenn das Fenster neu gezeichnet wird, ist der Scrollbalken natürlich immer ganz oben. Wie kann ich es anstellen, dass er automatisch unten bleibt / nach unten gesetzt wird?
Die Forensuche habe ich schon benutzt, und das hier gefunden. Dort wird EM_SCROLLCARET als (unbestätigter!) Lösungsweg vorgeschlagen. Nun, bei mir bringt das garnichts.
mfg Rab-Bit
-
Wie sieht denn dein Code damit aus? Evtl. musst du vorher noch mit EM_SETSEL den Caret (bzw. die Markierung) ans Ende setzen

-
kurz gefragt: wo sitzt immer das neuste Posting in diesem Thread????
richtig, ganz oben.
alten text holen
neuen Text oben drauf setzten
alten mit neuen oben drauf zurückschreibenfinde ich die bessere Lösung, ist aber abhängich vom Verwendungszweck.
-
Code? Na, wenn du meinst ... dann pote ich mal das wichtigste
hwndAusgabe = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | WS_VSCROLL | WS_HSCROLL | WS_BORDER | ES_MULTILINE, 10, 10, 490, 250, hwnd, (HMENU) 2, hInstGlobal, NULL);Das ist schonmal das Feld für die Ausgabe. Und da kommt halt so die Nachricht rein:
GetWindowText(hwndAusgabe, OldMsg, sizeof(OldMsg)) wsprintf (TheMsg, TEXT ("%s \r\n %s"), OldMsg, NewMsg); SetWindowText(hwndAusgabe, TheMsg);So, hier hole ich eben den alten Text, schreibe den neuen unten dran und beides wieder in Textfeld. Wie meinst du das jetzt mit Markierung ans Ende setzen?
@Micha
Ja, so hatte ich das auch schon. Aber das gefällt mir garnicht. Neue Nachrichten müssen IMHO unten dran! Mit einer anderen Lösung könnte ich mich nur schwer anfreunden.
mfg Rab-Bit
-
Gut wenn oben drauf nicht das wahre ist für dich.
spontan fällt mir z.b. EM_SCROLL ein, im wParam SB_LINEDOWN, EM_LINESCROLL giebt es auch noch zum Scrollen um 'n' Zeichen horizontal und vertikal.
Habe das aber jetzt nur dürftig im Kopf, MSDN sagt sicher mehr dazu.
-
Also mit SendMessage(hwndAusgabe, EM_SCROLL, SB_PAGEDOWN, 0) klappt es erstmal schon, aber eben nur erstmal. Nach etlichen Nachrichten ist der Scrollbalken nicht mehr unten, sondern bewegt sich eher auf die Mitte zu. Man sieht die neuen Nachrichten also nicht mehr.
Dafür habe ich flenders' Methode nochmal ausprobiert. Und mit SendMessage(hwndAusgabe, EM_SETSEL, 0, -1) und SendMessage(hwndAusgabe, EM_SCROLLCARET, 0, 0) funktioniert's jetzt. Also wenn ich die beiden Funktionen nach der Ausgabe der neuen Nachricht aufrufe, sehe ich immer die unterste Nachricht, so wie ich's wollte. Also vielen Dank an euch beide.
mfg Rab-Bit
-
Nur als Anmerkung:
wenn du auch so ein Chat ding programmierst, oder das Edit sehr viel aufnehmen muß, solltest du lieber ein RichEdit nehmen und dessen Kapazität erhöhen.Kapazität erhöhen,
SendMessage(RichEdit_HWND, EM_EXLIMITTEXT, 0, (LPARAM)(DWORD)25165824);auf 24 MB, als Beispiel.
Des weiteren kannst du auch mit EM_GETLINECOUNT die Anzahl Zeilen ermitteln und mittels:
SendMessage(Edit_HWND, EM_LINESCROLL, 0, Anzahl_Lines-1);stets unten sein, wie gewollt, vorteil: du hast in einem Rutsch die aktuelle Anzahl an zeilen.