我想在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);
}
答案 0 :(得分:4)
这只是无效的C#代码。覆盖像OnPaint()这样的虚方法很好但是你只能在从PictureBox派生的类中这样做。哪个效果很好,编译完成后你会自动将新控件添加到工具箱中,这样你就可以把它放在表格上了。
然而,这不是必需的。您可以简单地为控件实现Paint事件。你已经这样做了,你把它命名为pictureBox1_Paint()。只需将代码移到那里。
其他重要指针:永远不要编辑InitializeComponent()。它由设计师自动生成。一旦你修改了表单的设计,你就会丢失你在那里写的任何代码。这也是使表单不可设计的一种非常好的方法,在设计者加载表单时触发异常。如果你重写OnPaint(),那么调用base.OnPaint()是很重要的。这样普通的PictureBox管道继续工作。包括绘制Image和提升Paint事件。一定要至少遵循一个教程或阅读一本关于Winforms编程的书,如果你不这样做,会有大量的试验和大多数错误。
答案 1 :(得分:1)
我建议继承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
添加到代码示例