| 
                
             | 
        
        
            
                
                    
                        | 
                            Windows XP Stillerinin Kontrollere Uyarlanması | 
                        
                             | 
                                
                     
                    
                        
                            
	
    
		
            | Gönderiliyor lütfen bekleyin... |   
        
	 
    
 
                         | 
                     
                 
             | 
        
        
            
                
                
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 ([email protected])
  
                
                Makale: 
                Windows XP Stillerinin Kontrollere Uyarlanması C#, Visual C# ve .NET Serdar Dirican 
             | 
        
        
            | 
             | 
        
        
            | 
                 
             | 
        
        
            
                
                
                    
                        - 
                            
                        
 
                        - 
                            
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
                         
                     
                 
                
                
             | 
        
        
            | 
                
             |