Winform не прокручивается при рисовании объектов на нем - PullRequest
0 голосов
/ 09 апреля 2010

C # 3.0, .net framework 3.5 Я рисую (используя метод draw в графическом классе) много сплошных прямоугольников на окнах, которые формируются вертикально. Форма начинается с 500 x 500 пикселей, и прямоугольники рисуются только во время выполнения после загрузки данных из сети, а количество прямоугольников зависит от загрузки, поэтому я не знаю об этом заранее.

Таким образом, только несколько прямоугольников нарисованы, поскольку размер формы фиксирован. Так что я гуглил / Binged (чтобы кто-то не предлагал мне это сделать) и нашел несколько советов, но они не работают в этом случае - как установка свойства AutoScroll форм в значение true или попытка двойной буферизации. Я также попытался нарисовать элемент управления списка и установите его свойство прокрутки и т. д., но без кубика.

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

Может быть, список коробок с картинками, а затем заполнить каждую коробку с рисунком сплошным цветом?

Спасибо

1 Ответ

7 голосов
/ 09 апреля 2010

Вы рисуете прямоугольники GDI + на форме во время события рисования? Форма не будет иметь представления о том, что вы создаете объекты вне ограничивающего пространства, и, следовательно, не будет знать, что вам нужно прокручивать.

Вам необходимо добавить полосу прокрутки в форму, а затем вычислить значение \ положение полосы прокрутки и использовать ее, чтобы определить, какая часть ваших прямоугольников будет нарисована при событии рисования. Это потребует немного ручного усилия. Вы можете нарисовать их все в растровом изображении в памяти соответствующего размера, а затем просто скопировать его части в форму при рисовании.

Или:

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

это может быть так просто, как это:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            this.AutoScroll = true;
            for (int i = 0; i < 100; i++)
                this.Controls.Add(new Rectangle() { Top = i * 120, Left = 10 });

        }
    }

    public class Rectangle : Control
    {
        public Rectangle()
        {
            this.Width = 100;
            this.Height = 100;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(new Pen(Color.Black, 5), 0, 0, 100, 100);
        }
    }
...