2013-03-27 2 views
0

나는 this 기술을 사용하고 있습니다. 배경색은 바뀌지 만 이미지는 바뀌지 않습니다. 내 이미지 크기가 창의 크기보다 작아서 BackgroundImageLayout을 사용하여 늘이기 만해도 아무런 차이가 없습니다. 그것은이 문제가 발생하는 이유를 완벽하게 분명배경 설정 MDI 양식

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

: 내 MDI 폼의 생성자에서

나는 다음과 같은 코드를 사용하고 있습니다. 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(); } 
    } 
} 

을 오류가 여기에 처리하기 위해, 분명히.