2010-04-26 3 views
1

Je construis une application Windows Forms en C# et ai un TrackBar sur mon formulaire. Comment puis-je calculer la position (pixel) de la pointe du tracker? Je voudrais tracer une ligne de là à un autre point sur mon formulaire. En outre, je voudrais aussi calculer la position x la plus basse et la plus haute possible de la pointe.Comment obtenir la position du tracker d'un .NET TrackBar?

Répondre

6

Le contrôle Windows natif qui est enveloppé par TrackBar a une restriction gênante, vous ne pouvez pas obtenir les positions pour les premières et dernières marques de tic. Vous pouvez cependant obtenir les rectangles d'affichage pour le canal et le curseur. Cette classe les renvoie:

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); 
} 

Voici une utilisation de l'échantillon sous une forme, il dessine une ligne de la première coche au pointeur de curseur:

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); 
} 
+0

Malheureusement mon code doit aussi fonctionner avec Mono. .. – Danvil

+0

Abandonnez tout espoir, vous ne pouvez pas faire ce travail sur Mono. Créez votre propre contrôle TrackBar. Pourrait être amusant. Ish. –

+0

* snief * J'ai donc simplement "piraté" une solution en prenant la dimension de contrôle et une valeur estimée pour le remplissage. Cela fonctionne au moins sur cet ordinateur exécutant cet os ... – Danvil

Questions connexes