我正在用 C# 构建一个 Windows 窗体应用程序,并且在我的窗体上有一个 TrackBar
。如何计算跟踪器尖端的(像素)位置?我想从那里画一条线到我表格上的另一点。
此外,我还想计算尖端的最低和最高 x 位置。
最佳答案
TrackBar 包裹的原生 Windows 控件有一个尴尬的限制,您无法获取第一个和最后一个刻度线的位置。但是,您可以获得 channel 和 slider 的显示矩形。此类返回它们:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
class MyTrackBar : TrackBar {
public Rectangle Slider {
get {
RECT rc = new RECT();
SendMessageRect(this.Handle, TBM_GETTHUMBRECT, IntPtr.Zero, ref rc);
return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
}
}
public Rectangle Channel {
get {
RECT rc = new RECT();
SendMessageRect(this.Handle, TBM_GETCHANNELRECT, IntPtr.Zero, ref rc);
return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
}
}
private const int TBM_GETCHANNELRECT = 0x400 + 26;
private const int TBM_GETTHUMBRECT = 0x400 + 25;
private struct RECT { public int left, top, right, bottom; }
[DllImport("user32.dll", EntryPoint = "SendMessageW")]
private static extern IntPtr SendMessageRect(IntPtr hWnd, int msg, IntPtr wp, ref RECT lp);
}
这是一个表单中的示例用法,它从第一个刻度线到 slider 指针绘制一条线:
private void myTrackBar1_ValueChanged(object sender, EventArgs e) {
this.Invalidate();
}
protected override void OnPaint(PaintEventArgs e) {
var chan = this.RectangleToClient(myTrackBar1.RectangleToScreen(myTrackBar1.Channel));
var slider = this.RectangleToClient(myTrackBar1.RectangleToScreen(myTrackBar1.Slider));
e.Graphics.DrawLine(Pens.Black, chan.Left + slider.Width / 2, myTrackBar1.Bottom + 5,
slider.Left + slider.Width / 2, myTrackBar1.Bottom + 5);
}
关于c# - 如何获取 .NET TrackBar 的跟踪器位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713779/