2015-08-25 2 views
0

У меня есть приложение для рисования, в котором я использую объект Graphic для рисования прямоугольника и кругов и некоторых линий. Приложение имеет возможность масштабирования, но я пытаюсь заставить Panning работать, но не может найти оптимальное решение.Панорама чертежа с панели в C#

public partial class Form1 : Form 
{ 
    protected Point clickPosition; 
    protected Point scrollPosition; 
    protected Point lastPosition; 
    public Form1() 
    { 
     InitializeComponent(); 
     SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); 
     AutoScroll = true; 
     AutoScrollMinSize = new Size(0, 0); 
    } 
    float zoom = 100f; 
    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 

     Graphics g = e.Graphics; 
     g.ScaleTransform(zoom, zoom); 
     g.SmoothingMode = SmoothingMode.AntiAlias; 

     // some demo drawing: 
     Rectangle rect = panel1.ClientRectangle; 
     g.DrawEllipse(Pens.Firebrick, rect); 
     using (Pen pen = new Pen(Color.DarkBlue, 4f)) 
      g.DrawLine(pen, 22, 22, 88, 88); 
    } 

    private void trackBar1_Scroll(object sender, EventArgs e) 
    { 
     zoom = trackBar1.Value/10f; 
     panel1.Invalidate(); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     clickPosition.X = e.X; 
     clickPosition.Y = e.Y; 
    } 

    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     Cursor = Cursors.Default; 
     lastPosition.X = AutoScrollPosition.X; 
     lastPosition.Y = AutoScrollPosition.Y; 
    } 

    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      Cursor = Cursors.Hand; 
      scrollPosition.X = clickPosition.X - e.X - lastPosition.X; 
      scrollPosition.Y = clickPosition.Y - e.Y - lastPosition.Y; 
      AutoScrollPosition = scrollPosition; 
      panel1.Invalidate(); 
     } 
    } 

    private void Viewer_MouseDown(object sender, MouseEventArgs e) 
    { 
     OnMouseDown(e); 
    } 

    private void Viewer_MouseMove(object sender, MouseEventArgs e) 
    { 
     OnMouseMove(e); 
    } 

    private void Viewer_MouseUp(object sender, MouseEventArgs e) 
    { 
     OnMouseUp(e); 
    } 
} 

это то, что я до сих пор, код не хватает 2 вещи один Пользуется AutoScrollMinSize обновить размер мин и AutoScrollPosition получить последнюю позицию, проблема как можно использовать с DrawImage и Images и I» Я не уверен в моем случае, как заставить его работать с рисованием линий и кругами. Также по какой-то причине мой AutoScrollPosition всегда 0 для x и y. Любые идеи, или есть другой способ, чтобы создать эффект панорамирования

ответ

2

Вы можете использовать тот же трюк для панорамирование, как для масштабирования: Пан Graphics объект, используемый для рисования!

Просто добавьте один (или для вертикального панорамирования, а также два) номера, скажем offSetX and offsetY к вашему применению. Вы можете контролирующей ее с Trackbar или NumericUpDown или каким-либо другим способом ..

Теперь добавьте эту строку, translates (кастрюли) все, что Graphics объект рисует, перед темScaleTransform:

g.TranslateTransform(offSetX , offSetY); 

Это будет перемещать все на столько пикселей вправо или влево и вверх или вниз.

Обратите внимание, что это включает в себя все, что рисует объект Graphics, включая все изображения, которые он рисует.

Но это не будет двигаться BackgroundImage, если у вас есть один .. Чтобы переместить эти, а также вы должны использовать дваPanels: A panelFrame с AutoSize на и больше panelCanvas, который в панели рамы вложенную и получает перемещался внутри него с помощью полос прокрутки.

Смежные вопросы