Metro FM URL adresi değişmiş

Metro FM

Metro FM

Metro FM severek dinlediğim bir radyo kanalı. Son günlerde çalışmıyordu. Devamlı olarak bağlantı kurulamadı hatası alıyordum. Biraz araştırdıktan sonra yayın yaptığı IP adresin değiştiğini farkettim. Broadcast şirketini değiştirmişler. Neyse ki bir iPhone' um var ve Wireshark sayesinde IP izleyebiliyorum. Malum Metro FM' in iPhone versiyonundan bağlantı yaptığı sunucunun IP adresini ve port numarasını bulabiliyorsunuz. Eğer sizde Metro FM' i RDK ile dinlemek istiyorsanız şunları yapabilirsiniz:

  • İlk önce Radyo Listesi'inden Metro FM' i silin (eğer varsa).
  • Daha sonra Radyo Ekle düğmesine tıklatarak Metro FM' i aratın.
  • Son olarak Metro FM' in bulunduğu sayfa içindeki Ekle bağlantısına tıklatın.

Eğer Metro FM' i URL adresinden eklemek isterseniz adres şu: http://46.165.197.15:3035/

Kolay gelsin...

Etiketler: , , , , , , , ,

Yorumlar (5)

C# ile Hava Durumu Programı

C# ile Hava Durumu Programı

C# ile Hava Durumu Programı

C# ile örnek programlarımıza devam ediyoruz. Bu kez bir Hava Durumu programı tasarladım. Aslında amacım hava durumu takip programı yapmaktan öte birkaç teknik göstermek. Öncelikle göstermek istediğim şey resimlerin C# ve GDI+ ile nasıl renklendirileceği. Ayrıca Kış Uykusu konusunda çok mail aldım. Bende C# ile kış uykusu denilen şeyin nasıl yapılacağını göstermeye çalıştım. Başlıyoruz...

1. TASARIM

C# ile Hava Durumu Programı Tasarım Aşaması

C# ile Hava Durumu Programı Tasarım Aşaması

Son derece çirkin bir ekran görüntüsü değil mi? Tasarım aşamasında seçtiğim renklere takılmayın. Sadece ana form üzerinde çok fazla kontrol vardı ve ayırt etmek güç olduğundan farklı farklı renklerle boyadım. Hepsi bu. Programın çalışma zamanındaki ekran görüntüsü çok şık olacak inanın. Tasarım aşamasında önceki yazılarımda belirttiğim gibi ana formun FormBorderStyle özelliğini None olarak ayarlıyoruz. Form üzerindeki resimler için Picturebox ve yazılar için Label bileşenlerini kullanacağız. Siz, konumlar üzerinde değişikilik yaparak farklı ekran tasarımları elde edebilirsiniz. Denemenizde fayda var. Bu arada tasarım kısmında form üzerindeki birçok kontrol disable durumdadır. Bunun sebebi çalışma sırasındaki sürükleme işleminde kolaylık sağlaması. Sürükleme işlemini ana formun MouseMove olayına bağlamak en kolay yoldu benim için. Gelelim kod kısmına...

2. KOD

Diğer örneklere nazaran biraz daha fazla kod yazdım. Özellikle Renklendirme ve Kış Uykusu için gerekliydi. Ama gözünüz korkmasın oldukça kolaydır. Hava durumu bilgilerini MSN Weather Service' ten alıyoruz. Kaynak kod içinde gerekli URL adresleri mevcut. GetWeatherData() isimli prosedür gerekli internet bağlantısını sağlıyor. Bildiğiniz gibi bu tip bağlantılar için WebClient sınıfınından bir nesne kullanmak en kolay yoldur. Diğer projelerden farklı olarak WebClient ile oluşturduğumuz bağlantıyı asenkron (Async) yapacağız ki bağlantı sırasında diğer ekran işlemleri kesintiye uğramasın. Bağlantıyı sağlayan GetWeatherData() prosedürü aşağıdaki şekildedir. Detaylar kaynak kod içinde mevcut.

private void GetWeatherData()
{
	locationLabel.Text = Properties.Resources.Connecting;

	RepaintLayeredForm();
	UpdateLayeredForm();

	string requestURL = String.Format(dataFormat, locationCode, degreeType, culture);
	WebClient webclient = new WebClient();
	webclient.Encoding = Encoding.UTF8;
	webclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(OnDownloadStringCompleted);
	webclient.DownloadStringAsync(new Uri(requestURL));
}

Bu yazıda İnternet bağlantısı ve veri çekme işlemlerinden bahsetmeyeceğim. Bizi asıl ilgilendiren konulara giriş yapalım. Yukarıda belirttiğim gibi Renklendirme ve Kış Uykusu temel hedefimiz.

RENKLENDİRME
GDI+ renklendirme işlemi için bir matris kullanır. Bu matris 5x5 şekilinde kare bir matristir. Sadece köşegenleri 1 olan ve diğer elemanları 0 olan bir matristir bu. C# içinde ColorMatrix adıyla tanımlanmıştır. Temel renklendirme matrisi C# için şu şekildedir:

ColorMatrix matrix = new ColorMatrix(new float[][]
{
	new float[]{ 1f, 0f, 0f, 0f, 0f },
	new float[]{ 0f, 1f, 0f, 0f, 0f },
	new float[]{ 0f, 0f, 1f, 0f, 0f },
	new float[]{ 0f, 0f, 0f, 1f, 0f },
	new float[]{ 0f, 0f, 0f, 0f, 1f }
});

Benim geliştirdiğim tüm projelerde bu matris kullanılmıştır. Fakat işin sırrı matriste değil kullandığım resimlerde gizlidir. Resimlerimin tamamı gri tonlarından oluşmuştur. Ancak bu tip bir resimde renklendirme istenilen sonucu verir. Hava durumu projesinde ekrandaki resimleri herhangi bir renge çevirmek istediğinizde matris içindeki ilk üç köşegeni değiştirmek yeterlidir. Kodu şu şekilde yazabiliriz:

matrix.Matrix00 = (float)color.R / (float)255;
matrix.Matrix11 = (float)color.G / (float)255;
matrix.Matrix22 = (float)color.B / (float)255;

Burada dikkat edilirse renk değerleri 255' e bölünmüştür. GDI+ renkler için normalize edilmiş değerler kullanır. Sebebi tamamen bu. Kaynak kod içinde DrawColorizedPicture adında bir prosedür mevcut. Burada PictureBox türünden bir nesne istenilen bir renkte çizilebiliyor.

private void DrawColorizedPicture(PictureBox picture, Color color)
{
	ColorMatrix matrix = new ColorMatrix(new float[][]
	{
		new float[]{ 1f, 0f, 0f, 0f, 0f },
		new float[]{ 0f, 1f, 0f, 0f, 0f },
		new float[]{ 0f, 0f, 1f, 0f, 0f },
		new float[]{ 0f, 0f, 0f, 1f, 0f },
		new float[]{ 0f, 0f, 0f, 0f, 1f }
	});
	matrix.Matrix00 = (float)color.R / (float)255;
	matrix.Matrix11 = (float)color.G / (float)255;
	matrix.Matrix22 = (float)color.B / (float)255;
	using (ImageAttributes attr = new ImageAttributes())
	{
		attr.SetColorMatrix(matrix);
		graphics.DrawImage(picture.Image, picture.Bounds, 0f, 0f, picture.Image.Width, picture.Image.Height, GraphicsUnit.Pixel, attr);
	}
}

KIŞ UYKUSU
Bu ifade tamamen benim uydurduğum bir şeydir. Programlama dünyasında Prevent Dragging (Sürükleme önlemi yada engeli) olarak bilinir. Bir de saydamlık ekledim. Daha şık olur diye düşündüm. Bu işlemi yapmak için penceremize WS_EX_TRANSPARENT özelliği eklememiz gerekiyor. Bu özellik pencerenizin fare ile yapılacak tüm olaylara geçirgen davranmasını sağlar. En basit olarak fare ile pencerenin hiçbir yerine tıklatamazsınız. C# ile bir pencereyi kış uykusu moduna geçirmek ve kış uykusundan çıkmasını sağlamak için şu kodları kullanabiliriz:

private void DoHibernate()
{
	long style = Win32.GetWindowLong(this.Handle, Win32.GWL_EXSTYLE).ToInt32();
	if ((style & Win32.WS_EX_TRANSPARENT) == 0)
	{
		style |= Win32.WS_EX_TRANSPARENT;
		Win32.SetWindowLong(this.Handle, Win32.GWL_EXSTYLE, (IntPtr)style);
		opacity = 0x80;
	}
}

Uyandırma işlemi için gereken kod:

private void DoWakeup()
{
	long style = Win32.GetWindowLong(this.Handle, Win32.GWL_EXSTYLE).ToInt32();
	if ((style & Win32.WS_EX_TRANSPARENT) != 0)
	{
		style &= ~Win32.WS_EX_TRANSPARENT;
		Win32.SetWindowLong(this.Handle, Win32.GWL_EXSTYLE, (IntPtr)style);
		opacity = 0xff;
	}
}

Kış uykusuna geçmiş bir pencereyi uyandırmak için yukarıdaki kodu nasıl kullanacağız? Bu işlem biraz daha kod gerektiriyor: Madem ki fare ile tıklatamıyorum o zaman klavyedeki tuşları takip ederim bende... Basit bir Timer bileşeni ile tuşları takip edebilirim aslında. Benim kullandığım teknik şu: Kış uykusuna geçtikten sonra ekranda farenin koordinatlarına bakıyorum ve klavyeden CTRL tuşuna basılıp basılmadığını kontrol ediyorum. Bu iki durum oluşmuşsa pencerenin uyanmasını istiyorum. Tabi bu işlemleri bir Timer' in OnTick olayı içinde yapmanız gerekiyor. Klavyeden CTRL tuşunu ve ekrandaki farenin pencere üzerinde olup olmadığını şu şekilde kontrol edebiliriz:

private void keyTimer_Tick(object sender, EventArgs e)
{
	Win32.Rect rect = new Win32.Rect();
	Win32.GetWindowRect(this.Handle, ref rect);
	Win32.Point p = new Win32.Point();
	Win32.GetCursorPos(ref p);
	if (Win32.PtInRect(ref rect, p))
	{
		short keyState = Win32.GetKeyState(Win32.VK_CONTROL);
		if ((keyState & 0x8000) != 0)
		{
			hibernate = false;
			SetHibernateState(hibernate);
		}
	}
}

Evet. Kabaca anlatmaya çalıştım. Eğer kaynak kodu indirip incelerseniz çok daha kolay anlayacağınızı umuyorum. C# ile Hava Durumu programının kaynak kodunu aşağıdaki linkten indirebilirsiniz.

havadurumu-csharp-source.rar [1.85 MB]

Etiketler: , , , , , , , , , , , , , , , , , , , , ,

Yorumlar (27)

C# ile Dijital Saat (Digital Clock)

C# ile Dijital Saat (Digital Clock)

C# ile Dijital Saat (Digital Clock)

Analog Saat ve Döviz.NET projelerinden sonra bir Dijital Saat yapmak geldi içimden. Aslında bu işin ne kadar kolay olduğunu göstermekti amacım. Basit bir form tasarlıyorsunuz ve ona uygun resimler ile süslüyorsunuz. Gerisi zaten kaynak kod ile geldiğinden size sadece kodları projenize eklemek kalıyor. Hepsi bu. Dijital saat yapımında Yahoo! Widgets kütüphanesinde bulunan Digital Clock çalışmasını örnek aldım. Yani resimlerin tamamı bu projeden. Elbette birebir aynı değil. Bazı özellikeri devre dışı bırakmak zorunda kaldım. Malum amacımız temel bazı şeyleri öğretmek olduğundan oldukça sade bir proje yapmalıyız. Bu projeye Tema özelliği de ekledim. Eğer ana pencere üzerinde farenin sağ tuşuna basarsanız içerik menüsü görüntülenecektir. Ekrandaki Temalar menüsünden 4 farklı temadan birini seçebilirsiniz. Çalışma esnasında seçtiğiniz tema hemen uygulanactır. Daha fazla söze gerek yok sanırım. İndirin ve tecrübelerinizi bizimle paylaşın. Kolay gelsin...

digital-clock-csharp-source.rar [641 KB]

Etiketler: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Yorumlar (16)

Mini Google 2.0 Çıktı

Mini Google 2.0

Mini Google 2.0

Mini Google 1.5 artık çalışmıyor. Google Autocomplete API sanırsam tamamen durdurulmuş. Daha doğrusu dış kullanıma kapatılmış. Biraz inceledim ki artık şifrelenmiş durumda. Bu yüzden sonuç dönmüyordu. Neyseki toolbar için destek hala devam ediyormuş. Hata düzeltildi. Aşağıdaki linkten indirebilirsiniz.

    Mini Google 2.0 İNDİR: minigoogle-2.0-setup.rar [489 KB]

Etiketler: , , , , , , , , , ,

Yorumlar (3)

Döviz.NET: C# ile Online Döviz Programı

Döviz.NET: C# ile Online Döviz Programı

Döviz.NET: C# ile Online Döviz Programı

Uzun zamandır öğretici bir makale yazamadım. Özellikle C# ile Widget yada Gadget tarzı program geliştirme konusunda oldukça fazla mail aldım. Aslında önceki yazılarımda bu konuya açıklık getirmeye çalışmıştım ama sanırsam bazı sıkıntılar olmuş. Elimden geldiğince bu sorunları gidermeye çalışacağım. Projenin adını Döviz.NET olarak seçtim. Adından anlaşılacağı üzere masaüstü için online döviz takip programı. Tabiki şimdilik sadece Dolar ve Euro bilgisini ekrana getirebiliyor. Projenin öğretici olması amacıyla karmaşadan uzak kalmaya çalıştım. Zaten amacım tam teşekküllü program yazmak değil, temel bazı ipuçları vermek. Başlayalım...

1. TASARIM

Döviz.NET projesini Microsoft Visual Studio 2008 ile .NET FrameWork 3.5 temel alarak geliştireceğiz. Tasarım aşaması oldukça basit. Normal bir Windows Form tasarımı ile aynı. Buradaki amacım daha az kod yazarak işimizi kolaylaştırmak. Malum C#, GDI+ ve UpdateLayeredWindow başlıklı yazımda tasarım kısmına pek değinememiştim. Kod kısmı fazla olduğu için anlaşılmasında sıkıntı yaşanmış. Zaten bu yazının amacıda bu karmaşayı gidermek. Aşağıda resimde tasarım aşamasından bir ekran görüntüsü mevcut. Bu formu normal bir form tasarımı yapar gibi yapabilirsiniz. Form üzerindeki resimler için PictureBox bileşenini, yazılar için ise Label bileşenini kullandım. Burada en önemli kısım formun başlık kısmının kaldırılması. Bu işlem için formun FormBorderStyle özelliğini None olarak ayarlamalıyız. Widget tarzı programlarda pencere başlığı bizim için zorluk çıkartır. Çalışma alanımızda ekstra bir çizim istemiyoruz. Gereken tüm çizimleri kendimiz halledeceğiz. Dikkat edilmesi gereken bir konuda şu: Form tasarımında resimlerin ve etiketlerin görüntüsü çalışma zamanındaki ile farklı. Özellikle bileşenlerin zemin kısımlarına dikkate edin. Hiçbiri saydam (transparent) değil. Tüm bileşenlerin zeminleri kendi backColor rengi ile doldurulmuş. Tabiki bu istemediğimiz bir durum. Bu sorunun sonraki aşamada nasıl giderileceğinden bahsedeceğim. Tabiki kod yazarak...

Döviz.NET Tasarım Aşaması

Döviz.NET Tasarım Aşaması

2. KOD

Asıl zevkli kısma geldik... Önceki yazılarımda bahsettiğim gibi ilk önce temel felsefeyi anlamamız gerekiyor: Normalde tasarım yaptığımız bir Windows formunu Run ettiğimizde ekstra bir çizim yapmadan görüntüyü elde ederiz. Çünkü işletim sistemi gereken tüm çizimleri bizim için yapar. Örneğin formumuzun zemini o anki sistem renklerine bağlı olarak dikdörtgen şeklinde çizilir. Oysa biz daha yumuşak ve kıvrımlı bir görüntü elde etmek isteyebiliriz. Mesela PhotoShop' ta tasarlanmış parıldayan top şekli yada kenarları yuvarlatılmış gölgeli (drop shadow) bir çerçeve. Ekranda oldukça şık dururdu değil mi? Şunu unutmayın ki Widget tarzı programlarda pencere yapısı klasik pencerelerden farklıdır. Bu tip pencerelere Layered Windows denir. Katmanlı Pencere olarak çevirebiliriz dilimize. Windows 2000 ile birlikte kullanılmaya başlanan bir özellik bu. Normal bir pencerenin ExStyle özelliğine WS_EX_LAYERED değerini ekleyerek elde edilir. Böylece sisteme oluşturduğumuz pencerenin katmanlı olduğunu bildiriyoruz. Kod kısmı en basit olarak şöyle yazılabilir:
long style = CreateParams.ExStyle;
style |= Win32.WS_EX_LAYERED;
Win32.SetWindowLong(this.Handle, Win32.GWL_EXSTYLE, (IntPtr)style);

Yukarıdaki kod parçasını formunuzun OnLoad olayına yerleştirirseniz pencereniz katmanlı duruma geçer. Ama iş bu kadarla da bitmiyor tabiki. Bir de formun çizim alanının güncellenmesi gerekiyor. Yani katmanlı pencerenin yeniden çizilmesi gerekiyor. Bu işlem için yine Windows API fonksiyonlarından olan UpdateLayeredWindow' dan faydalanacağız. Güncelleme işlemi için elimizde formumuzun o anki görüntüsü olmalı. UpdateLayeredWindow fonksiyonu DC (Device Context) ile parametrik çalışır. Bu yüzden elimizde bir bitmap olsa çok iyi olurdu diyoruz. GDI+ ile çizim yapmanın en pratik yollarından biri de Bitmap sınıfından bir nesne ile ilişkilendirilmiş bir Graphics nesnesi. Graphics sınıfının GetHdc fonksiyonu ile aranan DC' yi çok kolay bir biçimde elde edebiliriz. Aşağıdaki kod parçasında Bitmap ile Graphics nesnelerinin nasıl kullanıldığını görebilirsiniz.
/* Form boyutlarinda bir Bitmap olustur */
bitmap = new Bitmap(this.Width, this.Height, PixelFormat.Format32bppArgb);
/* Bitmap ile baglantili ana Graphics nesnesi */
graphics = Graphics.FromImage(bitmap);

UpdateLayeredWindow için gereken DC' yi Graphics nesnesinin alabiliriz ama bu fonksiyonun bi' dünya parametresi var değil mi? Kaynak kod içinde UpdateLayeredForm() prosedürü UpdateLayeredWindow fonksiyonunun nasıl kullanıcağını gösteriyor. Alternatif kullanım şekilleri de mevcut ama ben klasik kullanımdan yana olduğum için bu kodu tercih ediyorum. Size de tavsiye ederim ve mutlaka inceleyin derim.
Geldik biraz karışık işlemlere... Aslında bu yazının temel öğretici amacını oluşturan kısım burası. Tasarım kısmında görünen kontrollerin tamamını bizim yeniden çizmemiz gerekiyor. Üstelik normalden farklı olarak. Dikkat ettiyseniz tasarım aşamasında resimlerin ve etiketlerin bir background' u var. Oysa programın çalışması sırasında bu background çizimleri görünmüyor. Transparent Label ve PictureBox oluşturmak C# ile oldukça kolay. Bu işlem için biraz kod yazmak gerek. Bende üşenmedim ve RepaintLayeredForm() adında bir prosedür yazdım. Bu prosedür form ekranındaki kontrolleri tekrardan transparent olarak çiziyor. Çizim esnasında biraz farklılık oluşuyor ama göze pek çarpmıyor. Aslında daha detaylı uğraşmak gerekiyordu fakat kaynak kod içinde karmaşıklığa yol açacağından gerek görmedim.
private void RepaintLayeredForm()
{
/* Herseyi sil */
graphics.Clear(Color.FromArgb(0));
/* Dikkat form uzerindeki bilesenler tersten siralanir */
for (int index = this.Controls.Count - 1; index >= 0; index--)
{
Control control = this.Controls[index];
/* Bilesen gorunmezse cizim yapma */
if (!control.Visible) continue;
if (control is PictureBox)
{
/* Bilesen PictureBox turundense Image ozelligini ciz */
PictureBox picture = control as PictureBox;
graphics.DrawImage(picture.Image, picture.Bounds);
}
else if (control is Label)
{
/* Bilesen Label turundense durum biraz karisik. Normalde DrawToBitmap fonksiyonu
* transparent cizim yapmaz. Biz zeminin cizilmesini istemiyoruz. Orjinalden biraz
* farkli bir cizim yapiyoruz.
*/
Label label = control as Label;
this.DrawTransparentLabel(label);
}
else
{
/* Diger turdense varsayilan cizim */
control.DrawToBitmap(bitmap, control.Bounds);
}
}
}

Evet. Bu kadar yazıdan fazlası okunmaz herhalde... C# ve GDI+ ilgilenen arkadaşlara bir yol gösterme amacıyla yazdığım bu makalenin sonuna geldik. Döviz.NET projesinin içinde burada bahsetmediğim bazı kodlar da var elbet. Özellikle internet bağlantısı yapılan kısımlar maalesef Thread kullanılmadan yazılmıştır. Ben kaynak kodu elimden geldiği kadar sade tutmaya çalıştığım için bu proje gerçek zamanlı ve son kullanıcıya hitap eden bir proje değildir. Hali hazırda eksiklikleri çoktur. Projenin kaynak kodunu aşağıdaki linkten indirebilirsiniz.

doviz.net-source.rar [277 KB]

Etiketler: , , , , , , ,

Yorumlar (5)

Sayfa: << 1 2 3 ... 24 25 26 27 28 ... 50 51 52 >>