2010-05-25 11 views
0
panning

J'ai trouvé Personnaliser un panneau avec la propriété Autoscroll à http://www.codeproject.com/KB/miscctrl/CustomAutoScrollPanel.aspx qui est wrapper autour d'un Panel avec AutoScroll = True.Recommandation pour Windows.Forms contrôle qui prend en charge la souris et Zooming

J'aime ce contrôle car il fournit les méthodes "performScrollHorizontal" et "performScrollVertical". Pourtant, il utilise les fonctions de l'API Windows au lieu de ScrollableControl et ses propriétés VerticalScroll et HorizontalScroll.

Est-ce un bon contrôle à utiliser? Je pense qu'il devrait utiliser ScrollableControl au lieu de l'API Windows. Qu'est-ce que tu penses? Y a-t-il un meilleur contrôle disponible? Ai-je besoin d'un contrôle? Je pense que ScrollableControl fournit tout ce dont j'avais besoin.

EDIT: J'ai trouvé les contrôles HScrollBar et VScrollBar. Devrais-je les utiliser?

Ces deux autres contrôles sont agréables mais ne me permettent pas de contrôler les barres de défilement comme le fait le contrôle ci-dessus.

Ce que je veux vraiment est un contrôle:

  • que défile lorsque l'utilisateur déplace la souris vers le bord de la commande,
  • permet à l'utilisateur de faire un panoramique
  • permet à l'utilisateur de zoomer
  • supports à l'aide de la souris avec les touches Maj ou Ctrl ou Alt enfoncée

Toute recommandation, aide ou zone à examiner est grandement appréciée. Un contrôle serait bien car je ne suis pas encore très bon.

Répondre

2

Un code avec lequel jouer. Il prend en charge la mise au point, le panoramique et le défilement. Le zoom est un travail à faire, le tapis de souris de mon ordinateur portable a empêché de le tester. Utilisez une minuterie pour implémenter le défilement automatique sur les bords.

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

class ZoomPanel : Panel { 
    public ZoomPanel() { 
     this.DoubleBuffered = true; 
     this.SetStyle(ControlStyles.Selectable, true); 
     this.SetStyle(ControlStyles.ResizeRedraw, true); 
     this.AutoScroll = this.TabStop = true; 
    } 
    public Image Image { 
     get { return mImage; } 
     set { 
      mImage = value; 
      Invalidate(); 
      mZoom = 1.0; 
      this.AutoScrollMinSize = (mImage != null) ? mImage.Size : Size.Empty; 
     } 
    } 
    protected override void OnMouseDown(MouseEventArgs e) { 
     if (e.Button == MouseButtons.Left) { 
      this.Cursor = Cursors.SizeAll; 
      mLastPos = e.Location; 
      this.Focus(); 
     } 
     base.OnMouseDown(e); 
    } 
    protected override void OnMouseUp(MouseEventArgs e) { 
     if (e.Button == MouseButtons.Left) this.Cursor = Cursors.Default; 
     base.OnMouseUp(e); 
    } 
    protected override void OnMouseMove(MouseEventArgs e) { 
     if (e.Button == MouseButtons.Left) { 
      this.AutoScrollPosition = new Point(
       -this.AutoScrollPosition.X - e.X + mLastPos.X, 
       -this.AutoScrollPosition.Y - e.Y + mLastPos.Y); 
      mLastPos = e.Location; 
      Invalidate(); 
     } 
     base.OnMouseMove(e); 
    } 
    protected override void OnMouseWheel(MouseEventArgs e) { 
     if (mImage != null) { 
      mZoom *= 1.0 + 0.3 * e.Delta/120; 
      this.AutoScrollMinSize = new Size((int)(mZoom * mImage.Width), 
       (int)(mZoom * mImage.Height)); \ 
      // TODO: calculate new AutoScrollPosition... 
      Invalidate(); 
     } 
     base.OnMouseWheel(e); 
    } 
    protected override void OnPaint(PaintEventArgs e) { 
     if (mImage != null) { 
      var state = e.Graphics.Save(); 
      e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 
      e.Graphics.DrawImage(mImage, 
       new Rectangle(0, 0, this.AutoScrollMinSize.Width, this.AutoScrollMinSize.Height)); 
      e.Graphics.Restore(state); 
     } 
     //if (this.Focused) ControlPaint.DrawFocusRectangle(e.Graphics, 
     // new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height)); 
     base.OnPaint(e); 
    } 
    protected override void OnEnter(EventArgs e) { Invalidate(); base.OnEnter(e); } 
    protected override void OnLeave(EventArgs e) { Invalidate(); base.OnLeave(e); } 

    private double mZoom = 1.0; 
    private Point mLastPos; 
    private Image mImage; 
} 
+0

Comment utiliser une minuterie. Je ne sais pas où je commencerais. Merci. –

+0

Cela semble être une bonne question pour un nouveau sujet. –