2009-09-04 7 views
3

Je veux avoir 2 texboxes (riches) (vC# 2k8) avec le même défilement ... alors quand je défile tb1 le tb2 défile à la même position. J'utilise cette fonction:C#: SetScrollPos (user32.dll)

[DllImport("user32.dll")] 
static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); 

[DllImport("user32.dll")] 
public static extern int GetScrollPos(IntPtr hwnd, int nBar); 

Cela fonctionne très bien, mais

int pos = GetScrollPos(tb1.Handle, 1); 
SetScrollPos(tb2.Handle, 1, pos, true); 

ne définit que la barre de défilement à la même position, mais la mise à jour sur le texte là-dedans. tb2.Update() ou Refresh ne fonctionnera pas ...

Aidez-nous s'il vous plaît. Ty

Répondre

3

J'ai trouvé réponse

[DllImport("user32.dll")] 
static extern int SetScrollPos(IntPtr hWnd, int nBar, 
       int nPos, bool bRedraw); 

[DllImport("User32.Dll", EntryPoint = "PostMessageA")] 
static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam); 



public void ScrollTo(int Position) { 
    SetScrollPos((IntPtr)textBox1.Handle, 0x1, Position, true); 
    PostMessage((IntPtr)textBox1.Handle, 0x115, 4 + 0x10000 * Position, 0); 
} 
+0

Merci pour cela! Il s'agit de la seule publication sur Stackoverflow qui traite du défilement correct de l'incrément 32 bits (un précédent code que j'avais utilisé était seulement 16 bits de données, et utilisé "WM_VSCROLL"). Avez-vous des variations très subtiles sur ce qui précède? Je demande parce que même si cela a résolu mon cas, j'ai dû faire un peu plus de travail pour arrêter le scintillement de ligne .. Btw à GetScrollPos, on peut utiliser: public int GetScroll() {return GetScrollPos ((IntPtr) textBox1.Handle, (int) ScrollBarType.SbVert); } –

+0

cela a fonctionné où tant d'autres solutions ont échoué, merci –