You are on page 1of 6

Hereyden nce bu isteimizi gerekletirmek iin isteimizi uygulayacamz bir snfa sahip olmamz gerekir.

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

designtimesp=" override void OnPaint(PaintEventArgs e) {

<SPANSTYLE16749" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" Rectangle rect = ClientRectangle; <SPANSTYLE16753" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect.Width-=6; <SPANSTYLE16757" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect.Height-=6; <SPANSTYLE16761" ?? 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

designtimesp=" rect=new Rectangle(new


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

<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

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

<SPANSTYLE16859" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" || Environment.OSVersion.Version.Major < 5 <SPANSTYLE16863" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" || Environment.OSVersion.Version.Minor < 1) <SPANSTYLE16867" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" return <SPANSTYLE='COLOR:BLUE'false; <SPANSTYLE16873" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER

designtimesp=" <SPANSTYLE16876" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" return <SPANSTYLE='COLOR:BLUE'true;


} Yukardaki fonksiyonda yaplan kullanlan iletim sisteminin version numaralarna bakarak Windows XP olup almadn anlamaktr. Eer deilse

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

sonra snfmzn OnPaint metodunda bo braktmz else ifadesini dolduralm.

<SPANSTYLE16974" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONTFAMILY:'COURIER

designtimesp="if<SPANSTYLE16975" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER

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

<SPANSTYLE16994" ?? New="FONT-SIZE:9PT;COLOR:BLUE;FONTFAMILY:'COURIER

designtimesp="private<SPANSTYLE16995" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER

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

<SPANSTYLE17008" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER

designtimesp=" <SPANSTYLE17011" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" int Count = ((rc.Width)/(segwidth+2))+((rc.Width<=0)?


0:1);

<SPANSTYLE17016" ?? New="FONT-SIZE:9PT;FONTFAMILY:'COURIER

designtimesp="

<SPANSTYLE17019" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" Rectangle rect = new


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

<SPANSTYLE17024" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

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

<SPANSTYLE17033" ?? New="FONT-SIZE:9PT;FONT-FAMILY:'COURIER

designtimesp=" rect.Width = rc.Width; <SPANSTYLE17038" ?? 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.

You might also like