<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shenturk.com &#187; window</title>
	<atom:link href="http://www.shenturk.com/tag/window/feed" rel="self" type="application/rss+xml" />
	<link>http://www.shenturk.com</link>
	<description>Hava Durumu, Hava Cıva!, ADSL Kota, Ey DSL!, Döviz, Mini Döviz, Radyo, RDK, Haber...</description>
	<lastBuildDate>Fri, 10 Feb 2012 07:30:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>WPF ve C# ile Yeniden Analog Saat Yapalım</title>
		<link>http://www.shenturk.com/genel/wpf-ve-c-ile-yeniden-analog-saat-yapalim</link>
		<comments>http://www.shenturk.com/genel/wpf-ve-c-ile-yeniden-analog-saat-yapalim#comments</comments>
		<pubDate>Tue, 17 Jan 2012 15:35:24 +0000</pubDate>
		<dc:creator>freedelphi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[2008]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[analog]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[clock]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[ders notları]]></category>
		<category><![CDATA[digital]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[gdi+]]></category>
		<category><![CDATA[gdiplus]]></category>
		<category><![CDATA[indir]]></category>
		<category><![CDATA[layered]]></category>
		<category><![CDATA[layeredwindow]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[notlar]]></category>
		<category><![CDATA[örnek]]></category>
		<category><![CDATA[plus]]></category>
		<category><![CDATA[saat]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[updatelayeredwindow]]></category>
		<category><![CDATA[Visual]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://www.shenturk.com/?p=1507</guid>
		<description><![CDATA[Maalesef yine bir analog saat yapacağım. Umarım sıkılmazsınız. Bu kez analog saat yapımı için başka bir araç kullananacağım. Microsoft Visual Studio kullanan arkadaşların yabancılık çekmeyeceği bir araç bu: Windows Presentation Foundation yada kısa adıyla WPF. Geçenlerde aldığım bir e-mail üzerine bu yazıyı yazma ihtiyacı duydum. Tartışmanın konusu kısaca şöyle: Basit bir saat yapmak için neden [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 495px"><img title="WPF ve C# ile Analog Saat" src="http://www.shenturk.com/images/img0183.png" alt="WPF ve C# ile Analog Saat" width="475" height="312" /><p class="wp-caption-text">WPF ve C# ile Analog Saat</p></div>
<p>Maalesef yine bir analog saat yapacağım. Umarım sıkılmazsınız. Bu kez analog saat yapımı için başka bir araç kullananacağım. Microsoft Visual Studio kullanan arkadaşların yabancılık çekmeyeceği bir araç bu: <a href="http://msdn.microsoft.com/en-us/library/ms754130.aspx" title="Windows Presentation Foundation" target="_blank">Windows Presentation Foundation</a> yada kısa adıyla <strong>WPF</strong>. Geçenlerde aldığım bir e-mail üzerine bu yazıyı yazma ihtiyacı duydum. Tartışmanın konusu kısaca şöyle: Basit bir saat yapmak için neden bu kadar kod yazmak zorundayız? WPF kullanarak yapamaz mıyız? Cevap basit: Elbette yapabiliriz! Hemde yok denecek kadar az kod yazarak! Önceki Analog Saat örneklerimde Windows' un klasik pencerelerini kullanarak Widget tarzı programların nasıl oluşturulduğunu göstemeye çalıştım. Geçmiş örneklerdeki en önemli kısım pencerenin <strong>katmanlı</strong> yapıya geçirilmesiydi. Bu işlem için <strong>UpdateLayeredWindow</strong> prosedürünü kullandığımızı hatırlayalım. Zorunlu olarak Windows API' den faydalandık. Üstelik ekrandaki her değişiklik için tüm kontrolleri yeniden çizmemiz gerekiyordu. Oldukça zahmetli değil mi? Herkes gibi ben de bu işlemleri otomatikleştirmek için araçlar aradım ve WPF ile tanıştım. Bildiğiniz üzere WPF çok gelişmiş çizim teknikleri içerir. Üstelik doğrudan GPU kullanabilme özelliği de vardır. Microsoft' un beğendiğim yazılım geliştirme ortamlarından biridir açıkçası. Üstelik katmanlı pencere desteği vardır ve tek tuşla aktif hale getirilebilir. Dakikalar içinde masaüstü araçları oluşturabilirsiniz. Yapalım o zaman...</p>
<p><strong>1. TASARIM</strong><br />
Bu projeyi <strong>Microsoft Visual Studio 2010</strong> ile <strong>.NET 4.0</strong> kullanarak geliştirdim. Tasarım aşamasında dikkat edilmesi gereken bazı noktalar var. C# ile yeni bir <strong>WPF Application</strong> seçtiğinizde varsayılan olarak çalışma pencereniz katmalı olarak <strong>ayarlanmaz</strong>. Runtime esnasında klasik bir Windows penceresi ekrana gelir. Oysa biz kenarlık ve başlık satırı istemiyoruz. Saat tasarımı için gerekli resimleri ekrana yerleştirdikten sonra ana pencerenin <strong>Properties</strong> bölümünden şu özelliklerin ayarlaması gerekir:</p>
<ul>
<li>İlk önce <strong>WindowStyle</strong> özelliği <strong>None</strong>,</li>
<li><strong>AllowsTransparency</strong> özelliği <strong>True</strong>,</li>
<li>Son olarak <strong>Background</strong> özelliği <strong>Transparent</strong> olacak. <strong>Null Brush</strong> seçerseniz de aynı sonucu elde edersiniz.</li>
</ul>
<p>Eğer Properties penceresinden ayarlamak istemezseniz bu özellikleri WPF mimarisinin temel yapısı olan <strong>XAML</strong> dosyasından da değiştirebilirsiniz. Bilindiği üzere <strong>XAML</strong> dosyası basit bir <strong>XML</strong> yapısından oluşur. Aslında Visual Studio ortamı sizin için XAML dosyası oluşturak gereken özellikleri Attributes kısmına yazar. Bazen elle düzenleme yapmak daha hızlı olabilir. Yukarıdaki işlemlerden sonra pencereniz katmanlı duruma geçer ve Widget tarzı çok şık bir görünüm elde edersiniz.</p>
<p><strong>2. KOD</strong><br />
Gelelim kod kısmına. Yazdığım kod o kadar kısa ki biz buna kod yazdık bile diyemeyiz. Neredeyse Twitter' da bile daha fazla yazı yazıyoruz... C# ile yazılan Kaynak kodun tamamı 69 satırdan ibaret. Üstelik geniş geniş yazdım ki okunabilir olsun. <strong>MainWindow.xaml.cs</strong> dosya adına sahip kaynak kodun tamamı aşağıdadır. Kod az olunca tamamını yayınlamakta bir sakınca görmedim...</p>
<pre class="brush: c-sharp;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace AnalogSaatWPF
{
    ///
<summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DragMove();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DispatcherTimer clockTimer = new DispatcherTimer();
            clockTimer.Tick += new EventHandler(clockTimer_Tick);
            clockTimer.Interval = new TimeSpan(0, 0, 1);
            clockTimer.Start();
        }

        private void clockTimer_Tick(object sender, EventArgs e)
        {

            // Acilari su anki saate gore hesapla.
            DateTime now = DateTime.Now;

            int hours = now.Hour;
            if (hours > 12) hours = hours - 12;
            int minutes = now.Minute;
            int seconds = now.Second;

            double hourAngle = (hours * 30) + (minutes / 2);
            double minuteAngle = (minutes * 6) + (seconds / 10);
            double secondAngle = seconds * 6;

            hourImage.RenderTransform = new RotateTransform(hourAngle);
            minuteImage.RenderTransform = new RotateTransform(minuteAngle);
            secondImage.RenderTransform = new RotateTransform(secondAngle);

        }

        private void exitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

    }
}
</pre>
<p>Kaynak koda göz atmanız bittiyse bazı püf noktaları verebiliriz artık. <strong>WPF</strong> ile yazılım geliştiren arkadaşlarımız <strong>Toolbox</strong> bölümünde <strong>Timer</strong> bileşeninin <strong>olmadığını</strong> bilirler. Saat programı yapıyorsak bizim kesinlikle bir zamanlayıcıya ihtiyacımız var. Maalesef bu işlemi kod yazarak halletmek zorundayız. Neyseki WPF bize bu desteği sağlıyor. Ana penceremizin <strong>Loaded</strong> olayına küçük bir kod yazdım. Yukarıdaki kod parçasında <strong>35-41</strong> arası satırlara tekrar göz atmanızı öneririm. Ekrandaki saat parçalarının belli bir eksen etrafında dönmesi sağlamak için <strong>Image</strong> sınıfının <a href="http://msdn.microsoft.com/en-us/library/ms750596.aspx" title="MSDN: Transforms Overview" target="_blank">RenderTransform</a> özelliğini değiştirmek yeterlidir. Örneğimizde <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.rotatetransform.aspx" title="MSDN: RotateTransform Class" target="_blank">RotateTransform</a> sınıfını kullandım doğal olarak.</p>
<p>WPF ve C# ile analog saat projesi hakkında söyleyeceklerim şimdilik bu kadar. Aşağıdaki bağlantılardan projenin kaynak kodu ve çalıştırılabilir demosunu indirebilirsiniz...</p>
<table>
<tbody>
<tr>
<td><img src="http://www.shenturk.com/images/vs2010-48x48.png" alt="" /></td>
<td>Microsoft Visual Studio 2010 Framework .NET 4.0<br />
<a href="http://www.shenturk.com/downloads/analogsaatwpf-vs2010-source.rar">Kaynak Kod İndir [72 KB]</a><br />
<a href="http://www.shenturk.com/downloads/analogsaatwpf-vs2010-demo.rar">Demo İndir [38 KB]</a>
</td>
</tr>
<tr>
<td><img src="http://www.shenturk.com/images/vs2008-48x48.png" alt="" /></td>
<td>Microsoft Visual Studio 2008 Framework .NET 3.5<br />
<a href="http://www.shenturk.com/downloads/analogsaatwpf-vs2008-source.rar">Kaynak Kod İndir [71 KB]</a><br />
<a href="http://www.shenturk.com/downloads/analogsaatwpf-vs2008-demo.rar">Demo İndir [38 KB]</a>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.shenturk.com/genel/wpf-ve-c-ile-yeniden-analog-saat-yapalim/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# ile Dijital Saat (Digital Clock)</title>
		<link>http://www.shenturk.com/genel/c-ile-dijital-saat-digital-clock</link>
		<comments>http://www.shenturk.com/genel/c-ile-dijital-saat-digital-clock#comments</comments>
		<pubDate>Wed, 28 Dec 2011 12:50:33 +0000</pubDate>
		<dc:creator>freedelphi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[2008]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[3.5]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[analog]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[clock]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[ders notları]]></category>
		<category><![CDATA[digital]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[gdi+]]></category>
		<category><![CDATA[gdiplus]]></category>
		<category><![CDATA[indir]]></category>
		<category><![CDATA[layered]]></category>
		<category><![CDATA[layeredwindow]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[notlar]]></category>
		<category><![CDATA[örnek]]></category>
		<category><![CDATA[plus]]></category>
		<category><![CDATA[saat]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[updatelayeredwindow]]></category>
		<category><![CDATA[Visual]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[window]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.shenturk.com/?p=1436</guid>
		<description><![CDATA[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ı [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 460px"><img title="C# ile Dijital Saat (Digital Clock)" src="http://www.shenturk.com/images/img0179.png" alt="C# ile Dijital Saat (Digital Clock)" width="441" height="268" /><p class="wp-caption-text">C# ile Dijital Saat (Digital Clock)</p></div>
<p><a href="http://www.shenturk.com/genel/c-ve-analog-clock" title="C# ve Analog Clock">Analog Saat</a> ve <a href="http://www.shenturk.com/genel/doviz-net-c-ile-online-doviz-programi" title="Döviz.NET: C# ile Online Döviz Programı">Döviz.NET</a> projelerinden sonra bir <strong>Dijital Saat</strong> 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 <a href="http://widgets.yahoo.com" title="Yahoo! Widgets" target="_blank">Yahoo! Widgets</a> kütüphanesinde bulunan <strong>Digital Clock</strong> ç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 <strong>Tema</strong> özelliği de ekledim. Eğer ana pencere üzerinde <strong>farenin sağ tuşuna</strong> basarsanız içerik menüsü görüntülenecektir. Ekrandaki <strong>Temalar</strong> menüsünden <strong>4 farklı</strong> 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...</p>
<table>
<tbody>
<tr>
<td><a href="http://www.shenturk.com/downloads/digital-clock-csharp-source.rar"><img src="http://www.shenturk.com/images/img0166.png" alt="" /></a></td>
<td><a href="http://www.shenturk.com/downloads/digital-clock-csharp-source.rar">digital-clock-csharp-source.rar [641 KB]</a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.shenturk.com/genel/c-ile-dijital-saat-digital-clock/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Delphi, GDI+ ve UpdateLayeredWindow</title>
		<link>http://www.shenturk.com/delphi/delphi-gdi-ve-updatelayeredwindow</link>
		<comments>http://www.shenturk.com/delphi/delphi-gdi-ve-updatelayeredwindow#comments</comments>
		<pubDate>Mon, 11 Jul 2011 13:05:52 +0000</pubDate>
		<dc:creator>freedelphi</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[clock]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[gdi+]]></category>
		<category><![CDATA[generic]]></category>
		<category><![CDATA[katmanlı]]></category>
		<category><![CDATA[layered]]></category>
		<category><![CDATA[pencere]]></category>
		<category><![CDATA[saat]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[updatelayeredwindow]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://www.shenturk.com/?p=1039</guid>
		<description><![CDATA[Son günlerde Delphi ve GDI+ ile ilgili oldukça mail almaktayım. Aslında uzun zamandır yazmak istediğim bir yazı bu. Yazının konusu Delphi bilen yazılımcı arkadaşları yakından ilgilendiriyor. Başlıktan da anlaşılacağı üzere Delphi ile GDI+ kullanımı hakkında. Geçen sene bir arkadaşımız bana mail göndermişti. Hava Cıva! kodunun karışık olduğunu söylüyodu. Hava Cıva! gibi bir arayüzün daha basit [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 382px"><img title="Delphi ile Generic Clock" src="http://www.shenturk.com/images/img0162.png" alt="Delphi ile Generic Clock" width="372" height="237" /><p class="wp-caption-text">Delphi ile Generic Clock</p></div>
<p>Son günlerde Delphi ve GDI+ ile ilgili oldukça mail almaktayım. Aslında uzun zamandır yazmak istediğim bir yazı bu. Yazının konusu Delphi bilen yazılımcı arkadaşları yakından ilgilendiriyor. Başlıktan da anlaşılacağı üzere Delphi ile GDI+ kullanımı hakkında. Geçen sene bir arkadaşımız bana mail göndermişti. Hava Cıva! kodunun karışık olduğunu söylüyodu. Hava Cıva! gibi bir arayüzün daha basit bir şekilde nasıl yapılacağını merak etmiş. Bende üşenmedim ona çok basit bir saat programı yazmıştım. Delphi ile temel GDI+ tekniklerinin nasıl kullanılacağını göstermiştim. İşte konumuz bu işlemin nasıl yapılacağını anlatıyor. Eğer Delphi biliyorsanız çok basit bir şekilde Hava Cıva! gibi bir arayüz tasarlayabileceksiniz. Hemen başlayalım...</p>
<p>Projenin adı <strong>Generic Clock</strong>. Adından da anlaşılacağı üzere temel bir saat projesi. Uygulama geliştirme ortamı olarak Delphi 7 kullandım. Ayrıca GDI+ kütüphanesi de gerekli bizim için. Gerçi projenin kaynak kodunda GDI+ kütüphanesi mevcut ama yine de orjinal kütüphaneyi indirmek isteyenler için adresi verelim: <a href="http://www.progdigy.com/" target="_blank">Delphi için GDI+ Kütüphanesi</a></p>
<p><strong>1. TASARIM</strong><br />
Doğal olarak ilk önce ekran tasarımını yapmamız gerekiyor. Bunun için projenin ana formunda bazı değişiklikler yapılmalı. Bunlardan en önemlisi ana formun <strong>BorderStyle</strong> özelliğinin <strong>bsNone</strong> olarak ayarlanması. Neden mi? Widget (yada Gadget) tarzı arayüze sahip uygulamalarda pencerelerin kenarlı olması pek işimize yaramaz. Hatta işimizi daha da zorlaştırır. Bu uygulamada olduğu gibi zemin için bir resim seçeceğiz ve formumuzun zeminini seçtiğimiz resim ile kaplayacağız. Başlıksız ve kenarlıksız bir pencereye resmi uydurmak çok daha kolay olacaktır. Formun başlık bölümü olmadığına göre doğal olarak <strong>Kapat</strong> düğmeside olamıyor. Bu sorunu gidermek için formumuza bir <strong>Kapat</strong> düğmesi eklememiz gerekiyor. Bu düğmeyi ekledikten sonra bir <strong>StaticText</strong> ve bir de <strong>Timer</strong> bileşenin ekliyoruz. Son olarak pek önemli olmayan detaylar var. Örneğin ben ana formun <strong>Position</strong> özelliğini <strong>poScreenCenter</strong> olarak ayarladım. Ekranın ortasından başlasın diye. Diğer bileşenlerin boyutları ve konumları sizin isteğinize bağlı aslında. Ama örneğe sadık kalırsanız karışıklık olmadan anlayabilirsiniz. Tasarım kısmında hepsi bu. Tasarım için örnek bir resim aşağıda görüntüleniyor.</p>
<div class="wp-caption aligncenter" style="width: 423px"><img title="Delphi ile Generic Clock Tasarımı" src="http://www.shenturk.com/images/img0163.png" alt="Delphi ile Generic Clock Tasarımı" width="413" height="305" /><p class="wp-caption-text">Delphi ile Generic Clock Tasarımı</p></div>
<p><strong>2. ALGORITMA</strong><br />
Bu bölümde GDI+ ile Delphi formlarının nasıl ilişkilendirileceğinden bahsedeceğim. İlk öğrenmemiz gereken kısım klasik GDI çizim tekniklerini formumuzda kullanamayacağımızdır. Eğer gölgeli, saydam ve şık bir arayüz istiyorsak GDI tarafından sağlanan araçlar işimizi görmez. En başta GDI' nin renk desteği zayıftır. Oysa GDI+ Alpha channel ile 32-bit renk desteği sağlar. Bu sayede saydam pencereler oluşturabiliriz.<br />
Şimdi aklımızdan kesinlikle çıkarmamız gereken çok önemli bir kısma geldik: <strong>LayeredWindows</strong>! Katmanlı Pencereler olarak çevireceğiz bu terimi. Windows 2000 ile birlikte gelen bir pencere özelliğidir bu. Widget tarzı programların temelini oluşturur. Eğer formumuza katmalı pencere özelliği eklemezsek boşa uğraşmış oluruz. Peki nasıl yapacağız? O kısım oldukça kolay aslında. Formumuzun <strong>FormCreate</strong> olayına aşağıdaki kodu ekleyeceğiz.<br />
<code>SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);</code>Bu kodu ekledikten sonra diğer önemli bir kısımdan bahsetmek gerek. Microsoft MSDN' de belirttiği üzere <strong>"eğer pencereniz katmanlı olarak ayarlandıysa WM_PAINT mesajı oluşturulmaz!"</strong> MSDN' de bu yazıyı okuduktan sonra ne yapacağımı şaşırmıştım açıkçası. Windows'ta WM_PAINT mesajı oluşmuyorsa Delphi' de <strong>OnPaint</strong> olayı da oluşmaz! Bu karmaşayı aşmak için yine Windows API' den faydalanmamız gerekecek. Çözüm için <strong>UpdateLayeredWindow</strong> fonksiyonunu kullanacağız. Bu fonksiyon oldukça karışıktır. Benden söylemesi. Detaylı açıklamayı MSDN' den mutlaka okuyunuz (<a href="http://msdn.microsoft.com/en-us/library/ms633556(VS.85).aspx" target="_blank">MSDN: UpdateLayeredWindow</a>). Ben bu fonksiyonun nasıl kullanılacağını kaynak kod içinde gösterdim. <strong>UpdateLayeredForm</strong> yordamına bakmanız yeterlidir.<br />
<code>procedure TForm1.UpdateLayeredForm;<br />
var<br />
SrcDC, DestDC: HDC;<br />
BitmapHandle, PrevBitmap: HBITMAP;<br />
BlendFunc: _BLENDFUNCTION;<br />
Size: TSize;<br />
P, S: TPoint;<br />
begin<br />
{ Desktop ile uyumlu bir DC olustur. (Yada 0 yerine GetDesktopWindow yazabiliriz) }<br />
SrcDC := CreateCompatibleDC(0);<br />
{ Olusturdugumuz DC ile uyumlu yeni bir DC daha olusturmaliyiz. Kopyalama icin. }<br />
DestDC := CreateCompatibleDC(SrcDC);<br />
{ Cizim yaptigimiz resmin Windows tarafidan anlasilan HBITMAP turunden degiskene ata. }<br />
{ Bu kisim onemli. Cizim yaptigimiz resmi gercek dunyaya getiriyoruz. }<br />
{ BitmapHandle degiskeni artik Windows tarafindan kullanilanilabilir duruma geldi. }<br />
FBitmap.GetHBITMAP(0, BitmapHandle); { 0 = Background transparent, out BitmapHandle }<br />
{ SrcDC de bitmap secilmeli }<br />
PrevBitmap := SelectObject(SrcDC, BitmapHandle);<br />
{ Boyutlar ve konum }<br />
Size.cx := Width;<br />
Size.cy := Height;<br />
P := Point(Left, Top);<br />
S := Point(0, 0);<br />
with BlendFunc do<br />
begin<br />
BlendOp := AC_SRC_OVER;<br />
BlendFlags := 0; { Sifir olmali }<br />
SourceConstantAlpha := FOpacity; { Ana formun donukluk degeri. 0 = tam saydam, 255 = tam donuk. }<br />
AlphaFormat := AC_SRC_ALPHA;<br />
end;<br />
{ Microsoft'un sihirli fonksiyonu! Oylesine onemli ki, aslinda butun kiyamet burada kopuyor. }<br />
{ Detayli aciklamayi MSDN' den mutlaka okuyunuz. http://msdn.microsoft.com/en-us/library/ms633556(VS.85).aspx }<br />
UpdateLayeredWindow(Handle, DestDC, @P, @Size, SrcDC, @S, 0, @BlendFunc, ULW_ALPHA);<br />
{ SrcDC yi eski haline getir. }<br />
SelectObject(SrcDC, PrevBitmap);<br />
{ ve Bitmap'i yok et. Yoksa hafiza sizmasi olur. }<br />
DeleteObject(BitmapHandle);<br />
{ DC leri yok et. }<br />
DeleteDC(DestDC);<br />
DeleteDC(SrcDC);<br />
end;</code>Karmaşa hala devam ediyor... Madem windows bizim için WM_PAINT olayını oluşturmuyor o zaman bizim elle bu olayı tetiklememiz gerekiyor! Kendinizi resim yapıyor gibi düşünün. Önce zemini çizeceğiz sonra diğer bileşenleri vs. Böylelikle oluşan resmi formumuzda göstereceğiz. Mantık basit: Resmi çiz (RepaintForm) ve ekranda güncelle (UpdateLayeredForm).<br />
Örneğin bu projede saati saniye saniye ekranda göstermemiz gerekiyor. Bu durumda her saniye form alanını güncellemeliyiz. Bunun için Timer bileşeninden faydalanacağız.<br />
<code>procedure TForm1.Timer1Timer(Sender: TObject);<br />
begin<br />
{ Her saniye form alanini yeniden cizmek zorundayiz. }<br />
RepaintForm;<br />
{ Ayrica cizdigimiz form alanini guncellemeliyiz. }<br />
UpdateLayeredForm;<br />
end;</code></p>
<p>Bu proje hakkında yazacaklarım şimdilik bu kadar. Widget tarzı programlarda can alıcı noktaları açıklamaya çalıştım. Projenin kaynak kodunu aşağıdaki linkten indirebilirsiniz.</p>
<table>
<tbody>
<tr>
<td><a href="http://www.shenturk.com/downloads/generic-clock-source.rar"><img src="http://www.shenturk.com/images/img0164.png" alt="" /></a></td>
<td><a href="http://www.shenturk.com/downloads/generic-clock-source.rar">generic-clock-source.rar [290 KB]</a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.shenturk.com/delphi/delphi-gdi-ve-updatelayeredwindow/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

