2010-05-25 51 views
0

我發現自定義在http://www.codeproject.com/KB/miscctrl/CustomAutoScrollPanel.aspx與AutoScroll屬性面板是與AutoScroll = True一個Panel周圍包裝。建議對Windows.Forms的控制,支持鼠標平移和縮放

我喜歡這個控件,因爲它提供了「performScrollHorizo​​ntal」和「performScrollVertical」方法。然而,它使用Windows API函數而不是ScrollableControl及其VerticalScrollHorizontalScroll屬性。

這是一個很好的控制使用?我認爲它應該使用ScrollableControl而不是Windows API。你怎麼看?有更好的控制可用嗎?我甚至需要控制嗎?我會認爲ScrollableControl提供了我所需要的一切。

編輯:我找到了HScrollBar和VScrollBar控件。我應該使用它們嗎?

這兩個其他控件很好,但不給我一種方式來控制滾動條,就像上面的控件一樣。

我真正想要的是一個控制:

  • 那個當用戶朝向控制的邊緣移動鼠標卷軸,
  • 允許用戶平移
  • 允許用戶使用與Shift或Ctrl或者Alt鍵鼠標按下
放大
  • 支撐

    任何建議,幫助或地區看看非常感謝。控制會很好,因爲我還不是很好。

  • 回答

    2

    一些代碼可以玩。它支持焦點,平移和滾動。縮放是可以實現的,筆記本電腦的鼠標墊阻礙了它的測試。使用計時器在邊緣實現自動滾動。

    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

    我該如何使用計時器。我不知道我會從哪裏開始。謝謝。 – 2010-05-27 07:25:16

    +0

    聽起來像是一個新線程的好問題。 – 2010-05-27 10:53:27