11. oktober 2006 - 15:41Der er
6 kommentarer og 2 løsninger
Scroll til bunden i en RichEdit
Hej Eksperter!
I forbindelse med et chatprogram bruger jeg en richedit til at skrive modtaget tekst i. Mit problem ligger i at den ikke automatisk scroller ned i bunden så man kan se det nyeste tekst... Har prøvet at fikse det ved at bruge ScrollToCaret() men synes ikke det virker.
Så mit spørgsmål er dette: Er der nogen måde at kunne scroll til bunden af en richedit?
Overvej som det første om du ikke burde vælge en mere liste opbygget kontrol, så som DataGridView etc. det vil du kun blive glad for i længden.
Dernæst. At scrolle til caret, er ikke det samme som at scrolle til sidste linie. At scrolle til caret scroller til den position hvor markøren er placeret, hvilket ikke automatiskt er sidste position.
Den letteste og (lidt grimme løsning) er at sende Ctrl+End til din kontrol.
Først skal du sikre dig at modtagerkontrollen har focus. dernæst "fyrer" du keystroaket: Her et eksempel på en RichTextBox, som derved scroller til bunden af dokumentet.
this.richTextBox1.Focus(); // Du må sikre dig at din kontrol har focus SendKeys.Send("^{END}"); // For ellers vil SendKeys.Send ramme den forkerte kontrol
Personligt ville jeg dog vælge en alternativ kontrol, som i øvriugt også ville bidrage dig med yderligere muligheder med formatering etc.
har engang for lang tid siden rodet med samme problem prøvede forskellige løsninge med varierende success men endte med at lave følgende som fungerede best
// til scroll support const int SB_VERT = 1; const int EM_SETSCROLLPOS = 0x0400 + 222;
[DllImport("user32", CharSet=CharSet.Auto)] public static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos);
[DllImport("user32", CharSet=CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, POINT lParam);
[StructLayout(LayoutKind.Sequential)] public class POINT { public int x; public int y; public POINT() { } public POINT(int x, int y) { this.x = x; this.y = y; } } private void scrollToBottom() { int min, max; GetScrollRange(rtbxChat.Handle, SB_VERT, out min, out max); SendMessage(rtbxChat.Handle, EM_SETSCROLLPOS, 0, new POINT(0, max - rtbxChat.Height)); }
Har ikke så meget styr på point deling herinde, men kunne bruge info fra alle svarene... Det mest rigtige vil vel være at dele pointene mellem alle 3? bulgroz og nielle, hvis i ønsker på så skriv lige et svar, ellers får lifo alle :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.