C#nedir?com
 
YAZAR HAKKINDA
Serdar Dirican
Serdar Dirican
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
1 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Serdar Dirican
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 19.12.2003
Okunma Sayısı : 14595
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
Conda install environment.yml Package 23.2.2020
Turhal Temizer 'in Blogu
Mac OS/X Removing CUDA 23.2.2020
Burak Selim Şenyurt
Sekiz Saatlik Sonsuz Döngü 23.2.2020
Burak Selim Şenyurt
Switch Case Kullanmadan Kod Yazılabilir mi? 23.2.2020
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows XP Stillerinin Kontrollere Uyarlanması
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Merhaba, bu makalede Windows XP sitillerinin form kontrollerine herhangi bir Manifest dosyası olmadan uygulanmasını tartışacağız. Ben uygulama örneği olarak bir ProgressBar kontrolünü seçtim. Çalıştırılabilir örnek kod bu siteden indirilebilir.



Herşeyden önce bu isteğimizi gerçekleştirmek için isteğimizi uygulayacağımız bir sınıfa sahip olmamız gerekir. Ne yazık ki standart ProgressBar sınıfı “sealed” olduğu için ben sınıfımı Control sınıfından türettim:

public class XPProgressBar:Control
{
}



Daha sonra yapmamız gereken standart ProgressBar özelliklerini (Maximum, Minimum, Value, Step) özelliklerini sınıfımıza uygulamaktır. Bu özelliklerin hepsi integer’dir. Kolay olduğu için bu kısmı geçiyorum. Dikkat  edilmesi gereken nokta Value özelliğine bir değer geçerken sınıf örneğimizin yeniden boyanmasını sağlamaktır. Bunu da Refresh() fonksiyonu ile yapabiliriz. Uygulamamızın amacı XP sitillerinin uygulanması olduğu için Style isminde bir özellik tanıtırız. Bu özellik Normal ve System isimlerinde iki enum değeri tutar. Eğer özelliğimizin değeri System ise XP sitili uygulanır.

public Styles Style
{
     get {     set
     {
          FStyle=value;
          Refresh();
     }
}



Şimdi sınıfımızın boyanması için OnPaint metoduna geçebiliriz. İlkönce Normal değerini görelim.



protected override void OnPaint(PaintEventArgs e)
{

     Rectangle rect = ClientRectangle;

     rect.Width-=6;

     rect.Height-=6;

     if(Maximum!=Minimum)
     {
          rect.Width =(Value-Minimum)*100/(Maximum-Minimum)*rect.Width/100;
     }

     if(Style==Styles.Normal)
     {
          ControlPaint.DrawBorder3D(e.Graphics,ClientRectangle,Border3DStyle.Sunken);

          rect=new Rectangle(new Point(rect.X+3,rect.Y+3),rect.Size);

          e.Graphics.FillRectangle(Brushes.Blue,rect);
     }
     else
     {
          //Burada Styles.System değerini uygulayacağız.
     }
}



Yukarıdaki kodda yapılan Maximum ve Minimum değerlerine göre boyanacak alanın bulunup daha sonra boyanmasıdır. Dikkat edeceğiniz gibi segment şeklinde değil de düz boya şeklinde boyanmıştır. Eğer isterseniz bu aşamada bileşenimizi test edebilirsiniz.



Dikkat edeceğiniz gibi standart bir ProgressBar’ın yapacağı işlemleri gerçekleştirdik. Şimdi asıl amacımız XP sitillerinin uygulanması olduğuna göre bu aşamaya geçelim.



Öncelikle kullandığımız işletim sisteminin yapacağımız bu işlemi desteklemesi için Windows XP olması lazım. Bunu nasıl anlayacağımızı görelim:



bool IsThemedos()
{
     if(Environment.OSVersion.Platform != PlatformID.Win32NT

          || Environment.OSVersion.Version.Major < 5

           || Environment.OSVersion.Version.Minor < 1)

     return false;



     return true;
}



Yukarıdaki fonksiyonda yapılan kullanılan işletim sisteminin version numaralarına bakarak Windows XP olup almadığını anlamaktır. Eğer değilse program XP sitillerinin kullanımına izin vermeyecektir.



Şimdi burada bir ara verip XP sitillerinin kullanımına olanak veren WinApi leri tanıtmak istiyorum. Öncelikle kullanacağımız dll “UxTheme.dll” dir. Bizim bu programda kullanacağımız 4 tane WinApi fonksiyonu var. Şimdi bunları tanıyalım:



HTHEME OpenThemeData( HWND hwnd,LPCWSTR pszClassList);

Bu fonksiyon bir window için ilgili sınıfın datasını açar. Dönüş değeri IntPtr dir. “pszClassList” parametresi ise kullanacağımız sınıfın string değeridir. Bizim örneğimizde bu değer "PROGRESS" dir.



BOOL IsAppThemed(VOID);

Bu Api bir kontrol fonksiyonudur. uygulamamızın visual sitilleri uygulayıp uygulamayacağını sorgular.



BOOL IsThemeActive(VOID);

Bu da başka bir kontrol fonksiyonudur. Visual sitillerin uygulamamız için aktif olup olmadığını denetler.



HRESULT DrawThemeBackground(      
    HTHEME hTheme,
    HDC hdc,    int iPartId,    int iStateId,    const RECT *pRect,    const RECT *pClipRect);

Uygulamamızın belki de en can alıcı Api si budur. Bu fonksiyonla visual sitillerin çizim işlemini gerçekleştiriyoruz. Dönüş değeri integer dir. Parametrelerine gelince:

hTheme: OpenThemeData fonksiyonu ile elde ettiğimiz IntPtr değerini kullanacağız.

hdc: Controlümüzün hdc değeri. CreateGraphics().GetHdc() ile elde edilir.

iPartId ve iStateId: Bu parametreler çizeceğimiz kontrolün bölümlerini ifade eder. Visual Studio nun yardım indeksi bölümüne “Parts and States” yazarsak konuyla ilgili dökümanı bulabiliriz. Bu durumda Controlümüzün arkaplanını çizeceksek iPartId 1 değerini, eğer öndeki ilerleme bölümünü çizeceksek 3 değerini almalıdır. StateId değeri ise ProgressBar için kullanılmaz. Eğer dökümanı iyice incelersek yapacağımız diğer uygulamalarda XP sitillerini nasıl uygulayacağımız kolaylıkla anlaşılır.

pRect ve pClipRect:  Bu parametreler  çizeceğimiz dörtgen bölümü ifade eder. ClipRect “null” değerini alabilir.



Şimdi programımıza geri dönüp anlattığımız Api lerin kullanımına geçebiliriz. Öncelikle sınıfımızın yapıcısında  OpenThemeData apisini kullanarak XP sitilimizin değerini tutabilirz. Daha sonra sınıfımızın OnPaint metodunda boş bıraktığımız “else” ifadesini dolduralım.



if(IsThemedos() && IsAppThemed() && IsThemeActive())
{
     DrawThemeBackground(e.Graphics,1,1,ClientRectangle);
     DrawSystemSegments(e.Graphics,rect);
}

private void DrawSystemSegments(Graphics g, Rectangle rc)
{
     int segwidth = 8;



     int Count = ((rc.Width)/(segwidth+2))+((rc.Width<=0)?0:1);



     Rectangle rect = new Rectangle(3,3,Count*(segwidth+2),rc.Height);

     if (rect.Width>(Width-2*3))
     {

          rect.Width  = rc.Width;

     }

     DrawThemeBackground(g,3,1,rect);
}



Öncelikle kontrolümüzün arka planını çizdik. Daha sonra DrawSystemSegments fonksiyonu ile segmentleri hesaplayıp sonra da bunu çizdirdik.



Bu konu hakkında anlatacaklarım bitti. Eğer örnek kod incelenirse anlaşılmayan bölümlerin anlaşılmasına yardımcı olacaktır. Hepinize iyi çalışmalar.

Not : XP stilindeki kontrolleri görmeniz için işletim sisteminizin temasını XP Stil olarak değiştirmeniz gerekmektedir.

Kaynak Kodları indirmek için tıklayınız.



Serdar Dirican (serdardirican@hotmail.com)

Makale:
Windows XP Stillerinin Kontrollere Uyarlanması C#, Visual C# ve .NET Serdar Dirican
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor