Рекомендация для элемента управления Windows.Forms, поддерживающего панорамирование и масштабирование мыши - PullRequest
0 голосов
/ 25 мая 2010

Я нашел Настройте панель со свойством Autoscroll в http://www.codeproject.com/KB/miscctrl/CustomAutoScrollPanel.aspx, которое является оберткой вокруг Panel с AutoScroll = True.

Мне нравится этот элемент управления, потому что он предоставляет методы "executeScrollHorizont" и "executeScrollVertical". Тем не менее, он использует функции Windows API вместо ScrollableControl и его свойства VerticalScroll и HorizontalScroll.

Это хороший контроль? Я думаю, что следует использовать ScrollableControl вместо Windows API. Как вы думаете? Есть ли лучший контроль? Мне вообще нужен контроль? Я думаю, что ScrollableControl предоставляет все, что мне нужно.

РЕДАКТИРОВАТЬ: Я нашел элементы управления HScrollBar и VScrollBar. Должен ли я их использовать?

Эти два других элемента управления хороши, но не дают мне возможности управлять полосами прокрутки, как это делает вышеуказанный элемент управления.

Что я действительно хочу, так это элемент управления:

  • , который прокручивается, когда пользователь перемещает мышь к краю элемента управления,
  • позволяет пользователю панорамировать
  • позволяет пользователю увеличить
  • поддерживает использование мыши с нажатой клавишей Shift или Ctrl или Alt

Будем очень благодарны за любые рекомендации, помощь или области, на которые стоит обратить внимание. Контроль был бы хорош, потому что я еще не так хорош.

1 Ответ

2 голосов
/ 25 мая 2010

Код для игры. Он поддерживает фокусировку, панорамирование и прокрутку. Масштабирование - это работа, коврик для мыши моего ноутбука мешает его тестированию. Используйте таймер для автоматической прокрутки по краям.

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;
}
...