none
请教:picturebox截图保存到数组并实现截图拖动组合的问题。 RRS feed

  • 问题

  • 我要在一个Picturebox上进行多次截图,每一次截图都要输出到一个单独的picturebox中。而这输出的多个picturebox要能够集中 在另一个控件上进行位置的拖动,并且将最终拖动组合的结果输出为一张新的图片。同时,将截图对应显示在一个Listview中,点击Listview里的 某一项,可以选中对应的picturebox。
    求指点啊,本人初学C#,这个问题纠结好几天了。
    2012年5月16日 7:47

答案

全部回复

  • Hi 木弓,

    不知道你是具体在哪个环节上遇到了困难,能不能详细的说一下?

    谢谢


    Alexander Sun

    2012年5月21日 6:00
  • 多谢你的帮忙与关注。我已经基本实现上述功能,不过还有两个小问题:当删除listview里面的项时,panel中对应的截图未被删除。并且,listview里面,不能进行多项选择。部分代码如下:

    //在picturebox1中截图
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                rect.X = e.X;
                rect.Y = e.Y;
            }
    
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (e.X < rect.X)
                        p1.X = e.X;
                    else
                        p1.X = rect.X;
                    if (e.Y < rect.Y)
                        p1.Y = e.Y;
                    else
                        p1.Y = rect.Y;
                    pictureBox3.Left = pictureBox1.Left + p1.X;
                    pictureBox3.Top = pictureBox1.Top + p1.Y;
                    pictureBox3.Width = Math.Abs(e.X - rect.X);
                    pictureBox3.Height = Math.Abs(e.Y - rect.Y);
                    pictureBox3.Visible = true;
                }
                else
                    pictureBox3.Visible = false;
            }
    
            private int count = 0;
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                try
                {
                    rect.X = p1.X;
                    rect.Y = p1.Y;
                    rect.Width = pictureBox3.Width;
                    rect.Height = pictureBox3.Height;
                    bmp = new Bitmap(pictureBox1.Image);
                    Bitmap newBitmap = bmp.Clone(rect, bmp.PixelFormat);
                    //pictureBox2.Image = newBitmap;
                    bitmaps.Add(newBitmap);
                    pic.Add(newBitmap);
                    this.imageList1.Images.Add(newBitmap);
                    this.listView1.Items.Add(count.ToString(), count);
                    count++;
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    Console.WriteLine(ex.ToString());
                }
            }
    
    
    //以下为将截图保存到Panel,并关联listview。
            Point _oldPosition = new Point();  
      
            void pix1_MouseMove(object sender, MouseEventArgs e)
            {
                PictureBox p = sender as PictureBox;
                if (p == null) return;
                if (e.Button == MouseButtons.Left)
                {
                    p.Left += Cursor.Position.X - _oldPosition.X;
                    p.Top += Cursor.Position.Y - _oldPosition.Y;
                    _oldPosition = Cursor.Position;
                }  
            }
            
            void pix1_MouseDown(object sender, MouseEventArgs e)
            {
                _oldPosition = Cursor.Position;  
            }
    
            private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
            {
               
            }
    
            private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
            {
                if (e.IsSelected)
                {
                    PictureBox pix1 = new PictureBox();
                    //pix1.Image = imageList1.Images[listView1.FocusedItem.ImageIndex];
                    pix1.Image = pic[listView1.FocusedItem.ImageIndex];
                    pix1.SizeMode = PictureBoxSizeMode.AutoSize;
                    pix1.MouseDown += new MouseEventHandler(pix1_MouseDown);
                    pix1.MouseMove += new MouseEventHandler(pix1_MouseMove);
                    this.panel1.Controls.Add(pix1);
    
                    //PictureBox[] pix = new PictureBox[50];
                    //int n;
                    //for (n = 4; n < pix.Length; n++)
                    //{
                    //    pix[n].Image = pic[listView1.FocusedItem.ImageIndex];
                    //}
                    //pix[n].SizeMode = PictureBoxSizeMode.AutoSize;
                    //pix[n].MouseDown += new MouseEventHandler(pix[n]_MouseDown);
                    ////pix1.MouseMove += new MouseEventHandler(pix1_MouseMove);
                    ////this.panel1.Controls.Add(pix1);
                }
            }
    
            private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                listView1.FocusedItem.BeginEdit();
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                while (listView1.SelectedItems.Count > 0)
                {
                    listView1.Items.Remove(listView1.FocusedItem);
                    //pic[listView1.FocusedItem.ImageIndex] = null;
                    
                }


    • 已编辑 木弓 2012年5月21日 9:47 更改一下措辞。
    2012年5月21日 9:45
  • Hi,

    我觉得可以尝试一下类似的代码来删除panel1里的control

    if(panel1.Controls.Contains(removeButton))
       {
          panel1.Controls.Remove(removeButton);
       }

    第二个问题,你可以先检查下ListView的MultiSelect设置是否为true。如果为true的话,就可以通过按住CTRL或者Shift来多选。你可以参考下这个msdn文档:http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.multiselect.aspx

    希望能对你有所帮助。


    Alexander Sun

    • 已标记为答案 木弓 2012年5月24日 9:56
    2012年5月23日 9:29
  • 你好,我不是要删除panel里的control,而是删除listview里面选中的项对应的picturebox。这个应该怎么实现呢?

    第二个多选的问题,我已经解决了。

    • 已编辑 木弓 2012年5月23日 13:25
    2012年5月23日 13:24