推荐支持鼠标平移和缩放的Windows.Forms控件

时间:2010-05-25 09:14:50

标签: winforms scroll mouse panel

我在http://www.codeproject.com/KB/miscctrl/CustomAutoScrollPanel.aspx找到了自定义具有自动滚动属性的面板,该面板包含Panel AutoScroll = True的<{1}}。

我喜欢这个控件,因为它提供了“performScrollHorizo​​ntal”和“performScrollVertical”方法。但是,它使用Windows API函数而不是ScrollableControl及其VerticalScrollHorizontalScroll属性。

这是一个很好的控制使用?我认为它应该使用ScrollableControl而不是Windows API。你怎么看?有更好的控制可用吗?我甚至需要一个控件吗?我认为ScrollableControl提供了我需要的一切。

编辑:我找到了HScrollBar和VScrollBar控件。我应该使用它们吗?

这两个其他控件很不错但是没有办法像上面的控件那样控制滚动条。

我真正想要的是一个控件:

  • 在用户将鼠标移向控件边缘时滚动
  • 允许用户平移
  • 允许用户缩放
  • 支持在按住Shift或Ctrl或Alt键的情况下使用鼠标

非常感谢任何建议,帮助或要查看的领域。控制会很好,因为我还不是那么好。

1 个答案:

答案 0 :(得分: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;
}