Bu site emekli olmuştur. Arşiv amaçlı olarak
BT AKADEMİ
sponsorluğunda yayın hayatına devam etmektedir.
Ana Sayfa
.net TV
Makaleler
Kaynak Kod
Haberler
Serbest Köşe
Canlı Köşe
Forum
C#nedir?
Ekibimiz
RSS
ADO.NET/SQL
C / Sys Prog.
Genel
Mono ve .NET
Silverlight
XML / Web Serv.
X86 Assembly
C++ / C++.NET
J#.NET / Java
.NET 3.x
UML / Analiz
Yazılım Müh.
ASP.NET
C# / VC#/.NET
Mobil Prog.
PHP 5
YAZAR HAKKINDA
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ı
:
23528
Yorum Sayısı
:
0
yorum yaz
SİTE İÇİ ARAMA
Ü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.
C#nedir? hesabınız yok mu?
Üye olabilmek için
tıklayın
.
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.
Silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
Bende Yazmak İstiyorum
Blogroll
Burak Selim Şenyurt
Bellek Yönetiminde Verimlilik için İpuçları (Rust Odaklı)
18.5.2025
Burak Selim Şenyurt
Rust ve Güvenli Bellek Yönetimi Hakkında
18.5.2025
Diğer Herşey
»
Makaleler RSS
»
Video Gönder
»
Makale Gönder
»
Serbest Köşeye Yazı Gönder
»
Yazar Başvurusu
»
C#nedir? Ekibinde Olmalıyım!
Sponsorlar
Ana Sayfa
/
Makaleler
/
C# / VC#/.NET
/
Windows XP Stillerinin Kontrollere Uyarlanması
Windows XP Stillerinin Kontrollere Uyarlanması
Favorilerime Ekle
Gönderiliyor lütfen bekleyin...
arkadaşıma gönder
Arkadaşınızın email adresi:
*
Mesajınız:
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
Dizayn ve Kodlama
bt
akademi
. Tüm Hakları Saklıdır © Copyright 2002-2009 c#nedir?com
Makaleler
Serbest Köşe
Makale Gönder
.Net TV
Video Gönder
Canlı Köşe
Kaynak Kod
Forum
Haberler
Röportajlar
Anketler
C# Nedir?
İletişim
Site Haritası
RSS
Favorilere Ekle
Üyelik
Hesap Aktivasyon
Ekibimiz
Ekibe Katıl