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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2018, 12:43   #1
Lokor
Новичок
Джуниор
 
Регистрация: 25.09.2018
Сообщений: 1
По умолчанию Движение ползунка TrackBara на щелчок мыши, тоесть, на указанную позицию курсора мышки, а не постепенное передвижение

Сделал такую функцию, но мне кажеться, что слишком мудрено и черезчур сложно. Если наследованием, то сути не меняет же. Можно ли как то по проще сделать\реализовать? И если можно, то каким образом(поточнее) скажите, пожалуйста.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            textBox1.Text = "" + trackBar1.Value;
        }

        void orientation()
        {
            int mousenum = 0;

            //высчитываем координаты курсора относительно trackbar.Minimum
            double MousSLotPos = (MousePosition.X-this.Left)-trackBar1.Left-(trackBar1.Right-
                (trackBar1.Right - trackBar1.Left)) - 12;

            //высчитываем конечную координатную позицию курсора отосительно trackbar.Maximum
            int mouse_x_max = (trackBar1.Right - trackBar1.Left) - 24;

            //разность шкалы тракбара и координат курсора
            double raznost_in_double = (double)mouse_x_max / (double)(trackBar1.Maximum - trackBar1.Minimum);
            
            //Массив значений шкалы трак бара
            int[] arr_track_max = new int[(trackBar1.Maximum - trackBar1.Minimum) + 1];

            //массив значений курсора
            double[] arr_mouse_max = new double[(trackBar1.Maximum - trackBar1.Minimum) + 2];

            //заполнение массива трак бара значениями под i - тый индекс, а так же заполнение массива курсора под i - тый индекс(под такой же индекс как и в шкале трак бара)
            for (int i = 0; i < (trackBar1.Maximum - trackBar1.Minimum); i++)
            {
                if (trackBar1.Minimum > 0)
                    arr_track_max[i] = i + trackBar1.Minimum;
                else
                    if (trackBar1.Minimum == 0)
                        arr_track_max[i] = i + 1;
                    else
                        if (trackBar1.Minimum < 0)
                            arr_track_max[i] = i + trackBar1.Minimum;


                if (i == 0)
                {
                    if (trackBar1.Minimum < 0)
                        arr_mouse_max[i] = 0;
                    else
                        arr_mouse_max[i] = (raznost_in_double / 2);
                }
                else
                    if (i == 1)
                    {
                        if (trackBar1.Minimum < 0)
                            arr_mouse_max[i] = raznost_in_double - (raznost_in_double / 2);
                        else
                            arr_mouse_max[i] = raznost_in_double + (raznost_in_double / 2);
                    }
                    else
                        arr_mouse_max[i] = arr_mouse_max[i - 1] + raznost_in_double;

                //дополняем на последней прокрутке цикла конечные эелементы массивов, ибо цикл заканчивается раньше
                if (i + 1 == (trackBar1.Maximum - trackBar1.Minimum))
                {
                    arr_track_max[i+1] = i + 1 + trackBar1.Minimum;
                    arr_mouse_max[i + 1] = arr_mouse_max[i] + raznost_in_double;
                }

                //тоже самое
                if (i + 2 == (trackBar1.Maximum - trackBar1.Minimum) + 1)
                    arr_mouse_max[i + 2] = mouse_x_max;
            }


            int ass = 1;

            //тут же цикл, в котором идет првоерка: если значение по индексу в массиве курсора совпадает значению по этому же индексу в массиве трак бара, то присваеваем переменной mousenum начение i - того элемента
            for (int i = 0; i < (trackBar1.Maximum - trackBar1.Minimum) + 1; i++)
            {
                if (i + ass < (trackBar1.Maximum - trackBar1.Minimum) + 1)
                {
                    //проверка значений ближайших элементов(из-за допущеной погрешности): впереди идящего и позади идящего элементов
                    if (MousSLotPos <= arr_mouse_max[i + ass] && MousSLotPos >= arr_mouse_max[i])
                    {
                        mousenum = arr_track_max[i];
                    }
                }
                else
                {
                    --ass;
                    if (MousSLotPos <= arr_mouse_max[i + ass]  && MousSLotPos >= arr_mouse_max[i])
                    {
                        mousenum = arr_track_max[i];
                    }
                    else
                        if (MousSLotPos <= arr_mouse_max[i + 1] && MousSLotPos >= arr_mouse_max[i])
                            mousenum = arr_track_max[i];//проверка на последнюю позицию
                }
            }

            //тут же, если шкала начинается с нуля и более
            if (trackBar1.Minimum >= 0)
            {
                //если выход координат мышки за приделы шкалы трак бара
                if (MousSLotPos < trackBar1.Minimum - 2)
                {
                    trackBar1.Value = trackBar1.Minimum;
                }
                else
                    if (MousSLotPos > mouse_x_max )
                    {
                        trackBar1.Value = trackBar1.Maximum;
                    }
                    else
                        trackBar1.Value = mousenum;
            }
            //тут же, если шкала начинается с нуля и менее
            else
            {
                if (MousSLotPos > mouse_x_max)
                    trackBar1.Value = trackBar1.Maximum;
                else
                    if (MousSLotPos < 0)
                    {
                        trackBar1.Value = trackBar1.Minimum;
                    }
                    else
                        trackBar1.Value = mousenum;
            }
        }
        
        bool flag_down = false;
        bool flag_move = false;
        private void trackBar1_MouseDown(object sender, MouseEventArgs e)
        {
            flag_down = true;
            orientation();
            textBox1.Text = "" + trackBar1.Value;
        }
        private void trackBar1_MouseMove(object sender, MouseEventArgs e)
        {
            if (flag_down)
            {
                flag_move = true;
                orientation();
                textBox1.Text = "" + trackBar1.Value;

            }
        }
        private void trackBar1_MouseUp_1(object sender, MouseEventArgs e)
        {
            flag_down = false;
        }
    }
}
Lokor вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод на заголовок формы позицию ползунка Ttrackbar Алексей_2012 Общие вопросы Delphi 31 08.08.2013 01:32
Вставить на указанную позицию символ «*». vaako Паскаль, Turbo Pascal, PascalABC.NET 1 06.04.2012 23:23
Как сделать передвижение ползунка слайдера при проигрывании песни jojo97 Общие вопросы .NET 2 05.01.2012 11:46
Двухсвязный список, добавление элемента в указанную позицию redmonkey Помощь студентам 3 19.10.2010 12:29
Как реализовать перемещение ползунка при проигрывании mp3 файла компонент mediaplayer, в нужную позицию? strannik Компоненты Delphi 5 12.12.2006 05:23