Je crée un contrôle utilisateur similaire à TrackBar.C# Peindre un panneau pour entourer sa valeur d'emplacement
L'utilisateur peut cliquer sur un panneau et le faire glisser pour changer la valeur de int SelectedMin
.
Je souhaite dessiner le panneau SelectedMin
pour entourer la souris lorsque je la fais glisser au lieu de démarrer à la souris. En d'autres termes, je souhaite que le centre du panneau apparaisse sur ma valeur SelectedMin
au lieu du côté gauche du panneau à SelectedMin
.
Je crois que cela devrait fonctionner avec une ligne dans ma méthode ToolboxCustomTrackBar_Paint()
:
minPanel.Location = new Point((SelectedMin * Width/(Max - Min)) - PanelWidth/2, LabelHeight);
Le programme démarre correctement, avec seulement la moitié du panneau affichant l'origine, ce qui indique que le ... - PanelWidth/2
fonctionne, mais quand je cliquez sur le panneau pour le faire glisser, il centre la gauche du panneau où se trouve le curseur de ma souris.
L'image du haut est ce qui se passe actuellement. L'image du bas est ce que j'essaye d'accomplir.
Code connexes:
private int min = 0;
private int max = 1000;
private int selectedMin = 200;
private int labelWidth = 0;
private int labelHeight = 200;
private int panelWidth = 10;
public int Min
{
get { return min; }
set { min = value; Invalidate(); }
}
public int Max
{
get { return max; }
set { max = value; Invalidate(); }
}
public int SelectedMin
{
get { return selectedMin; }
set
{
if (value >= Min && value <= Max)
{
selectedMin = value;
Invalidate();
}
}
}
public int LabelWidth
{
get { return labelWidth; }
set { labelWidth = value; Invalidate(); }
}
public int LabelHeight
{
get { return labelHeight; }
set { labelHeight = value; Invalidate(); }
}
public int PanelWidth
{
get { return panelWidth; }
set { panelWidth = value; Invalidate(); }
}
public ToolboxCustomTrackBar()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
selectionWidth = (Max - Min)/Width;
minLabel.Text = "0";
LabelWidth = minLabel.Width;
}
private void ToolboxCustomTrackBar_Paint(object sender, PaintEventArgs e)
{
foreach (var panel in panels)
{
panel.Height = Height - LabelHeight;
if (panel != backdropPanel)
{
panel.Width = PanelWidth;
}
}
minPanel.Location = new Point((SelectedMin * Width/(Max - Min)) - PanelWidth/2, LabelHeight);
}
private void minPanel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
SelectedMin += Min + e.X * (Max - Min)/Width;
}
}
Salut, merci pour la réponse. Il semble que nous faisons la même chose. Je commence à me demander si c'est peut-être quelque chose à voir avec le 'Panel', puisque vous (et beaucoup d'autres) préférez dessiner des rectangles. Comment se fait-il que vous ayez deux fonctions différentes pour calculer 'GetRectanglePosition()' et 'UpdateCurrentValueFromPosition()' quand ils semblent faire la même chose? De plus, je ne connais pas 'base.Method (e)', qu'est-ce que c'est? – Tawm
Les deux méthodes sont complémentaires. 'GetRectanglePosition()' prend la valeur actuelle et calcule la position x en pixel pour le rectangle. Avec 'UpdateCurrentValueFromPosition()' je vais prendre la position actuelle de la souris (lorsque l'utilisateur fait glisser le rectangle) et calculer la valeur actuelle dans la plage. – Oliver
Le 'base.Method (e)' est nécessaire, parce que je remplace les méthodes existantes dans la classe. Mais je n'aime pas remplacer ces méthodes. Au lieu de cela je voudrais faire seulement quelques trucs supplémentaires. Par conséquent, je dois appeler la méthode de base pour laisser le comportement par défaut s'exécuter et ensuite faire mes choses supplémentaires. Si vous aimez creuser plus profondément, vous devriez chercher 'override virtuel C#'. C'est une technique courante dans la programmation orientée objet. – Oliver