2009-10-11 7 views
4

J'essaie de faire une barre de suivi avec un graphique personnalisé pour le curseur curseur. J'ai commencé avec le code suivant:Comment faire un ownerdraw Trackbar dans WinForms

namespace testapp 
{ 
    partial class MyTrackBar : System.Windows.Forms.TrackBar 
    { 
     public MyTrackBar() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
     { 
     // base.OnPaint(e); 
      e.Graphics.FillRectangle(System.Drawing.Brushes.DarkSalmon, ClientRectangle); 
     } 
    } 
} 

Mais il n'appelle jamais OnPaint. Quelqu'un d'autre vient à travers cela? J'ai utilisé cette technique avant de créer un bouton ownerdraw mais pour une raison quelconque cela ne fonctionne pas avec TrackBar.

PS. Oui, j'ai vu la question # 625728 mais la solution était de complètement ré-implémenter le contrôle à partir de zéro. Je veux juste modifier un peu le contrôle existant.

+0

dupe possible: http://stackoverflow.com/questions/1517179/c-overriding-onpaint-on-progressbar-not-working –

+0

1517179 est pour un contrôle de progrès, mais la solution suggérée là-bas fonctionne pour moi. –

+0

Mettez votre commentaire comme réponse et fermez la question. –

Répondre

5

Je l'ai résolu en définissant le style UserPaint dans le constructeur comme ceci:

public MyTrackBar() 
{ 
    InitializeComponent(); 
    SetStyle(ControlStyles.UserPaint, true); 
} 

OnPaint reçoit maintenant appelé.

5

Si vous voulez peindre sur le dessus de la barre de suivi, vous pouvez saisir le message WM_PAINT manuellement, cela signifie que vous n'avez pas à réécrire tout le code de la peinture vous et pouvez simplement peindre, comme ceci:

using System.Drawing; 
using System.Windows.Forms; 

namespace TrackBarTest 
{ 
    public class CustomPaintTrackBar : TrackBar 
    { 
     public event PaintEventHandler PaintOver; 

     public CustomPaintTrackBar() 
      : base() 
     { 
      SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     } 

     protected override void WndProc(ref Message m) 
     { 
      base.WndProc(ref m); 

      // WM_PAINT 
      if (m.Msg == 0x0F) 
      { 
       using(Graphics lgGraphics = Graphics.FromHwndInternal(m.HWnd)) 
        OnPaintOver(new PaintEventArgs(lgGraphics, this.ClientRectangle)); 
      } 
     } 

     protected virtual void OnPaintOver(PaintEventArgs e) 
     { 
      if (PaintOver != null) 
       PaintOver(this, e); 

      // Paint over code here 
     } 
    } 
} 
+0

Merci! Vous venez de me sauver beaucoup de temps! tu es génial! – yossico

-2

Dans cette réponse, PaintOver n'est jamais appelé, car il n'est jamais affecté, sa valeur est null.

Questions connexes