/** Made by Lonami Exo
* 31 - January - 2015
* (C) LonamiWebs - */
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public static class ScrollUtils {
#region Consts and externs
const int EM_LINESCROLL = 0x00B6;
[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern int GetScrollPos(IntPtr hWnd, int nBar);
#endregion
#region Public static methods
/// <summary>
/// Sets the given scroll position to the desired TextBox
/// </summary>
/// <param name="tb">The TextBox</param>
/// <param name="position">The new scroll position</param>
/// <param name="orientation">The scroll orientation</param>
public static void SetScrollPosition(TextBox tb, int position,
Orientation orientation = Orientation.Vertical)
{
var handle = GetHandle(tb);
int add = position - GetScrollPosition(tb, orientation);
SetScrollPos(handle, (int)orientation, add, true); // this work w/o this but...
SendMessage(handle, EM_LINESCROLL, 0, add);
}
/// <summary>
/// Adds (or substracts) the given scroll position to the desired TextBox
/// </summary>
/// <param name="tb">The TextBox</param>
/// <param name="position">The scroll position to be added</param>
/// <param name="orientation">The scroll orientation</param>
public static void AddScrollPosition(TextBox tb, int position,
Orientation orientation = Orientation.Vertical)
{
var handle = GetHandle(tb);
SetScrollPos(handle, (int)orientation, position, true); // this work w/o this but...
SendMessage(handle, EM_LINESCROLL, 0, position);
}
/// <summary>
/// Gets the current scroll position from the specified TextBox
/// </summary>
/// <param name="tb">The TextBox</param>
/// <param name="orientation">The scroll orientation</param>
/// <returns></returns>
public static int GetScrollPosition(TextBox tb,
Orientation orientation = Orientation.Vertical)
{
var handle = GetHandle(tb);
return GetScrollPos(handle, (int)orientation);
}
static IntPtr GetHandle(TextBox tb) {
IntPtr handle = IntPtr.Zero;
if (tb.InvokeRequired) {
tb.Invoke(new MethodInvoker(() => handle = tb.Handle));
} else
handle = tb.Handle;
return handle;
}
#endregion
}
- Mommy, I want to scroll a TextBox
- But you can't do that, soon
NOW YOU DO! Yes, with some code took from P/Invoke, you can scroll any textbox to the desired location, even retrieve where is the scroll at!
- But you can't do that, soon
NOW YOU DO! Yes, with some code took from P/Invoke, you can scroll any textbox to the desired location, even retrieve where is the scroll at!
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.