2013-07-11 3 views
-1

Я сделал 2 формы. Form2 имеет кнопку, которая устанавливает фоновое изображение. Я получил это:Сохранение изображения в форме

this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500)); 
//_1334821694552 is name of the image 

Как изменить фон во всех формах с нажатием кнопки, которая будет оставаться таким до другой кадр не выбран?

ответ

4

Если вы меня поняли правильно, у вас есть форму form2, которая содержит кнопки для изменения фонового изображения на форме form1.

Интересно, почему вы используете this.BackgroundImage в form2, чтобы изменить фоновое изображение? Это изменит фоновое изображение на form2, а не на form1.

Вы должны фактически передать ссылку на form1 на номер form2, а затем использовать form1.BackgroundImage = ....

Это все немного расплывчато - я предлагаю вам отредактировать свой вопрос, чтобы фактически добавить некоторую информацию о том, как действительно существует связь между form1 и form2.


Прежде всего, вам нужно передать экземпляр form1 в form2. Это можно сделать в конструкторе, например, при условии, что form2 открывается в form1. Например, как это:

кодекса в Form2

// In form2, there's a member variable that holds the form1 reference 
private form1 m_form1Instance; 

// The constructor of form2 could look like this 
public form2(form1 form1Instance) 
{ 
    ... 

    // Remember the form1-instance 
    m_form1Instance = form1Instance; 
} 

// When a button is clicked in form2, the background image in form1 is changed 
private void button1_Click(object sender, EventArgs e) 
{ 
    m_form1Instance.BackgroundImage = ...; 
} 

кодекса в form1

// When form2 is opened, pass "this" to the constructor. The following 
// sample opens form2 as a modal dialog 
using (form2 f2 = new form2(this)) 
{ 
    f2.ShowDialog(this); 
} 

Это должно изменить фоновое изображение на form1, а не на form2.

Если вы хотите сохранить, какое фоновое изображение отображается в сеансах (т. Е. Вы хотите, чтобы при воспроизведении программы отображалось то же фоновое изображение), используйте ответ Wink. Это сохраняет фоновое изображение, используемое для настроек.


ОК, так что вы хотите глобально изменить фоновое изображение на ВСЕ формы в вашем приложении. Вы должны пойти другим путем, чем тот, который я описал выше.

Что бы я сделал, это создать одноэлементный класс, который описывает текущее фоновое изображение и имеет события для уведомления подписчиков, когда изображение было изменено. Например:

public class BackgroundImageHolder 
{ 
    private static BackgroundImageHolder m_instance; 
    private Bitmap m_backgroundImage; 

    public event EventHandler BackgroundImageChanged; 

    private BackgroundImageHolder() { } 

    public static BackgroundImageHolder Instance 
    { 
     get 
     { 
      if (m_instance == null) m_instance = new BackgroundImageHolder(); 
      return m_instance; 
     } 
    } 

    public Bitmap BackgroundImage 
    { 
     get { return m_backgroundImage; } 
     set { 
      m_backgroundImage = value; 
      OnBackgroundImageChanged(); 
     } 
    } 

    protected void OnBackgroundImageChanged() 
    { 
     if (BackgroundImageChanged != null) 
      BackgroundImageChanged(this, EventArgs.Empty); 
    } 
} 

Всякий раз, когда вы открываете форму (т.в конструкторе) вы запрашиваете BackgroundImageHolder для текущего изображения и установить его для вашей формы:

this.BackgroundImage = BackgroundImageHolder.Instance.BackgroundImage; 

Тогда вы подписаться на уведомления, поэтому форма может изменить фоновое изображение, когда необходимо:

BackgroundImageHolder.Instance.BackgroundImageChanged += BackgroundImageHolder_Changed; 

Вы должны реализовать обработчик события:

private void BackgroundImageHolder_Changed(object sender, EventArgs e) 
{ 
    this.BackgroundImage = BackgroundImageHolder.Instance.BackgroundImage; 
} 

Затем, чтобы глобально изменить изображение, нужно только сказать BackgroundImageHolder о новом изображении:

BackgroundImageHolder.Instance.BackgroundImage = ...; 

Выполнено.

+0

Да, это было правильно. Form2 имеет кнопки, и проблема в том, что когда я изменяю backgroud в From2, он не изменяется в Form1. Как достичь этого, когда я нажимаю кнопку, у которой есть изображение, которое будет оставаться до тех пор, пока оно не будет изменено другим? – user2535448

+0

Nice, но есть способ сохранить изображение.Как и в form2, фоновое изображение изменяется и сохраняет один и тот же фон в других формах, потому что, когда я меняю фоновое изображение в form2, когда я возвращаюсь к form1, фоновое изображение является нулевым, и я хочу сохранить тот, который я использовал в form2. – user2535448

+0

Я отредактирую свой ответ. –

0

Вы можете сохранить имя ресурса в application settings, а затем всякий раз, когда открывается форма, вы можете загрузить изображение оттуда. (Обратите внимание, что для выполнения этой работы вам необходимо иметь настройки приложения с именем «formBackgroundImage»).

Что-то вроде этого:

Settings.Default["formBackgroundImage"] = "_1334821694552"; 

и Form1_Load каждой формы, которые должны иметь один и тот же образ вы пишете:

this.BackgroundImage = new Bitmap(Properties.Resources.ResourceManager.GetObject(Settings.Default["formBackgroundImage"]), new Size(800, 500)); 

Если вы хотите изменить изображение на формах, уже открыт Вы можете:

a) когда пожарные события формы Activated, проверьте, есть ли backgrou ndImage по-прежнему остается неизменным и меняет его, если это не так.

ИЛИ

б) Сразу же после изменения BackgroundImage, петля через открытые формы приложения и установить их там, а также:

private void changeBackgroundImage() 
{ 
    //set the backgroundImage for this form 
    this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500)); 

    //save the backgroundImage in an application settings 
    Settings.Default["formBackgroundImage"] = "_1334821694552"; 

    //set the backgroundImage for all open forms in the application: 
     foreach (Form f in Application.OpenForms) { 
       f.BackgroundImage = new Bitmap(Properties.Resources.ResourceManager.GetObject(Settings.Default["formBackgroundImage"]),new Size(800, 500)); 
     } 

} 

Все это зависит от того, как много открытых форм вы планируете иметь и во сколько мест вы даете пользователю возможность изменить образ формы. Если вы имеете дело со многими формами, то решение, размещенное другими на этой странице, может быть для вас правильным.

+0

Это хорошо. Не могли бы вы записать, как это сделать, кстати. Я все еще очень новичок в программировании и C# – user2535448

+0

жаль, что это VB.NET, я отправлю C# – Winks

+0

. См. Мой обновленный ответ. Я попробовал это с растровым изображением как ресурсом, и он должен работать. – Winks

0

Если вы хотите, чтобы все формы имели одинаковый фон, тогда вы должны использовать inheritance. Создайте основную форму, поддерживающую исходную информацию, а затем выведите все другие формы из этого мастера. Таким образом, вам не нужно повторять логику в каждой из производных форм, и все формы будут иметь одно и то же поведение.

Это довольно просто настроить:

public class MasterBackgroundForm : Form 
{ 
    public override Image BackgroundImage 
    { 
     get 
     { 
     return m_backgroundImage; 
     } 
     set 
     { 
     if (m_backgroundImage != value) 
     { 
      m_backgroundImage = value; 
      this.OnBackgroundImageChanged(EventArgs.Empty); 
     } 
     } 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     // Set default background image. 
     this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, 
             new Size(800, 500)); 
    } 

    private static Image m_backgroundImage; 
} 
public class Form1 : MasterBackgroundForm 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    // ... etc. 
} 
public class Form2 : MasterBackgroundForm 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    // ... etc. 
} 
+0

Спасибо. Но также, если вы не возражаете, как сделать это для нескольких фонов. Как с кнопкой, чтобы изменить фон, который останется до тех пор, пока не будет использовано другое изображение? – user2535448

Смежные вопросы