Bu yazımızda Windows uygulamalarımıza ToolBox'ımızda bulunan kontroller gibi nasıl kontrol oluşturabiliriz ona bakıcaz.Örnek olarak hazırladıgım kontrolün mantığı ToolBox'dan formumuza ekledikten sonra formu çalıştırıp resim seçme işlemleri yapmamızı sağlıyor ve bu seçtiğimiz resimleri Slaytı başlat butonuyla form üzerinde resimleri gösteriyor rastgele.Timer hızını belirlememiz için kontrolümüzde bir numericUpDown var interval değerini bu belirliyor.Birde bu kontrolümüzde KontroldeSadeceResimGozuksunMu isimli bir property var.Aslında bunu true yapınca butonları falan gizlemiyor sadece label ve comboBox'ı yok ediyor.Properties'den false yaparsak ise hepsinin gözükmesini sağlarız.
Visual Studio 2008'de yeni bir Kontrol projesi oluşturmak istersek New Project penceresinden Windows Forms Control Library 'i seçmemiz lazım.Açılan projede ekrana içi boş ufak bir alan gelmektedir.Burada sizin kafanızda ki kontrolü oluşturmanız için ToolBox'dan artık sizin hayal gücünüze en uygun olan kontrolü ekleyip başlayın kodlamaya :) Kontrolü oluşturduktan sonra derleyip projenisin olduğu klasörde Debug'ın altında sizin kontrolünüzün dll'si bulunmaktadır.Bu sizin kontrolünüzdür.
Bu dll'yi başka projelerde kullanmak için ise oluşturduğunuz bir projede ToolBox'ımızın üzerine gelip Sağ tuş yaptığımızda ekrana gelen menüden Choose Items'a basınız.Bu sırada biraz kasabilir :) .Ekrana gelen Choose ToolBox Items penceresinden .NET Framework Components sekmesinde iken Sağ alt tarafta Browse butonuna basarak kendinizin oluşturmuş olduğu kontrol dll'sini seçiyoruz.Seçtikten sonra ToolBox'ımıza artık o kontrolümüzün eklendiğini göreceksiniz.Tek kalan formumuza sürükleyip bırakmak :)
Projeme ekleyip formu çalıştırdıgımda eklediğim resimleri oynatırkenki kontrolümüzün görünümü şöyledir.

Kontrolümüzün kodları
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsControlLibrary1
{
public partial class CustomWindowsControl : UserControl
{
public CustomWindowsControl()
{
InitializeComponent();
}
//propery oluşturmak için değişkenimizi oluşturuyoruz.Değer atamadıgımızdan defaul olarak true'dır.
bool _kontroldeSadeceResimGozuksunmu;
//oluşturduğumuz bool propertyisini kapsüllüyoruz
public bool KontroldeSadeceResimGozuksunMu
{
get { return _kontroldeSadeceResimGozuksunmu; }
set { _kontroldeSadeceResimGozuksunmu = value; }
}
//Seçilen resimlerimizi attığımız List<>
List<string> dosyaYol = new List<string>();
//Label'a yazdıgımız resim sayısı.Aslında gerek yokta bulunsun şimdilik :)
int resimSayisi = 0;
//Resim seç butonunu olayıları.Yabancu birşey yok zaten.
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//oluşan listemize seçilen dosyanın uzun yolunu atıyoruz
dosyaYol.Add(openFileDialog1.FileName);
resimSayisi++;
label2.Text = "Toplam Resim :" + resimSayisi;
//Aynı şekilde seçtiğimiz dosyamızın sadece ismini atıyoruz
comboBox1.Items.Add(Path.GetFileName(openFileDialog1.FileName));
button2.Enabled = true;
}
}
//Resimlerimizin listelendiği combodan seçilen dosyayı pictureBox'umuzda gösteriyoruz.Oluşturduğumuz List<> ve combomuzda duran degerlerin indexleri 0'dan başladığından combodan seçilen index mesela 2'inci resimi seçtiğimizde seçilen index 1 oluyoruz.Bu 1 indexsinide seçilen resimlerin sakladıgı list'temizde yani DosyaYol listemize index olarak verirsek combo'dan seçtiğimiz resim adının uzun yoluna listemize index göndererek seçebiliriz.
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
pictureBox1.ImageLocation = dosyaYol[comboBox1.SelectedIndex];
}
//Timerın form üzerinden belirtilen süre tekrarı ile tetiklenecek alan.
private void timer1_Tick(object sender, EventArgs e)
{
//toplam resim sayısını alıyoruz combodan
int resimSayisi = comboBox1.Items.Count;
//Resimleri listemize ekledikten sonra Slayt Başka butonuna tıklandığında bu tick olayımız çalışacağındam picturebox'da listemizdeki resimlerden rastgele birilerini gösterecektir.Bu rastgele işlemi içinde Random sınıfından bir nesne oluşturuyoruz.
Random r = new Random();
//PictureBox'ımıza List<>'emizde kayıtlı olan resim yollarını vereceğiz.Bundan önce göstermek istediğimiz list'imize index vermemiz gerekiyor.Bunun için r nesnesinin Next metodunu çağırarak başlangıç değeri 1 olan ve en büyük değeride yukarıda tanımlamış olup combo'muzdaki toplam resim sayısı olarak veriyoruz.her tick'de bu değerler arasında rastgele sayı oluşturup o oluşan sayıyıda resimlerimizin uzun yolunun tutulduğu dosyaYol listemize index olarak verip o indexteki resim yolunun pictureBox'ımızda gösterecek.
pictureBox1.ImageLocation = dosyaYol[r.Next(1, resimSayisi)];
//PictureBox hariç diğerlerini gizli
//KontroldeSadeceResimGozuksunmu property'sini eğer true ise formumuzu foreach ile dolaşıp tüm nesneleri control ediyoruz.Bu property true ise contollerimizin hepsini yani label ve comboBox ın visible özelliğini false yaparak gizliyoruz.
if (_kontroldeSadeceResimGozuksunmu)
{
foreach (Control c in this.Controls)
if (c is Label || c is ComboBox )
c.Visible = false;
}
else
{
//KontroldeSadeceResimGozuksunmu properysinin değeri eğer false ise tüm nesnelerin görünümünü true yapıyoruz.
foreach (Control c in this.Controls)
if (c is Label || c is ComboBox )
c.Visible = true;
}
}
//Slayt başla butonu.
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.ImageLocation = dosyaYol[0];
comboBox1.Enabled = false;
button1.Enabled = false;
button2.Enabled = false;
btnDurdur.Enabled = true;
numericUpDown1.Enabled = false;
//numericUpdown'dan seçilen değer 0-9 arası olduğundan ve timer nesnesinde interval değer olarak milisaniye cinsinden deger istediğinden böyle bir işlem yaptık.1000 milisaniye 1 saniyedir.Bu sebeple numericUpDown'dan 5 seçilirse 5 değerinin sonuna üç tane 0 eklerek 5000 milisaniye diye belirtmiş oluruz.Böyle oluncda timer nesnemizin tick olayı 5 sanyiede bir çalışacaktır.
timer1.Interval = int.Parse(numericUpDown1.Value + "000");
timer1.Start();
}
//burda ise slayt'ımızı durduruyoruz.
private void btnDurdur_Click(object sender, EventArgs e)
{
timer1.Stop();
comboBox1.Enabled = true;
button1.Enabled = true;
button2.Enabled = true;
numericUpDown1.Enabled = true;
btnDurdur.Enabled = false;
}
}
}
Kodlarımızdan da anlaşıldığı gibi karmaşık bir yapı söz konusu değildir.Çok zevkli bir uygulamadır geliştirilebilir daha da güzel olabilir.Bu sadece örnek göstermek için tasarlanmıştır.
Kontrolü *.dll olarak indirmek için tıklayın
Proje olarak indirmek için tıklayın
Faydalı olması dileğiyle kendinize iyi bakın :)
Serhat TAŞ