Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2022, 00:42   #1
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию Связать ProgressBar + скорлинг в Texbox

Добрый день.

Пол вечер, ломал голову но так и не додумался, как при скорлинге текста в Texbox, создать событие индикации прочитанного текста в ProgressBar.

Загружаю текст из файла. Затем начинаю его читать (скорлинг вниз) и в зависимости сколько текста было уже прочитано отображать в ProgressBar процесс.

Мой проект
https://dev.azure.com/Aroszi34/_git/...h=/WinForms_02
Изображения
Тип файла: jpg PB.jpg (70.7 Кб, 1 просмотров)
Farlep вне форума Ответить с цитированием
Старый 16.02.2022, 02:30   #2
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

И еще один вопрос, как правильно посчитать кол-во линий в texbox. Как видно на скрине есть 5 линий. Но в текстовом документе это одна строка. Соответственно textBox1.Lines.Length равен 1, а не 5.

ProgressBar отлавливать могу кнопками вверх/вниз. А вот скорлингом ScrollBars не получается отслеживать движение текста.
Farlep вне форума Ответить с цитированием
Старый 16.02.2022, 09:04   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Код:
public class MyTextBox : TextBox
    {
        public delegate void OnScrollEvent(object sender, int Min, int Max, int Pos);


        public event OnScrollEvent OnScrollChanged;

        public int VerticalScrollPosition
        { 
            get { return GetScroll(WinApi.SB_VERT); }
        }

        private int GetScroll(int scrollBarMessage)
        {
            return WinApi.GetScrollPos((System.IntPtr)this.Handle, scrollBarMessage);
        }         

        protected override void WndProc(ref System.Windows.Forms.Message message)
        {
            base.WndProc(ref message);
            if (message.Msg == WinApi.WM_VSCROLL || message.Msg == WinApi.WM_HSCROLL || message.Msg == WinApi.WM_MOUSEWHEEL)
            {
            }

            if (message.Msg == WinApi.WM_VSCROLL )
            {
                WinApi.SCROLLINFO info = new WinApi.SCROLLINFO();
                info.cbSize = Marshal.SizeOf(info);
                info.fMask = WinApi.ScrollInfoMask.SIF_ALL;
                WinApi.GetScrollInfo(this.Handle, WinApi.SB_VERT, ref info);
                OnScrollChanged?.Invoke(this, info.nMin, info.nMax, info.nPos);
            }
        }
    }


    public static class WinApi
    {
        public enum ScrollInfoMask : uint
        {
            SIF_RANGE = 0x1,
            SIF_PAGE = 0x2,
            SIF_POS = 0x4,
            SIF_DISABLENOSCROLL = 0x8,
            SIF_TRACKPOS = 0x10,
            SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),
        }

        public const uint WM_HSCROLL = 0x114;
        public const uint WM_VSCROLL = 0x115;
        public const uint WM_MOUSEWHEEL = 0x20A;
        public const int SB_VERT = 0x1;
        public const int SB_HORZ = 0x0;

        [Serializable, StructLayout(LayoutKind.Sequential)]
        public struct SCROLLINFO
        {
            public int cbSize; // (uint) int is because of Marshal.SizeOf
            public ScrollInfoMask fMask;
            public int nMin;
            public int nMax;
            public uint nPage;
            public int nPos;
            public int nTrackPos;
        }

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

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi);


        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int GetScrollPos(System.IntPtr hWnd, int nBar);

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

И не забываем в конструкторе прицепить обработчик события:

Код:
 myTextBox1.OnScrollChanged += (ox, a, b, c) =>
              {
                  this.BeginInvoke(new MethodInvoker(() =>
                  {
                      if (progressBar1.Minimum != a)
                          progressBar1.Minimum = a;
                      if (progressBar1.Maximum != b)
                          progressBar1.Maximum = b;
                      progressBar1.Step = 1;
                      progressBar1.Value = Math.Min(b, c);
                  }));
              };
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 16.02.2022, 20:31   #4
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Добрый день. Создал класс MyTextBox и экземпляр объекта класса.

В конструктор закинул myTextBox1.OnScrollChanged...

При клике на скорлл и при скроллинге мышкой текст двигается, а ProgressBar стоит на месте.

Может не туда закинул обработчик?

репозиторий обновил с учетом внедрения предложенного кода.

https://dev.azure.com/Aroszi34/_git/...h=/WinForms_02
Изображения
Тип файла: jpg class.jpg (84.5 Кб, 3 просмотров)

Последний раз редактировалось Farlep; 16.02.2022 в 21:02.
Farlep вне форума Ответить с цитированием
Старый 16.02.2022, 22:22   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Берите отладчик и смотрите по шагам где и что не так.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 16.02.2022, 23:20   #6
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Спасибо. Разобрался. Все работает. Только почему то загруженный текст пролистываю до конца и при этом только наполовину заполняет индикатор ProgressBar.
Изображения
Тип файла: png ms.png (27.8 Кб, 1 просмотров)
Farlep вне форума Ответить с цитированием
Старый 17.02.2022, 08:04   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Тут надо подробнее почитать про винапи и метод получения состояния скролов. Там есть еще страницы, может быть надо их учитывать а не только лишь положение.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не записывается texbox.Text в массив Terminator004 Windows Forms 1 16.09.2018 15:03
Не вводится первый символ во второй TexBox andreysuperman42 Microsoft Office Excel 2 16.01.2018 21:15
Функция в texBox Fedaas C# (си шарп) 2 27.03.2015 10:12
Три фиксированных положения слайдера связать с id к, слайдер связать с id кнопок Allex74 JavaScript, Ajax 0 01.09.2013 16:32
Ввод имени объекта через texbox alik98 C# (си шарп) 3 28.11.2012 21:08