目錄
介紹
該代碼最初是由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的源代碼。
https://blog.csdn.net/mzl87/article/details/103881164