PictureBox с переопределенным методом OnPaint в C # - PullRequest
1 голос
/ 26 марта 2012

Я хотел бы нарисовать несколько небольших картинок в PictureBox (4 x 32 пикселя подряд), поэтому я должен переопределить метод OnPaint или мне нужно создать новый компонент, который расширяет PictureBox? Я попробовал это, который работал в Java, но не здесь:

        this.pictureBox1 = new System.Windows.Forms.PictureBox()
        {
            protected override void OnPaint(PaintEventArgs e)
            {
               // If there is an image and it has a location, 
               // paint it when the Form is repainted.
                Graphics g = e.Graphics;

                // Draw a string on the PictureBox.
                g.DrawString("Test, is that working?",
                new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
             }
        }

Полный код метода InitializeComponent:

   private void InitializeComponent()
    {
        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Tools));
        this.pictureBox1 = new System.Windows.Forms.PictureBox()
        {
            protected override void OnPaint(PaintEventArgs e)
            {
               // If there is an image and it has a location, 
               // paint it when the Form is repainted.
                Graphics g = e.Graphics;

                // Draw a string on the PictureBox.
                g.DrawString("Test, is that working?",
                new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
             }
        }
        this.vscrollb = new System.Windows.Forms.VScrollBar();
        this.vScrollBar1 = new System.Windows.Forms.VScrollBar();
        ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
        this.SuspendLayout();
        // 
        // pictureBox1
        // 
        this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left;
        this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
        this.pictureBox1.InitialImage = null;
        this.pictureBox1.Location = new System.Drawing.Point(0, 0);
        this.pictureBox1.Name = "pictureBox1";
        this.pictureBox1.Size = new System.Drawing.Size(264, 262);
        this.pictureBox1.TabIndex = 0;
        this.pictureBox1.TabStop = false;
        this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
        // 
        // vscrollb
        // 
        this.vscrollb.Location = new System.Drawing.Point(0, 0);
        this.vscrollb.Name = "vscrollb";
        this.vscrollb.Size = new System.Drawing.Size(20, 80);
        this.vscrollb.TabIndex = 0;
        // 
        // vScrollBar1
        // 
        this.vScrollBar1.Dock = System.Windows.Forms.DockStyle.Right;
        this.vScrollBar1.Location = new System.Drawing.Point(267, 0);
        this.vScrollBar1.Name = "vScrollBar1";
        this.vScrollBar1.Size = new System.Drawing.Size(17, 262);
        this.vScrollBar1.TabIndex = 1;
        this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.HandleScroll);
        // 
        // Tools
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.Black;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.vScrollBar1);
        this.Controls.Add(this.pictureBox1);
        this.Name = "Tools";
        this.Text = "Tools";
        ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
        this.ResumeLayout(false);

    }

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Это просто неверный код C #.Переопределение виртуального метода, такого как OnPaint (), хорошо, но вы можете сделать это только в классе, производном от PictureBox.Что работает хорошо, после компиляции вы получите новый элемент управления, автоматически добавленный в набор инструментов, чтобы вы могли поместить его в форму.Вы можете просто реализовать событие Paint для элемента управления.Вы уже сделали, вы назвали его pictureBox1_Paint ().Просто переместите туда свой код.

Другие важные указатели: никогда не редактируйте InitializeComponent ().Это автоматически сгенерировано дизайнером.Как только вы измените дизайн формы, вы потеряете любой код, который вы там написали.Это также действительно хороший способ сделать форму не подлежащей проектированию, вызывая исключение, когда форма загружается дизайнером.И если вы переопределяете OnPaint (), важно, чтобы вы вызывали base.OnPaint ().Так что нормальная сантехника PictureBox продолжает работать.Включая рисование изображения и поднятие события рисования.Обязательно, по крайней мере, следуйте руководству или прочитайте книгу о программировании на Winforms, в противном случае будет много проб и в основном ошибок.

1 голос
/ 26 марта 2012

Я бы предложил наследовать от PictureBox и добавить туда свою логику. Поэтому вам не нужно добавлять логику в место, где она не принадлежит (родительский контроль).

public class SpecialPictureBox : PictureBox
{
    protected override void OnPaint(PaintEventArgs e)
    {
        // if you want to execute the original PaintBox logic before you execute your own code, use the next line of code.
        base.OnPaint(e);

        // now do whatever you want

    }
}

Затем вы можете использовать SpecialPictureBox где хотите.

Редактировать: добавлено base.OnPaint к примеру кода

...