none
Как клонировать panel1? RRS feed

Ответы

  • Как я понял, нужно панель со всеми дочерними контролами перенести на изображение?

    Тогда так:

    void DrawControl(Bitmap bitmap, Control control)
    {
        control.DrawToBitmap(bitmap, control.Bounds);
    
        foreach (Control c in control.Controls)
            DrawControl(bitmap, c);
    }
    
    
    
    Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
    
    DrawControl(bmp, panel1);

    • Предложено в качестве ответа Abolmasov Dmitry 30 мая 2012 г. 6:28
    • Отменено предложение в качестве ответа Ziya Ceferov 1 июня 2012 г. 10:45
    • Помечено в качестве ответа Ziya Ceferov 1 июня 2012 г. 17:48

Все ответы

  • Класс Panel и его предки не реализуют интерфейс ICloneable, поэтому и нельзя вызывать данный метод. Один из вариантов, наследование от Panel и реализация интерфейса ICloneable. Так же посмотрите вот этот пост.
    Модератор
  • Свой предыдущий ответ не нужно было удалять, если что-то не понятно, спросите повторно. "Значит невозможно" - почему невозможно, возможно, просто потрудиться надо. Создаёте класс

    namespace WindowsFormsApplication
    {
      public class CloneablePanel : Panel, ICloneable
      {
        #region ICloneable Members
    
        public object Clone()
        {
          Panel newPanel = (Panel)CloneControl(this);
          foreach (Control control in this.Controls)
          {
            Control newControl = CloneControl(control);
            newControl.Visible = true;
    
            newPanel.Controls.Add(newControl);
          }
          newPanel.Visible = true;
    
          return newPanel;
    
        }
    
        #endregion
    
        private Control CloneControl(Control control)
        {
          Type type = control.GetType();
          PropertyInfo[] properties = type.GetProperties();
          Control returnControl = (Control)type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, control, null);
          foreach (PropertyInfo propertyInfo in properties)
          {
            if (propertyInfo.CanWrite)
            {
              propertyInfo.SetValue(returnControl, propertyInfo.GetValue(control, null), null);
            }
          }
          return returnControl;
        }
      }
    }

    и вместо обычного Panel, используете его

    private void InitializeComponent()
        {
          this.panel1 = new WindowsFormsApplication.CloneablePanel();
          this.button1 = new System.Windows.Forms.Button();
          this.SuspendLayout();
          // 
          // panel1
          // 
          this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
          this.panel1.Location = new System.Drawing.Point(12, 12);
          this.panel1.Name = "panel1";
          this.panel1.Size = new System.Drawing.Size(200, 100);
          this.panel1.TabIndex = 0;
          // 
    }

    private void button1_Click(object sender, EventArgs e)
        {
          var newPanel = (Panel)this.panel1.Clone();
          newPanel.Location = new System.Drawing.Point(25, 25);
          this.Controls.Add((Control)this.panel1.Clone());
        }

    • Предложено в качестве ответа Abolmasov Dmitry 30 мая 2012 г. 6:28
    • Помечено в качестве ответа Ziya Ceferov 1 июня 2012 г. 6:25
    • Снята пометка об ответе Ziya Ceferov 1 июня 2012 г. 10:45
    Модератор
  • Как я понял, нужно панель со всеми дочерними контролами перенести на изображение?

    Тогда так:

    void DrawControl(Bitmap bitmap, Control control)
    {
        control.DrawToBitmap(bitmap, control.Bounds);
    
        foreach (Control c in control.Controls)
            DrawControl(bitmap, c);
    }
    
    
    
    Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
    
    DrawControl(bmp, panel1);

    • Предложено в качестве ответа Abolmasov Dmitry 30 мая 2012 г. 6:28
    • Отменено предложение в качестве ответа Ziya Ceferov 1 июня 2012 г. 10:45
    • Помечено в качестве ответа Ziya Ceferov 1 июня 2012 г. 17:48
  • Привет, если чей-либо ответ решает вашу проблему или помог в ее решении, то не забывайте его отмечать. Для этого под каждым сообщением есть кнопка "Пометить как ответ". Спасибо.

    PS. Посмотрите варианты Yatajga и Petalvik, думаю какой-нибудь из них вам точно подойдет.


    Для связи [mail]

  • Petalvik ваш код переносить фотку контролов, а не изображения GDI+, нужно перенести изображение GDI+.
    1 июня 2012 г. 10:45
  • Вы же попросили именно Bitmap на выходе:

    >> Bitmap bitmap1 = panel1.clone;

    Bitmap - это и есть изображение GDI+.

    1 июня 2012 г. 10:51
    Модератор
  • Вы же попросили именно Bitmap на выходе:

    >> Bitmap bitmap1 = panel1.clone;

    Bitmap - это и есть изображение GDI+.

    Не совсем понял вашу фразу, но я вставил ваш код, нарисовал на panel1 изображение и поставил на него кнопку, а когда сработал ваш метод скопировалась только изображение кнопки, а не изображение которое было на фоне panel1.
    1 июня 2012 г. 13:09
  • А как именно вы рисовали на панели? Переопределяли метод OnPaint? Если нет - то "изображения" панели нигде, кроме памяти видеокарты, не будет.

    1 июня 2012 г. 14:33
    Модератор
  • Переопределяли метод OnPaint?

    Нет такого не сделал. Ясно.
    1 июня 2012 г. 17:47