2014-11-19 4 views
0

У меня проблема с рисованием изображения на фоне формы. У меня есть форма, в которой вставлены обе полосы прокрутки (H и V). Поскольку я должен иметь возможность отображать изображение в исходном размере, я использую их для прокрутки, но когда я прокручиваю до максимума справа или снизу с обеих сторон, пропадает 7 пикселей, которые скрыты под полосами прокрутки. Существует пример кода:Рисование фонового изображения в области переполнения формы

private int PosX, PosY; 
this.Map = new Bitmap(TestLines.Properties.Resources.mapa); 

protected override void OnPaintBackground(PaintEventArgs e) 
{ 
    base.OnPaintBackground(e); 
    if (this.Map != null) 
    { 
     e.Graphics.DrawImageUnscaled(Map, new Point(this.PosX, this.PosY)); 

     int MapResX = (int)((float)this.Map.Width/this.Map.HorizontalResolution * e.Graphics.DpiX); 
     int MapResY = (int)((float)this.Map.Height/this.Map.VerticalResolution * e.Graphics.DpiY); 

     if (MapResX > this.ClientSize.Width && MapResY > this.ClientSize.Height - this.toolStrip1.Height) 
     { 
      hScrollBar1.Minimum = 0; 
      hScrollBar1.Maximum = MapResX - this.ClientSize.Width + vScrollBar1.Width; 
      hScrollBar1.Visible = true; 
      vScrollBar1.Minimum = 0; 
      vScrollBar1.Maximum = MapResY - this.ClientSize.Height + toolStrip1.Height + hScrollBar1.Height; 
      vScrollBar1.Visible = true; 
     } 
     else if (MapResX > this.ClientSize.Width) 
     { 
      hScrollBar1.Minimum = 0; 
      hScrollBar1.Maximum = MapResX - this.ClientSize.Width; 
      hScrollBar1.Visible = true; 
      vScrollBar1.Visible = false; 
     } 
     else if (MapResY > this.ClientSize.Height - this.toolStrip1.Height) 
     { 
      vScrollBar1.Minimum = 0; 
      vScrollBar1.Maximum = MapResY - this.ClientSize.Height + toolStrip1.Height; 
      vScrollBar1.Visible = true; 
      hScrollBar1.Visible = false; 
     } 
     else 
     { 
      hScrollBar1.Visible = false; 
      vScrollBar1.Visible = false; 
     } 
    }    
} 

Обратите внимание, что есть также инструментальная панель, в которой я не рисую. А затем простые действия прокрутки:

private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) 
{ 
    this.PosX = -e.NewValue; 
    this.Invalidate(false); 
    this.Update(); 
} 

private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) 
{ 
    this.PosY = toolStrip1.Height -e.NewValue; 
    this.Invalidate(false); 
    this.Update(); 
} 

Можете ли вы охарактеризовать меня, почему это происходит?

ответ

1

Это просто не тот способ, которым можно заняться. Создайте свой собственный контроль вместо этого, используя Panel в качестве базового класса, чтобы получить прокрутку бесплатно. Добавьте новый класс в свой проект и вставьте код, показанный ниже. Компиляция. Отбросьте его с верхней части панели инструментов на свою форму, вы, вероятно, захотите установить для своего свойства Dock значение Fill. Назначьте свойство Map, либо с помощью конструктора, либо в вашем коде.

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

class MapPanel : Panel { 
    public MapPanel() { 
     this.DoubleBuffered = true; 
     this.ResizeRedraw = true; 
    } 

    private Image map; 
    public Image Map { 
     get { return map; } 
     set { 
      map = value; 
      this.AutoScrollMinSize = value == null ? Size.Empty : value.Size; 
      this.Invalidate(); 
     } 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) { 
     base.OnPaintBackground(e); 
     if (map != null) { 
      e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 
      e.Graphics.DrawImage(map, 0, 0); 
     } 
    } 
} 
+0

Благодарим за быстрый ответ. Я сделал это до того, как сделал панель, и ее хорошее решение, но я решил сделать это на самой форме. Поэтому я просто спрашиваю, почему эти пиксели отсутствуют справа и внизу, когда я просматриваю полные правые или полные левые соответственно. – Joziff

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