Professional Documents
Culture Documents
Windows XP Stillerinin Kontrollere Uyarlanması
Windows XP Stillerinin Kontrollere Uyarlanması
Ne yazk ki standart ProgressBar snf sealed olduu iin ben snfm Control snfndan trettim: public class XPProgressBar:Control { } Daha sonra yapmamz gereken standart ProgressBar zelliklerini (Maximum, Minimum, Value, Step) zelliklerini snfmza uygulamaktr. Bu zelliklerin hepsi integerdir. Kolay olduu iin bu ksm geiyorum. Dikkat edilmesi gereken nokta Value zelliine bir deer geerken snf rneimizin yeniden boyanmasn salamaktr. Bunu da Refresh() fonksiyonu ile yapabiliriz. Uygulamamzn amac XP sitillerinin uygulanmas olduu iin Style isminde bir zellik tantrz. Bu zellik Normal ve System isimlerinde iki enum deeri tutar. Eer zelliimizin deeri System ise XP sitili uygulanr. public Styles Style { get {<return FStyle;} set { FStyle=value; Refresh(); } } imdi snfmzn boyanmas iin OnPaint metoduna geebiliriz. lknce Normal deerini grelim.
<SPANSTYLE16739" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONTFAMILY:'COURIER
designtimesp="protected<SPANSTYLE16740" ?? New="FONTSIZE:9PT;FONT-FAMILY:'COURIER
<SPANSTYLE16749" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
designtimesp=" if(Maximum!=Minimum)
{ rect.Width =(Value-Minimum)*100/(Maximum-Minimum)*rect.Width/100; }
<SPANSTYLE16778" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
designtimesp=" if(Style==Styles.Normal)
{ ControlPaint.DrawBorder3D(e.Graphics,ClientRectangle,Border3DStyle.Sunk en);
<SPANSTYLE16794" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
<SPANSTYLE16800" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
designtimesp=" e.Graphics.FillRectangle(Brushes.Blue,rect);
} else { //Burada Styles.System deerini uygulayacaz. } }
Yukardaki kodda yaplan Maximum ve Minimum deerlerine gre boyanacak alann bulunup daha sonra boyanmasdr. Dikkat edeceiniz gibi segment eklinde deil de dz boya eklinde boyanmtr. Eer isterseniz bu aamada bileenimizi test edebilirsiniz. Dikkat edeceiniz gibi standart bir ProgressBarn yapaca ilemleri gerekletirdik. imdi asl amacmz XP sitillerinin uygulanmas olduuna
gre bu aamaya geelim. ncelikle kullandmz iletim sisteminin yapacamz bu ilemi desteklemesi iin Windows XP olmas lazm. Bunu nasl anlayacamz grelim:
<SPANSTYLE16846" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONTFAMILY:'COURIER
designtimesp="bool<SPANSTYLE16847" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER
<SPANSTYLE16859" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
program XP sitillerinin kullanmna izin vermeyecektir. imdi burada bir ara verip XP sitillerinin kullanmna olanak veren WinApi leri tantmak istiyorum. ncelikle kullanacamz dll UxTheme.dll dir. Bizim bu programda kullanacamz 4 tane WinApi fonksiyonu var. imdi bunlar tanyalm: HTHEME OpenThemeData( HWND hwnd,LPCWSTR pszClassList); Bu fonksiyon bir window iin ilgili snfn datasn aar. Dn deeri IntPtr dir. pszClassList parametresi ise kullanacamz snfn string deeridir. Bizim rneimizde bu deer "PROGRESS" dir. BOOL IsAppThemed(VOID); Bu Api bir kontrol fonksiyonudur. uygulamamzn visual sitilleri uygulayp uygulamayacan sorgular. BOOL IsThemeActive(VOID); Bu da baka bir kontrol fonksiyonudur. Visual sitillerin uygulamamz iin aktif olup olmadn denetler. HRESULT DrawThemeBackground( HTHEME hTheme, <SPANSTYLE='FONT-SIZE:12PT' HDC hdc, <SPANSTYLE='FONT-SIZE:12PT' int iPartId, <SPANSTYLE='FONT-SIZE:12PT' int iStateId, <SPANSTYLE='FONT-SIZE:12PT' const RECT *pRect, <SPANSTYLE='FONT-SIZE:12PT' const RECT *pClipRect <SPANSTYLE='FONT-SIZE:12PT'); Uygulamamzn belki de en can alc Api si budur. Bu fonksiyonla visual sitillerin izim ilemini gerekletiriyoruz. Dn deeri integer dir. Parametrelerine gelince: hTheme: OpenThemeData fonksiyonu ile elde ettiimiz IntPtr deerini kullanacaz. hdc: Controlmzn hdc deeri. <SPANSTYLE16960" ?? New="FONTSIZE:10PT;FONT-FAMILY:'COURIER designtimesp="CreateGraphics().GetHdc() ile elde edilir. iPartId ve iStateId: Bu parametreler izeceimiz kontroln blmlerini ifade eder. Visual Studio nun yardm indeksi blmne Parts and States yazarsak konuyla ilgili dkman bulabiliriz. Bu durumda Controlmzn arkaplann izeceksek iPartId 1 deerini, eer ndeki ilerleme blmn izeceksek 3 deerini almaldr. StateId deeri ise ProgressBar iin kullanlmaz. Eer dkman iyice incelersek yapacamz dier uygulamalarda XP sitillerini nasl uygulayacamz kolaylkla anlalr. pRect ve pClipRect: <SPANSTYLE='MSO-SPACERUN:YES' Bu parametreler <SPANSTYLE='MSO-SPACERUN:YES' izeceimiz drtgen blm ifade eder. ClipRect null deerini alabilir. imdi programmza geri dnp anlattmz Api lerin kullanmna geebiliriz. ncelikle snfmzn yapcsnda <SPANSTYLE='MSO-SPACERUN:YES' OpenThemeData apisini kullanarak XP sitilimizin deerini tutabilirz. Daha
<SPANSTYLE16974" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONTFAMILY:'COURIER
designtimesp="if<SPANSTYLE16975" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER
<SPANSTYLE16994" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONTFAMILY:'COURIER
designtimesp="private<SPANSTYLE16995" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER
<SPANSTYLE17008" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER
<SPANSTYLE17016" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER
designtimesp="
<SPANSTYLE17019" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
<SPANSTYLE17024" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
designtimesp=" if (rect.Width>(Width-2*3))
{
<SPANSTYLE17033" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER
designtimesp=" }
DrawThemeBackground(g,3,1,rect); } ncelikle kontrolmzn arka plann izdik. Daha sonra DrawSystemSegments fonksiyonu ile segmentleri hesaplayp sonra da bunu izdirdik.