2017-09-06 22 views
0

私はユーザーコントロールをトラックバーとして機能させています。私はToolboxCustomTrackbar1を持っています。これはMinMaxSelectedMinです。これは、ユーザがエリア内でMinPanelをドラッグして変更することができます。このすべてが正常に動作しますC#カスタムトラックバーバッファ領域

protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     e.Graphics.DrawRectangle(Pens.Black, 0, 0, Width - 1, Height - 1); 

     minPanel.Location = new Point((int)GetPosition(ref selectedMin), 0); 
     minPanel.Size = new Size(PanelWidth, Height/2); 
     minPanel.BackColor = Color.Red; 

     trackbarArea = new Rectangle(Buffer, 0, Width - Buffer * 2, Height); 
     e.Graphics.FillRectangle(Brushes.LightBlue, trackbarArea); 

    } 

    private float GetPosition(ref int input) 
    { 
     var range = Max - Min; 
     var value = input - Min; 
     var percentage = (float)value * 100/range; 
     var position = percentage * Width/100; 

     Console.WriteLine(position); 

     return position - (float)minPanel.Width/2; 
    } 

MinPanel

protected override void OnMouseMove(MouseEventArgs e) 
    { 
     base.OnMouseMove(e); 

     if(e.Button == MouseButtons.Left) 
     { 
      UpdateSelectedMinFromMouse(e.X); 
     } 
    } 

    private void UpdateSelectedMinFromMouse(float x) 
    { 
     var percentage = x * 100/Width; 
     var range = Max - Min; 
     var rawValue = percentage * range/100; 
     var value = rawValue + Min; 

     SelectedMin = (int)Math.Round(value); 
    } 
は、次のコードで描画されます。 MinPanel

は、次のコードで変更されたSelectedMin、に基づいて描かれていますクリックしてコントロール上でドラッグするとどこにでもMinPanelが描画されます。しかし、コントロールの左右にある場合でも、コントロールの左右にバッファ領域を設けて、MinPanel全体を描画したいと考えています。

私は現在でこれをやろうとしている:

Rectangle trackbarArea = new Rectangle(Buffer, 0, Width - Buffer * 2, Height);

そして、これは私が実際に私のTrackBarのための範囲と考えることにしたいエリアを作成します。

しかし、コントロールの左端をtrackbarAreaとしてMinスポット、右端をMaxスポットとして扱う方法がわかりません。

トラックバーの両側でバッファを使用できるようにするにはどうすればよいですか?私が使用ValidateValue()、そして、I値を設定毎回

private int ShiftOffset 
{ 
    get { return shiftOffset; } 
    set { shiftOffset = value; } 
} 
private int Min 
{ 
    get { return min - ShiftOffset; } 
    set { min = value; } 
} 
private int Max 
{ 
    get { return max + ShiftOffset; } 
    set { max = value; } 
} 

private void ValidateValue(ref int value) 
{ 
    if (value < Min + ShiftOffset) value = Min + ShiftOffset; 
    if (value > Max - ShiftOffset) value = Max - ShiftOffset; 
} 

+0

あなたはあなたのtrackbarAreaにClientRectangleを設定しようとする可能性があります。さもなければ、私がここで行ったようにトラックバーコントロールをゼロから作り直すことができます:https://github.com/glm9637/MaterialWinforms/blob/master/MaterialWinforms/Controls/MaterialSlider.cs – glm9637

+0

母私はよく知られていないか経験していませんそれを行うのに十分な、ありがとう。 – Tawm

答えて

0

私は本質的MinMax両方をオフセットするために使用ShiftOffset変数を作成しました私のUser Control初期化、私はShiftOffset = NormalizeSize(PanelWidth * 100);を設定しましたが、私はまだShiftOffsetの適切な値が何であるか把握していません​​の後半部分を描画する余地を残してください。

私はPanelWidth * (Max - Min)/Widthのようなものをやろうとしていますが、私はそれを得ることができません。