1
私はTrackBarのようなユーザーコントロールを作っています。C#パネルをペイントしてその位置の値を囲みます
ユーザーはパネルをクリックしてドラッグしてint SelectedMin
の値を変更できます。
SelectedMin
パネルをマウスで囲むには、マウスでドラッグする代わりにドラッグします。換言すれば、パネルの中心がSelectedMin
の代わりにSelectedMin
の値で表示されるようにしたいと思います。
私はこれが私のToolboxCustomTrackBar_Paint()
方法でラインで作業しなければならないと考えている。
minPanel.Location = new Point((SelectedMin * Width/(Max - Min)) - PanelWidth/2, LabelHeight);
プログラムが... - PanelWidth/2
が働いていることを示す、パネルの半分だけがもともと表示して、正常に起動しますが、その後、Iパネルをクリックしてドラッグすると、マウスカーソルがあるパネルの中央が中央になります。
トップイメージは現在発生しているものです。下のイメージは私が達成しようとしているものです。
関連コード:
private int min = 0;
private int max = 1000;
private int selectedMin = 200;
private int labelWidth = 0;
private int labelHeight = 200;
private int panelWidth = 10;
public int Min
{
get { return min; }
set { min = value; Invalidate(); }
}
public int Max
{
get { return max; }
set { max = value; Invalidate(); }
}
public int SelectedMin
{
get { return selectedMin; }
set
{
if (value >= Min && value <= Max)
{
selectedMin = value;
Invalidate();
}
}
}
public int LabelWidth
{
get { return labelWidth; }
set { labelWidth = value; Invalidate(); }
}
public int LabelHeight
{
get { return labelHeight; }
set { labelHeight = value; Invalidate(); }
}
public int PanelWidth
{
get { return panelWidth; }
set { panelWidth = value; Invalidate(); }
}
public ToolboxCustomTrackBar()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
selectionWidth = (Max - Min)/Width;
minLabel.Text = "0";
LabelWidth = minLabel.Width;
}
private void ToolboxCustomTrackBar_Paint(object sender, PaintEventArgs e)
{
foreach (var panel in panels)
{
panel.Height = Height - LabelHeight;
if (panel != backdropPanel)
{
panel.Width = PanelWidth;
}
}
minPanel.Location = new Point((SelectedMin * Width/(Max - Min)) - PanelWidth/2, LabelHeight);
}
private void minPanel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
SelectedMin += Min + e.X * (Max - Min)/Width;
}
}
こんにちは、答えてくれてありがとう。私たちも同じことをしているようです。あなた(そして他の多くの人たち)が描画矩形を好むように思われるので、おそらくそれが 'Panel'と関係するのかどうか疑問に思っています。 「GetRectanglePosition()」と「UpdateCurrentValueFromPosition()」が同じことをしているように見える2つの異なる関数はどうでしょうか?また、私は 'base.Method(e)'に慣れていません、それは何ですか? – Tawm
2つの方法は相補的です。 'GetRectanglePosition()'は現在の値をとり、長方形のピクセル単位のx位置を計算します。 'UpdateCurrentValueFromPosition()'では、現在のマウスの位置(ユーザが矩形をドラッグしたとき)をとり、範囲内の現在の値を計算します。 – Oliver
'base.Method(e)'が必要です。なぜなら、クラス内の既存のメソッドを上書きするからです。しかし、私はこれらの方法を置き換えることを好まない。代わりに私はいくつかの追加のものだけをしたいと思います。したがって、私は基本メソッドを呼び出して、デフォルトの動作を実行させ、その後に私の追加のことを行わなければなりません。深く掘り下げたいのであれば、 'virtual override c#'を検索するべきです。これはオブジェクト指向プログラミングの一般的なテクニックです。 – Oliver