Сделал такую функцию, но мне кажеться, что слишком мудрено и черезчур сложно. Если наследованием, то сути не меняет же. Можно ли как то по проще сделать\реализовать? И если можно, то каким образом(поточнее) скажите, пожалуйста.
Код:
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;
}
}
}