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

标签 c# .net

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

相关文章:

c# - 调用 net tcp 端点时,具有 net tcp 和 http 绑定(bind)的 WCF 服务不会激活

.net - 检查文件夹中是否包含另一个文件夹中文件的副本

c# - 从另一个类访问实例化对象 - C#

c# - Toast 显示不止一次

c# - 如何为 Xamarin.forms 实现 Lottie?

c# - IAsyncStateMachine 如何管理 MethodBuilder 上的多个等待者?

c# - 十进制算术溢出

c# - 关于处理表单的代码分析警告

c# - 如何在 c# 中使用 StringBuilder 创建 asp 按钮时应用 CSSClass 和样式

c# - 如何生成临时 Zip 文件,然后在下载后自动删除它?