9 Ağustos 2007 Perşembe

MDI Formlarda Parent Formun Arka Planını Değiştirme

Bu yazımda MDI formlarda parent formun arkaplan rengini değiştirmeyi anlatmaya çalışacağım. Eminim ki birçoğunuz parent formun arkaplan rengini ve ya resmini değiştirmeyi properties penceresinde ve kod tarafında denedi ama muhtemelen olmadı. Yaptığım bir projede bunu kullanmam gerekmişti. Aşağıdaki kodların işe yaramadığını görmüş olabilirsiniz. (Visual Studio .Net 2005’te öyle)

this.BackgroundImage = Image.FromFile("C:\\Resim.jpg");
this.BackColor = Color.Blue;

Ben yaptığım projede bazılarınızın da aklına geldiği gibi kalıtım kullandım. Ama kalıtımda da yukarıdaki kodları doğrudan yazınca (sadece renk değiştirmede) işe yaramıyor. Bunun için uyguladığım yöntemi kodları kısaltıp size aktarmak istiyorum.

İlk olarak MdiBackGround isimli yeni bir Windows projesi oluşturalım. Ve Form1’in kodlarını aşağıdaki gibi yazalım. (Form1 miras alınacak sınıf olarak kullanılacak)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace MdiBackGround {
 public partial class Form1: Form {
  public Form1() {
   InitializeComponent();
  }
  protected override void OnPaint(PaintEventArgs e) {
   //if (!DesignMode)//eğer tasarım anında hata olursa bunu aktifleştirin.
   PaintBackground(e.Graphics);
  }
  [DefaultValue(false)]
  public new bool IsMdiContainer {
   get {
    return base.IsMdiContainer;
   }
   set {
    base.IsMdiContainer = value;
    if (!value) return;
    for (int i = 0; i < this.Controls.Count; i++) {
     MdiClient mdiClient = this.Controls[i] as MdiClient;
     if (mdiClient != null) {
      mdiClient.Paint += new PaintEventHandler(this.MdiClient_Paint);
      break;
     }
    }
   }
  }
  private void MdiClient_Paint(object sender, PaintEventArgs e) {
   //if (!DesignMode)//eğer tasarım anında hata olursa bunu aktifleştirin.
   PaintBackground(e.Graphics);
  }
  private void PaintBackground(Graphics g) {
   //this.BackgroundImage = Image.FromFile("C:\\Resim.jpg");
   //Burada doğrudan bu yazılınca çalışıyor.
   Rectangle rect = this.ClientRectangle;
   rect.Inflate(2, 2);
   SolidBrush sb = new SolidBrush(Color.Blue);
   g.FillRectangle(sb, rect);
   sb.Dispose();
  }
 }
}
Form’da ilk önce Form sınıfının OnPaint metodunu override ediyoruz. Bu sayede Onpaint metodunu kendi istediğimiz komutları gerçekleştirmek üzere değiştirebileceğiz. Daha sonra IsMdiContainer özelliğini yeniden oluşturuyoruz. Burada bu özelliği taban sınıf olan Form’dan alıyoruz ve formun bütün MdiClient’lerinin Paint olayına MdiClient_Paint metodunu atıyoruz. Peki, ne oluyor bu PaintBackground’da? Görüldüğü gibi extra bir şey yok. Formu kapsayan bir dörtgen SolidBrush ile çizdiriliyor. Şimdi miras alacağımız programa geçelim.
Programa yeni bir form ekleyelim ve IsMdiContainer özelliğini true yapalım. Bir tane MenuStrip ekleyelim ve Yeni adlı bir menü butonu koyalım. Menü butonuna çift tıklayıp aşağıdaki kodları yazalım. Tabi öncesinde programa yeni bir form ekleyelim. (Bu yavru form olacak.)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MdiBackGround {
 public partial class Form2: MdiBackGround.Form1 //Miras alınıyor.
 {
  public Form2() {
   InitializeComponent();
  }
  private void yeniToolStripMenuItem_Click(object sender, EventArgs
  e) {
   Form form = new Form3();
   form.MdiParent = this;
   form.Show();
  }
 }
}
Gördüğünüz gibi OnPaint olayını override edip, IsMdiContainer özelliğini yeniden oluşturmaktan başka yaptığımız hiç bir şey yok. Buradaki önemli nokta MdiClient’lere MdiClient_Paint özelliğini vermek.

Bu yazımda size MDIParent’lere arkaplan verme hakkında bilgi vermeye çalıştım. Sormak istediğiniz bir şey varsa bana mail atabilir ya da bu yazı için yorum yapabilirsiniz. Ayrıca hatalarımı da bildirirseniz memnun olurum.

2 yorum:

  1. Nice article. I got it thanks ;) i hope u keep on writin\' new ones.
    See ya :)

    YanıtlayınSil
  2. Teşekkürler (: hayatta başarılar.

    YanıtlayınSil

Related Posts Plugin for WordPress, Blogger...