Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中重写OnPaint方法的PictureBox#_C#_Picturebox_Onpaint - Fatal编程技术网

C# 在C中重写OnPaint方法的PictureBox#

C# 在C中重写OnPaint方法的PictureBox#,c#,picturebox,onpaint,C#,Picturebox,Onpaint,我想在PictureBox中绘制一些小图片(一行4 x 32px图像),所以我应该重写OnPaint方法还是需要制作扩展PictureBox的新组件? 我尝试了这个,它在Java中工作,但在这里没有: this.pictureBox1 = new System.Windows.Forms.PictureBox() { protected override void OnPaint(PaintEventArgs e)

我想在PictureBox中绘制一些小图片(一行4 x 32px图像),所以我应该重写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);

    }

我建议继承
PictureBox
,并在其中添加逻辑。因此,您不必将逻辑添加到它不属于的位置(父控件)

然后,您可以随时随地使用
SpecialPictureBox


编辑:
base.OnPaint
添加到代码示例中

我建议继承自
PictureBox
,并在其中添加您的逻辑。因此,您不必将逻辑添加到它不属于的位置(父控件)

然后,您可以随时随地使用
SpecialPictureBox

编辑:在代码示例中添加了
base.OnPaint
这根本不是有效的C代码。重写像OnPaint()这样的虚拟方法很好,但只能在从PictureBox派生的类中这样做。这很好,编译后,新控件将自动添加到工具箱中,以便将其放到表单中

然而,这是没有必要的。您可以简单地实现控件的绘制事件。你已经这么做了,你把它命名为pictureBox1_Paint()。把你的代码移到那里

其他重要指针:切勿编辑InitializeComponent()。它是由设计者自动生成的。一旦修改表单的设计,您将丢失在那里编写的所有代码。这也是一种使表单不可设计的好方法,在设计器加载表单时触发异常。如果确实重写了OnPaint(),那么调用base.OnPaint()是很重要的。使正常的PictureBox管道继续工作。包括绘制图像和提高绘制事件。请务必至少阅读一本关于Winforms编程的教程或书籍,如果不这样做,将会有大量的尝试和错误。

这就是无效的C代码。重写像OnPaint()这样的虚拟方法很好,但只能在从PictureBox派生的类中这样做。这很好,编译后,新控件将自动添加到工具箱中,以便将其放到表单中

然而,这是没有必要的。您可以简单地实现控件的绘制事件。你已经这么做了,你把它命名为pictureBox1_Paint()。把你的代码移到那里


其他重要指针:切勿编辑InitializeComponent()。它是由设计者自动生成的。一旦修改表单的设计,您将丢失在那里编写的所有代码。这也是一种使表单不可设计的好方法,在设计器加载表单时触发异常。如果确实重写了OnPaint(),那么调用base.OnPaint()是很重要的。使正常的PictureBox管道继续工作。包括绘制图像和提高绘制事件。请务必至少遵循有关Winforms编程的教程或阅读一本书,如果您不这样做,将会有大量的尝试和错误。

此代码工作正常,有什么问题吗?我已将此添加到InitializeComponent方法中。这是完整的代码:@PiotrŁużecki:不要向“InitializeComponent”添加任何内容,因为此方法每次更改某些内容时都会被设计器覆盖。您可以在构造函数中调用“InitializeComponent”之后添加它。我正试图按照您所说的那样执行此操作,但在第一个括号附近出现编译错误:无效的初始值设定项成员声明符。我不能重写那里的方法?这段代码工作正常,有什么问题吗?我已经将它添加到InitializeComponent方法中。这是完整的代码:@PiotrŁużecki:不要向“InitializeComponent”添加任何内容,因为此方法每次更改某些内容时都会被设计器覆盖。您可以在构造函数中调用“InitializeComponent”之后添加它。我正试图按照您所说的那样执行此操作,但在第一个括号附近出现编译错误:无效的初始值设定项成员声明符。我不能重写那个里的方法?所以我不能在不创建新类的情况下这样做?我是否需要调用一些事件,如OnPaint或其他?我可以将其添加到工具箱中吗?您可以在不创建新类的情况下执行此操作,但我不推荐使用它,因为它是一个典型的OOP主体,需要继承以添加特殊功能。除了OnPaint方法的新实现之外,新类的行为与以前完全相同。编译项目后,工具箱中将提供新控件。还有一件事:如果重写OnPaint方法,PictureBox将不会像以前那样绘制图片,因为您重写了逻辑。如果您希望pb在添加自己的逻辑之前执行自己的逻辑,则必须执行base.OnPaint(e)作为重写方法中的第一个调用。我可以在SpecialPictureBox中使用
此.Image
,但在VisualStudio表单设计器中使用SpecialPictureBox时,它抛出一个错误,意思是
这个
是空的…所以我不能在不创建新类的情况下这样做?我是否需要调用一些事件,如OnPaint或其他?我可以将其添加到工具箱中吗?您可以在不创建新类的情况下执行此操作,但我不推荐使用它,因为它是一个典型的OOP主体,需要继承以添加特殊功能。除了OnPaint方法的新实现之外,新类的行为与以前完全相同。编译项目后,工具箱中将提供新控件。还有一件事:如果重写OnPaint方法,PictureBox将不会像以前那样绘制图片,因为您重写了逻辑。如果您希望pb在添加自己的逻辑之前执行自己的逻辑,则必须执行base.OnPaint(e)作为重写方法中的第一个调用。我可以在SpecialPictureBox中使用
this.Image
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

    }
}