[英]Create rectangle drawing inside the picturebox
按钮单击事件后,我希望程序在图片框内绘制一个矩形。 我不知道该怎么做。 到目前为止,我只在图片框之外制作了一个矩形,就像这样 。 之后,我想实现泛洪填充算法,以用一种颜色填充矩形。 这就是为什么我必须在那里有那些位图的原因。
namespace howto_floodfill
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// The background image.
private Bitmap bm;
private Bitmap32 bm32;
// Make a rectangle
private void button1_Click(object sender, EventArgs e)
{
bm = new Bitmap(ClientSize.Width, ClientSize.Height);
using (Graphics gr = Graphics.FromImage(bm))
{
gr.Clear(Color.Silver);
gr.DrawRectangle(Pens.Black, 5, 5, 100, 60);
}
bm32 = new Bitmap32(bm);
this.BackgroundImage = bm;
}
}
}
您可以为PictureBox
设置Paint
事件处理程序,以允许您在PictureBox
内容的顶部进行绘制:
public partial class Form1 : Form
{
private bool _drawRectangle = false;
public Form1()
{
InitializeComponent();
pictureBox1.Paint += new PaintEventHandler(this.pictureBox1_Paint);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (_drawRectangle) {
Graphics g = e.Graphics;
// use g to do your drawing
}
}
}
只需在按钮单击处理程序中将_drawRectangle
设置为true
,然后调用pictureBox1.Invalidate()。 在Paint
事件处理程序中进行Paint
确保每当重新绘制PictureBox
(例如,因为另一个窗口在其上),矩形也会被绘制。
这将使您在PictureBox的内容上绘制一个矩形。 您是否考虑过仅使用FillRectangle而不是泛洪填充算法?
如果您确实要进行泛洪填充,则必须像以前一样处理图像,以便可以从图像中读取像素以了解是否已达到边界。 然后,您可以使用生成的位图设置PictureBox's
Image
属性。 (在这种情况下,不必在Paint事件处理程序中完成图形工作,因为PictureBox
将确保在每个绘画上绘制其Image
。)
您可以使用从图片框调用的control.CreateGraphics()方法。
namespace WindowsFormsApplication_Test
{
public partial class Form1 : Form
{
private Bitmap bm;
public Form1()
{
InitializeComponent();
bm = new Bitmap(pB.ClientRectangle.Width, pB.ClientRectangle.Height);
}
private void btn_Click(object sender, EventArgs e)
{
Graphics gF = pB.CreateGraphics();
gF.Clear(Color.Silver);
gF.DrawRectangle(Pens.Black, 5, 5, 100, 60);
}
private void button1_Click(object sender, EventArgs e)
{
Graphics gF = Graphics.FromImage(bm);
gF.Clear(Color.Silver);
gF.DrawRectangle(Pens.Black, 5, 5, 100, 60);
pB.Image = bm;
}
}
}
btn_click()是从控件直接获取图形上下文并直接绘制图形的示例。
点击之前的表格...
单击该按钮将直接在控件上绘制-请注意,默认情况下,它将为您提供控件的clientRectangle部分,这很不错...
单击按钮即可获得此信息。
现在,我调整了表格的大小。
不幸的是,以这种方式绘制表格使您有责任在窗口无效时重新绘制数据。
您也可以只将表单的Image属性设置为您的私有位图,然后框架为您处理重绘。 这在button1_Click()方法中显示。
如果愿意,您仍然可以直接在控件上绘制,但是您需要钩住控件事件并在表单创建时重新绘制。 例如,将一个标志作为私有布尔添加到表单类,重写OnPaint方法,并向按钮事件添加代码以交换该标志。 您不必翻转按钮事件中的绘图代码,而只需翻转标记并调用this.Invalidate();。
public partial class Form1 : Form
{
private Bitmap bm;
private bool bDrawn = false;
public Form1()
{
InitializeComponent();
bm = new Bitmap(pB.ClientRectangle.Width, pB.ClientRectangle.Height);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (bDrawn)
{
Graphics gF = pB.CreateGraphics();
gF.Clear(Color.Silver);
gF.DrawRectangle(Pens.Black, 5, 5, 100, 60);
}
}
private void btn_Click(object sender, EventArgs e)
{
//Graphics gF = pB.CreateGraphics();
//gF.Clear(Color.Silver);
///gF.DrawRectangle(Pens.Black, 5, 5, 100, 60);
bDrawn = true;
this.Invalidate();
}
将创建的位图分配给图片框的Image属性。 现在,您可以在位图上绘制所需的任何内容,然后处理其数据。
namespace howto_floodfill {
public partial class Form1 : Form {
private Bitmap bitmap;
public Form1() {
InitializeComponent();
this.bitmap = new Bitmap(100, 100);
this.pictureBox1.Image = this.bitmap;
}
// Make a rectangle
private void button1_Click(object sender, EventArgs e) {
if (this.bitmap != null) {
this.bitmap.Dispose();
}
this.bitmap = new Bitmap(ClientSize.Width, ClientSize.Height);
using (Graphics gr = Graphics.FromImage(bitmap)) {
gr.Clear(Color.Silver);
gr.DrawRectangle(Pens.Black, 5, 5, 100, 60);
}
this.pictureBox1.Image = this.bitmap;
}
}
}
请注意,如果位图具有固定大小,则可能不必每次都重新创建它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.