using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
namespace PaintIt { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
struct SCROLLINFO { public uint cbSize; public uint fMask; public int nMin; public int nMax; public uint nPage; public int nPos; public int nTrackPos; }
const int WM_VSCROLL = 277; const int SB_LINEUP = 0; const int SB_LINEDOWN = 1; const int SB_THUMBPOSITION = 4; const int SB_THUMBTRACK = 5; const int SB_TOP = 6; const int SB_BOTTOM = 7; const int SB_ENDSCROLL = 8;
int GetPos(IntPtr handle) { IntPtr ptrLparam = new IntPtr( 0 ); IntPtr ptrWparam;
// Get current scroller posion SCROLLINFO si = new SCROLLINFO(); si.cbSize = (uint)Marshal.SizeOf( si ); si.fMask = (uint)ScrollInfoMask.SIF_ALL; GetScrollInfo( handle, (int)ScrollBarDirection.SB_VERT, ref si ); return si.nPos; }
// Scrolls a given textbox. handle: an handle to our textbox. pixels: number of pixels to scroll. void scroll(IntPtr handle, int pos) { IntPtr ptrLparam = new IntPtr( 0 ); IntPtr ptrWparam;
// Get current scroller posion SCROLLINFO si = new SCROLLINFO(); si.cbSize = (uint)Marshal.SizeOf( si ); si.fMask = (uint)ScrollInfoMask.SIF_ALL; GetScrollInfo( handle, (int)ScrollBarDirection.SB_VERT, ref si );
// Get current scroller posion SCROLLINFO si2 = new SCROLLINFO(); si2.cbSize = (uint)Marshal.SizeOf( si ); si2.fMask = (uint)ScrollInfoMask.SIF_ALL; GetScrollInfo( handle, (int)ScrollBarDirection.SB_VERT, ref si2 );
// Send a WM_VSCROLL scroll message using SB_THUMBTRACK as wParam // SB_THUMBTRACK: low-order word of wParam, si.nPos high-order word of wParam ptrWparam = new IntPtr( SB_THUMBTRACK + 0x10000 * si.nPos ); SendMessage( handle, WM_VSCROLL, ptrWparam, ptrLparam ); }
Den skriver build succeded, og åbner programmet. Så begynder jeg at lave en masse linie skift i den ene RichTextBox med enter, og lige så snart scrollbaren bliver enabled, så hopper den ud af det.
Markerer dette med grønt: SendMessage(handle, WM_VSCROLL, ptrWparam, ptrLparam);
Og giver følgende fejlmeddelse: An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
Det samme gælder, hvis jeg tildeler begge en value med mange linieskift. Så lige så snart programmet åbner, og jeg prøver at benytte scrollbaren, så kommer fejl meddelsen...
Jeg har bare indsat det som du sagde, og så tilføjet Vscroll til begge. Men det er jo egentlig kun meningen, at man skal kunne scrolle i den ene richTextBox. Den anden har jeg fjernet scrollbars fra og sat enabled til false.
Jeg kan ikke få det paintit til at virke. Når jeg har indtastet nok tekst i den begge så man kan scrolle, og jeg så scroller, så kommer der alt muligt application error osv.
Her er kildekoden til det program i linket ovenover
using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
namespace PaintIt { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
struct SCROLLINFO { public uint cbSize; public uint fMask; public int nMin; public int nMax; public uint nPage; public int nPos; public int nTrackPos; }
const int WM_VSCROLL = 277; const int SB_LINEUP = 0; const int SB_LINEDOWN = 1; const int SB_THUMBPOSITION = 4; const int SB_THUMBTRACK = 5; const int SB_TOP = 6; const int SB_BOTTOM = 7; const int SB_ENDSCROLL = 8;
int GetPos(IntPtr handle) { IntPtr ptrLparam = new IntPtr( 0 ); IntPtr ptrWparam;
// Get current scroller posion SCROLLINFO si = new SCROLLINFO(); si.cbSize = (uint)Marshal.SizeOf( si ); si.fMask = (uint)ScrollInfoMask.SIF_ALL; GetScrollInfo( handle, (int)ScrollBarDirection.SB_VERT, ref si ); return si.nPos; }
// Scrolls a given textbox. handle: an handle to our textbox. pixels: number of pixels to scroll. void scroll(IntPtr handle, int pos) { IntPtr ptrLparam = new IntPtr( 0 ); IntPtr ptrWparam;
// Get current scroller posion SCROLLINFO si = new SCROLLINFO(); si.cbSize = (uint)Marshal.SizeOf( si ); si.fMask = (uint)ScrollInfoMask.SIF_ALL; GetScrollInfo( handle, (int)ScrollBarDirection.SB_VERT, ref si );
// Send a WM_VSCROLL scroll message using SB_THUMBTRACK as wParam // SB_THUMBTRACK: low-order word of wParam, si.nPos high-order word of wParam ptrWparam = new IntPtr( SB_THUMBTRACK + 0x10000 * si.nPos ); SendMessage( handle, WM_VSCROLL, ptrWparam, ptrLparam ); }
Så fik jeg det sgu til at virke. Tusind tak skov_p (:
Jeg har lige et spørgsmål.
Det virker når man bruger musens scroll ting, og hvis man trykker på op eller ned pilene på scrollbaren, men hvis man klikker på selve scrollbaren og trækker den, så "opdaterer" den først når man slipper venstre museklik igen...
Nåh ok. Det er fordi jeg bruger et komponent "Gravitybox". Den har også et scroll, men ikke nogen event som hedder Vscroll. Den har dog VerticalScroll, men det mærkelige er, at den ikke kan læse WM_SCROLL. Den opfanger den slet ikke. Jeg har så prøvet med WM_MOUSEWHEEL, men den fungerer helt forkert.
Også selve si.nPos værdien er 0 hele vejen igennem. Ved denne if sætning burde den gå ind i if, men den tager else i stedet for, pga. de andre si. værdier er lig 0.
if (si.nPos < (si.nMax - si.nPage)) si.nPos = pos; else { ptrWparam = new IntPtr(SB_ENDSCROLL); SendMessage(handle, WM_MOUSEWHEEL, ptrWparam, ptrLparam); }
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.