2013-03-27 5 views
0

Я использую метод this, он хорошо работает, чтобы изменить цвет фона, но не изображение. Мое изображение маленькое по размеру, чем окно, поэтому я использую BackgroundImageLayout для растяжки, но это не имеет никакого значения.Настройка фонового изображения формы MDI

В конструкторе моего MDI Form в Я использую следующий код:

InitializeComponent(); 

      Image img = Image.FromFile("C:\\duk.jpg"); 
      foreach (Control control in this.Controls) 
      { 
       if (control is MdiClient) 
       { 


        control.BackgroundImageLayout = ImageLayout.Stretch; 
        control.BackgroundImage = System.Drawing.Image.FromFile("C:\\duk.jpg"); 

        // control.BackColor = Color.AliceBlue; 
        //Properties.Resources.duk; 
        MessageBox.Show("MDI"); 
        break; 
       } 
      } 
+0

Невозможно воспроизвести его. Появляется ли MessageBox? Является ли изображение действительным? – LarsTech

+0

Да MessageBox. Всплывающее изображение и изображение тоже. Путь хорошо установлен. Вы можете установить фоновое изображение? Даже если я печатаю Размер изображения, он хорошо печатает размеры. – Volatil3

+0

Я разместил две панели на форме, и они оба отображали свои фоновые изображения. – LarsTech

ответ

0

Это совершенно понятно, почему эта проблема происходит. Объекты MDIClient не поддерживают ImageLayout.Stretch. Это документировано. На самом деле это правильно, это огромная боль. Попробуйте унаследовать свою форму MDI из чего-то вроде этого (редактирование при необходимости):

public class MdiForm : System.Windows.Forms.Form 
{ 
    private static readonly float _bg_scale = FormGraphics.mdi_background.Width/(float)FormGraphics.mdi_background.Height; 

    private MdiClient _mdi_client = null; 

    private Image _background_cache = null; 

    public MdiForm() 
    { 
     SetStyle(
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint | 
      ControlStyles.OptimizedDoubleBuffer, true); 

     Shown += MdiForm_Shown; 
     SizeChanged += MdiForm_SizeChanged; 

     IsMdiContainer = true; 
    } 

    private void MdiForm_Shown(object sender, EventArgs eventArgs) 
    { 
     foreach (MdiClient control in Controls.OfType<MdiClient>()) 
     { 
      _mdi_client = control; 
      control.Paint += MdiClient_Paint; 
      control.BackColor = Color.White; 

      //LA LA LA I CAN'T HEAR YOU 
      //this DOES work and IS required to avoid flicker 
      MethodInfo mInfoMethod = typeof(MdiClient).GetMethod(
               "SetStyle", 
               BindingFlags.Instance | BindingFlags.NonPublic, 
               Type.DefaultBinder, 
               new[] { typeof(ControlStyles), typeof(bool) }, 
               null); 
      mInfoMethod.Invoke(control, new object[] { 
       ControlStyles.UserPaint | 
       ControlStyles.AllPaintingInWmPaint | 
       ControlStyles.OptimizedDoubleBuffer, true }); 
     } 
    } 

    private void MdiClient_Paint(object sender, PaintEventArgs e) 
    { 
     if(_background_cache == null) { _background_cache = new Bitmap(FormGraphics.mdi_background, (int)(Height * _bg_scale), Height); } 
     e.Graphics.DrawImageUnscaled(_background_cache, Point.Empty); 
    } 

    private void MdiForm_SizeChanged(object sender, EventArgs e) 
    { 
     if (_background_cache != null) { _background_cache.Dispose(); } 
     _background_cache = null; 
     if (_mdi_client != null) { _mdi_client.Invalidate(); } 
    } 
} 

Вы сами по себе для обработки ошибок здесь, очевидно.

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