目录
介绍
该代码最初是由Jigar Desai很久以前写的,作为概念的证明。(此控件的原始文章可以在C-SharpCorner.com上找到。)
我需要一个C#旋钮控件,该旋钮控件应具有我的个人项目的全部功能,并决定通过将其输出类型设置为类库并添加尽可能多的属性以实现完整而灵活的控件来对其进行改进。
- 控件现在接受带有文字和子刻度的刻度。
- 刻度的文本可以绘制在旋钮的内部或外部。
- 刻度的“起始角度”和“终止角度”是可调的。
// "start angle" and "end angle" possible values:
// 90 = bottom (minimum value for "start angle")
// 180 = left
// 270 = top
// 360 = right
// 450 = bottom again (maximum value for "end angle")
// So the couple (90, 450) will give an entire circle
// and the couple (180, 360) will give half a circle.
- MouseWheel事件现在是被管理的。
提示:您可能已经注意到 UserControl不会在Properties窗口中显示MouseWheel事件。那里有麻烦的提示。WM_MOUSEWHEEL消息冒泡。如果具有焦点的控件无法处理,则Windows会将其传递给其父对象。重复一次,直到找到要处理的父窗口为止。
HandledMouseEventArgs 让您停止冒泡。
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
if ( isFocused && isKnobRotating &&
Utility.isPointinRectangle(new Point(e.X, e.Y), rKnob))
{
// the Delta value is always 120, as explained in MSDN
int v = (e.Delta / 120) * (_maximum - _minimum) / _mouseWheelBarPartitions;
SetProperValue(Value + v);
// Avoid to send MouseWheel event to the parent container
((HandledMouseEventArgs)e).Handled = true;
}
}
属性
参数 | 意义 |
价值观 |
|
Value | 获取或设置旋钮的值 |
_minimum (int, 0) | 获取或设置值范围的下限 |
_maximum (int, 100) | 获取或设置值范围的上限 |
_LargeChange (int) | 获取或设置用鼠标进行更改时要添加到Value属性或从Value属性减去的值。 |
_SmallChange (int) | 获取或设置使用键盘进行更改时要添加到Value属性或从Value属性减去的值。 |
_mouseWheelBarPartitions | 设置使用鼠标滚轮时条形图分割的部分数 |
显示 |
|
_showLargeScale (bool) | 显示或隐藏主要刻度线 |
_showSmallScale (bool) | 显示或隐藏中间的刻度线 |
KnobPointerStyles (enum) | 设置旋钮指针的样式:圆或直线 |
_startAngle | 设置开始角度以显示刻度(默认为135,最小值90) |
_endAngle | 设置结束角度以显示刻度(默认405,最大450) |
Ticks |
|
_scaleDivisions (int) | 设置最小和最大之间的间隔数 |
_scaleSubDivisions (int) | 设置主刻度线之间的细分数 |
_drawDivInside (bool) | 在旋钮圆的内部或外部绘制刻度线 |
颜色 |
|
_scaleColor (Color) | 刻度线的颜色 |
_knobBackColor (Color) | 旋钮的背景色(默认LightGray) |
_PointerColor (Color) | 指针的背景色(默认SlateBlue) |
字体 |
|
_scaleFont (Font) | 设置Font(请参阅_scaleFontAutoSize以获取大小) |
_scaleFontAutoSize (bool) | 如果为true,则自动计算字体大小,否则为所选大小 |
此控件管理的单个事件是ValueChanged事件。
private void knobControl1_ValueChanged(object Sender)
{
label1.Text = knobControl1.Value.ToString();
}
该项目是使用Visual Studio 2017版开发的。
代码并不难理解,也不难修改以满足您的需要。主要的困难是你需要一些数学技巧来理解所有的东西是如何显示的(实际上并不是那么多:需要sinus和余弦水平:-)。
您可以下载演示项目以查看KnobControl的实际运行情况或仅查看KnobControl的源代码。