gpt4 book ai didi

c# - 如何获取 .NET TrackBar 的跟踪器位置?

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:27 25 4
gpt4 key购买 nike

我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com