如何通过另一个表单在表单图片框上绘制矩形[更新] [英] How to draw a rectangle on a form picturebox from another form[Updated]

查看:49
本文介绍了如何通过另一个表单在表单图片框上绘制矩形[更新]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好.

我有一个问题.

我有2种表格.

形式=形式1
形式=形式2

在form1中按一个按钮时,将显示form2.我想要的是在form2中按一个按钮,在form1图片框上绘制一个矩形.

我为要在Form1中处理的Form2中单击的按钮编写了一个事件处理函数,但是在处理函数中,我无法在form1的图片框中绘制任何内容.

我该如何实现?

最好的问候...

Version 2:

好的.我真正想做的就是这个.
我正在尝试绘制从文本框中编写的地图.
在地图上''有线条,禁止的区域,盒子之类的东西.
我可以成功读取地图,并使用form1中的按钮绘制地图.
我想要做的是,通过单击form2上的一个按钮,从另一个form(form2)绘制地图.

简要代码:

这是在 form1 中调用的form2:

private void tlstrpbtnAkil_Click(object sender, EventArgs e)
{
Form2 objform = new Form2();
objform.Activate();
objform.Visible = true;

objform.btnOrtamYukle.Click += new EventHandler(objButton_Click);
}



以下是 form2下的代码:

public Form1 _form1;
public Button f2Button { get; set; }



public struct Ortam
{
      public int OrtamKB;
      public string OrtamAdi;
      public string OrtamHaritasi;
      public string HucreDosyasi;
}

public Ortamlar(Form1 form1)
{
     this._form1 = form1;
}


 私有  void  Form2_Load(对象发​​件人,EventArgs e)
{
           // 在创建Form2时设置公共属性
           f2Button =  .btnOrtamYukle;
           // 分配点击处理程序
           f2Button.Click + =  EventHandler(f2Button_Click);
} 


 私有  void  f2Button_Click_Click(对象发​​件人,EventArgs e)
{
          // 这是完成处理的地方
            _form1 =  Form1();

            Ortam ortam =  Ortam();

             int  count = dataGridView1.SelectedRows [ 0 ].Index;

            ortam.OrtamKB = Convert.ToInt32(ortamTbl.Rows [count] [" ]);;
            ortam.OrtamAdi = ortamTbl.Rows [count] [" ].ToString();
            ortam.OrtamHaritasi = ortamTbl.Rows [count] [" ].ToString();
            ortam.HucreDosyasi = ortamTbl.Rows [count] [" ].ToString();

            ORTAMHaritasi = ortam.OrtamHaritasi;
            _form1.ORTAMHARITASI = ortam.OrtamHaritasi;

            //  _ form1.KontrolleriAc(); 

            _form1.p_box_map.Width =  1000 ;
            _form1.p_box_map.Height =  600 ;

            _form1.bmp = 位图(_form1.p_box_map.Width,_form1.p_box_map.Height);

            ImOrtamCizdirVeritabani ortamcizdir =  ImOrtamCizdirVeritabani(_form1.p_box_map,_form1.bmp,_form1.ZoomKontrolCarpan,_form1.panel1);
            

            _form1.bmp.RotateFlip(RotateFlipType.Rotate180FlipX);

            _form1.bmp2 = _form1.bmp; // Boş表单.

            _form1.lbxKucultmeOranlari.Items.Add("  + ortamcizdir.ScaleFactorY);
            _form1.lbxKucultmeOranlari.Items.Add("  + ortamcizdir.ScaleFactorX);
            _form1.lbxKucultmeOranlari.Items.Add(ortamcizdir.ScaleFactor);
} 



地图绘图部分:

class ImOrtamCizdirVeritabani : ImOrtamOkuVeritabanı
    {
        public static Image genelBmpNesnesi;

        public Graphics g;
        Pen Kalem = new Pen(Brushes.Blue, 5);

        // Default Constructer
        public ImOrtamCizdirVeritabani()
        {

        }

        public ImOrtamCizdirVeritabani(PictureBox picturebox1, Image bmp, int ZoomKontrolCarpan, Panel panel1)
        {
            g = Graphics.FromImage(bmp);

            for (int z = 0; z < base.ForbiddenAreaNumber; z++)
            {
                Rectangle rect = new Rectangle((base.ForbiddenArea[z].x1 / (int)(base.ScaleFactor))
                    , (base.ForbiddenArea[z].y1 /
                    (int)base.ScaleFactor),
                    ((base.ForbiddenArea[z].x2 / (int)base.ScaleFactor) - (base.ForbiddenArea[z].x1 /
                    (int)base.ScaleFactor)),
                    ((base.ForbiddenArea[z].y2 / (int)base.ScaleFactor) -
                    base.ForbiddenArea[z].y1 / (int)base.ScaleFactor));

                g.DrawRectangle(Kalem, rect);
                g.FillRectangle(Brushes.Blue, rect);
            }

            for (int z = 0; z < base.LineNumber; z++)
            {
                g.DrawLine(Kalem, (base.Lines[z].x1 / (int)base.ScaleFactor) * ZoomKontrolCarpan,
                    (base.Lines[z].y1 / (int)base.ScaleFactor) * ZoomKontrolCarpan,
                    (base.Lines[z].x2 / (int)base.ScaleFactor) * ZoomKontrolCarpan,
                    (base.Lines[z].y2 / (int)base.ScaleFactor) * ZoomKontrolCarpan);
            }

            panel1.AutoScrollPosition = new Point(bmp.Height, bmp.Width);
            picturebox1.Image = bmp;
            genelBmpNesnesi = bmp;
        }
    }


不需要ImOrtamOkuVeritabanı,它做得很好..

因此,如何从窗体2触发到窗体1图片框以绘制地图.

最好的问候...

解决方案

假设您的处理程序正确,并且您实际上已发出事件信号,并在Form1的正确实例中对其进行了处理,那么我假设您代码类似于以下内容:

  void  Form1_DrawIt(对象发​​送者,EventArgs e)
   {
   使用(图形g = Graphics.FromImage(pictureBox1.Image))
       {
       g.DrawLine(笔(Color.Red, 3  .0F), 0 点( 100 ));
       }
   }

,但是在PictureBox上没有画任何东西吗?
尝试使图片框无效-强制重新绘制并显示以下行:

  void  Form1_DrawIt(对象发​​送者,EventArgs e)
   {
   使用(图形g = Graphics.FromImage(pictureBox1.Image))
       {
       g.DrawLine(笔(Color.Red, 3  .0F), 0 点( 100 ));
       }
   pictureBox1.Invalidate();
   }


处理PictureBoxPaint事件,并使用Graphics对象直接在其上绘制.


Hey everyone.

I have a quesiton.

I have 2 forms.

form = form1
form = form2

When pressing a button in form1, form2 shows up. What I want is pressing a button in form2 draws a rectangle on to form1 picturebox.

I Wrote an event handler function for button clicked in Form2 to be handled in Form1, but in handler function I can''t draw anything in form1''s picturebox.

How can I achieve it?

My best regards...

Version 2:

Ok. The real thing I want to do is this.
I''m trying to draw a map which is written from a text box.
In map there''are lines, forbidden areas, boxes and such things.
I can read the map succesfully and draw the map from a button which is in form1.
What I want to do is, draw the map from another form(form2) by clickling a button on form2.

The Brief codework:

This is the form2 calling in form1:

private void tlstrpbtnAkil_Click(object sender, EventArgs e)
{
Form2 objform = new Form2();
objform.Activate();
objform.Visible = true;

objform.btnOrtamYukle.Click += new EventHandler(objButton_Click);
}



Here the codes under the form2:

public Form1 _form1;
public Button f2Button { get; set; }



public struct Ortam
{
      public int OrtamKB;
      public string OrtamAdi;
      public string OrtamHaritasi;
      public string HucreDosyasi;
}

public Ortamlar(Form1 form1)
{
     this._form1 = form1;
}


private void Form2_Load(object sender, EventArgs e)
{
           // set the public property when Form2 is created
           f2Button = this.btnOrtamYukle;
           // assign a click handler
           f2Button.Click += new EventHandler(f2Button_Click);
}


private void f2Button_Click_Click(object sender, EventArgs e)
{
          // here is where the handling is done
            _form1 = new Form1();

            Ortam ortam = new Ortam();

            int count = dataGridView1.SelectedRows[0].Index;

            ortam.OrtamKB = Convert.ToInt32(ortamTbl.Rows[count]["OrtamKB"]);
            ortam.OrtamAdi = ortamTbl.Rows[count]["OrtamAdi"].ToString();
            ortam.OrtamHaritasi = ortamTbl.Rows[count]["OrtamHaritasi"].ToString();
            ortam.HucreDosyasi = ortamTbl.Rows[count]["HucreDosyasi"].ToString();

            ORTAMHaritasi = ortam.OrtamHaritasi;
            _form1.ORTAMHARITASI = ortam.OrtamHaritasi;

            //_form1.KontrolleriAc();

            _form1.p_box_map.Width = 1000;
            _form1.p_box_map.Height = 600;

            _form1.bmp = new Bitmap(_form1.p_box_map.Width, _form1.p_box_map.Height);

            ImOrtamCizdirVeritabani ortamcizdir = new ImOrtamCizdirVeritabani(_form1.p_box_map, _form1.bmp, _form1.ZoomKontrolCarpan,_form1.panel1);
            

            _form1.bmp.RotateFlip(RotateFlipType.Rotate180FlipX);

            _form1.bmp2 = _form1.bmp; // Boş Form.

            _form1.lbxKucultmeOranlari.Items.Add("scale_factor_x :" + ortamcizdir.ScaleFactorY);
            _form1.lbxKucultmeOranlari.Items.Add("scale_factor_y :" + ortamcizdir.ScaleFactorX);
            _form1.lbxKucultmeOranlari.Items.Add(ortamcizdir.ScaleFactor);
}



Map Drawing part:

class ImOrtamCizdirVeritabani : ImOrtamOkuVeritabanı
    {
        public static Image genelBmpNesnesi;

        public Graphics g;
        Pen Kalem = new Pen(Brushes.Blue, 5);

        // Default Constructer
        public ImOrtamCizdirVeritabani()
        {

        }

        public ImOrtamCizdirVeritabani(PictureBox picturebox1, Image bmp, int ZoomKontrolCarpan, Panel panel1)
        {
            g = Graphics.FromImage(bmp);

            for (int z = 0; z < base.ForbiddenAreaNumber; z++)
            {
                Rectangle rect = new Rectangle((base.ForbiddenArea[z].x1 / (int)(base.ScaleFactor))
                    , (base.ForbiddenArea[z].y1 /
                    (int)base.ScaleFactor),
                    ((base.ForbiddenArea[z].x2 / (int)base.ScaleFactor) - (base.ForbiddenArea[z].x1 /
                    (int)base.ScaleFactor)),
                    ((base.ForbiddenArea[z].y2 / (int)base.ScaleFactor) -
                    base.ForbiddenArea[z].y1 / (int)base.ScaleFactor));

                g.DrawRectangle(Kalem, rect);
                g.FillRectangle(Brushes.Blue, rect);
            }

            for (int z = 0; z < base.LineNumber; z++)
            {
                g.DrawLine(Kalem, (base.Lines[z].x1 / (int)base.ScaleFactor) * ZoomKontrolCarpan,
                    (base.Lines[z].y1 / (int)base.ScaleFactor) * ZoomKontrolCarpan,
                    (base.Lines[z].x2 / (int)base.ScaleFactor) * ZoomKontrolCarpan,
                    (base.Lines[z].y2 / (int)base.ScaleFactor) * ZoomKontrolCarpan);
            }

            panel1.AutoScrollPosition = new Point(bmp.Height, bmp.Width);
            picturebox1.Image = bmp;
            genelBmpNesnesi = bmp;
        }
    }


There is no need for ImOrtamOkuVeritabanı, it does its job well..

So, How can I trigger from form 2 to form1 picturebox to draw my map.

My best regards...

解决方案

Assuming you got your handlers right and you actually signalled the event, and handled it in the correct instance of Form1, then I assume your code was something along the lines of:

void Form1_DrawIt(object sender, EventArgs e)
   {
   using (Graphics g = Graphics.FromImage(pictureBox1.Image))
       {
       g.DrawLine( new Pen(Color.Red, 3.0F), new Point(0,0), new Point(100,100));
       }
   }

but it didn''t draw anything on the PictureBox?
Try invalidating the picture box - that forces a re-draw and will show the line:

void Form1_DrawIt(object sender, EventArgs e)
   {
   using (Graphics g = Graphics.FromImage(pictureBox1.Image))
       {
       g.DrawLine( new Pen(Color.Red, 3.0F), new Point(0,0), new Point(100,100));
       }
   pictureBox1.Invalidate();
   }


Handle the PictureBox''s Paint event and use the Graphics object to draw directly on it.


这篇关于如何通过另一个表单在表单图片框上绘制矩形[更新]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆