|
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
|
|