Avatar billede vandborg Nybegynder
11. oktober 2006 - 15:41 Der 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?
Avatar billede bulgroz Nybegynder
11. oktober 2006 - 20:43 #1
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.
Avatar billede lifo Nybegynder
11. oktober 2006 - 20:55 #2
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));
        }
Avatar billede lifo Nybegynder
11. oktober 2006 - 20:57 #3
du skal så erstatte rtbxChat med navnet på din ritchTextBox og så er det bare at kalde

scrollToBottom();
Avatar billede nielle Nybegynder
11. oktober 2006 - 21:06 #4
En 3. mulighed:

            this.richTextBox1.SelectAll();
            this.richTextBox1.SelectionStart = this.richTextBox1.SelectionLength;
Avatar billede vandborg Nybegynder
11. oktober 2006 - 21:11 #5
Tak for svarene allesammen :)

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 :)
Avatar billede nielle Nybegynder
11. oktober 2006 - 21:16 #6
Jeg springer bare over på denne her :^)
Avatar billede bulgroz Nybegynder
11. oktober 2006 - 21:28 #7
Svar
Avatar billede bulgroz Nybegynder
11. oktober 2006 - 21:29 #8
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester