Проверьте, находится ли большой палец RichTextBox ScrollBar в нижней части полосы прокрутки - PullRequest
1 голос
/ 21 октября 2011

Я нашел эту ссылку WPF_Example , но она написана в WPF.Я не программирую в WPF, я делаю это в Windows Forms, и у меня нет реальной причины хотеть встроить WPF RichTextBox в мое приложение просто для получения нужного мне ответа.

Нет ли способа,используя WindowsForms (НЕ WPF), чтобы выяснить, находится ли большой палец полосы прокрутки RichTextBox в нижней части полосы прокрутки?

Цель этого состоит в том, чтобы позволить нашим пользователям, которые просматривают чат в RTFполе, чтобы прокрутить вверх, и когда текст добавлен, НЕ ПРОКРУТАТЬ вниз, если они прокручиваются вверх.Подумайте, как mIRC управляет чатом;если вы находитесь в нижней части окна чата, текст автоматически прокручивается в поле зрения;если вы переместитесь даже на одну строку вверх, текст будет добавлен без необходимости прокрутки.

Мне нужно повторить это.Я нашел эту ссылку здесь на SO: List_ViewScroll , но я не уверен, применима ли она в этом случае.

Любая помощь будет очень полезна:)

РАЗРЕШЕНИЕ

Используя этот класс, я смог заставить его работать.Большое спасибо человеку ниже, который указал на это, и разъяснил некоторые части этого:

internal class Scrollinfo
{
    public const uint ObjidVscroll = 0xFFFFFFFB;

    [DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollBarInfo")]
    private static extern int GetScrollBarInfo(IntPtr hWnd,
                                               uint idObject,
                                               ref Scrollbarinfo psbi);

    internal static bool CheckBottom(RichTextBox rtb)
    {


        var info = new Scrollbarinfo();
        info.CbSize = Marshal.SizeOf(info);

        var res = GetScrollBarInfo(rtb.Handle,
                                   ObjidVscroll,
                                   ref info);

        var isAtBottom = info.XyThumbBottom > (info.RcScrollBar.Bottom - info.RcScrollBar.Top - (info.DxyLineButton*2));
        return isAtBottom;
    }
}

public struct Scrollbarinfo
{
    public int CbSize; 
    public Rect RcScrollBar;
    public int DxyLineButton;
    public int XyThumbTop;
    public int XyThumbBottom;
    public int Reserved;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] Rgstate;
}

public struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}       

1 Ответ

2 голосов
/ 21 октября 2011

Итак, ответ на этот вопрос не очень сложный, но довольно многословный.Ключом является Win32 API-функция GetScrollBarInfo, которую довольно легко вызвать из C #.Вам понадобятся следующие определения в форме, чтобы сделать вызов ...

[DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollBarInfo")]
private static extern int GetScrollBarInfo(IntPtr hWnd,
    uint idObject, ref SCROLLBARINFO psbi);

public struct SCROLLBARINFO {
    public int cbSize;
    public RECT rcScrollBar;
    public int dxyLineButton;
    public int xyThumbTop;
    public int xyThumbBottom;
    public int reserved;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] rgstate;
}

public struct RECT {
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}        

Чтобы протестировать GetScrollBarInfo, рассмотрите возможность создания формы с RichTextBox и кнопкой.В событии click для кнопки сделайте следующий вызов (при условии, что ваш RichTextBox назван «richTextBox1») ...

uint OBJID_VSCROLL = 0xFFFFFFFB;

SCROLLBARINFO info = new SCROLLBARINFO();
info.cbSize = Marshal.SizeOf(info);

int res = GetScrollBarInfo(richTextBox1.Handle, OBJID_VSCROLL, ref info);
bool isAtBottom = info.xyThumbBottom >
    (info.rcScrollBar.Bottom - info.rcScrollBar.Top - 20);

После вызова простая формула может определить, будет ли большой палец полосы прокруткинаходится внизу.По сути, info.rcScrollBar.Bottom и info.rcScrollBar.Top являются позициями на экране, и разница между ними покажет вам размер полосы прокрутки, независимо от того, где она находитсяэкран.Между тем, info.xyThumbBottom отмечает положение нижней части кнопки большого пальца.«20» - это, в основном, предположение относительно размера стрелки вниз полосы прокрутки.Видите ли, нижняя часть кнопки большого пальца фактически никогда не будет полностью доходить до нижней части полосы прокрутки (что и дает вам разница), поэтому вам придется снять дополнительную сумму за кнопку «вниз».По общему признанию, это несколько изменчиво, учитывая, что размер кнопки будет отличаться в зависимости от конфигурации пользователя, но этого должно быть достаточно, чтобы начать работу.

...