This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

20 Kasım 2014 Perşembe

Visual Basic.Net Formda Müzik Çalmak

Merhaba Arkadaşlar Bu Konumuzda Formumuzda İstediğimiz Zaman Ve İstediğimiz Kadar Müzik Çaldırabileceğimizi Göreceğiz. Bunun İçin Kullanacağımız Kod ;

    My.Computer.Audio.Play(My.Resources.Müzik adı, AudioPlaymode.Background)

AudioPlaymode.Background = Bir Kez Çalar Ve Durur.

  AudioPlaymode.Backgroundloop = Sürekli Tekrar Eder Yani Program Kapanana Kadar Çalar.

  AudioPlayMode.WaitToComplate = Bu Kodumuz İse Müzik Çalmaya Başlar Taki Müzik Bitene Kadar Kullanıcı Programı Göremez :)

  My.Resources.Müzik Adı = Müziğimizi Resources Ekledikten sonraki Müziğimizin Adı . Keyifli Çalışmalar Kolay Gelsin.

Facebook Şikayet Botu V.2

Selamun Aleyküm Arkadaşlar Sanırım Beklenen Program Ar-Ge Farkıyla Geldi ;) Programın Tanıtım Videosundan Önce Bilgilendirmek İsterim Şikayet Ettikten Sonra Geri Sayım Bitmeden Programı Kapatmayın . Aksi Taktirde Linkleriniz Kırılır. http://dosya.co/faeft4js6w3i/Facebook_Şikayet_Botu_V.2.exe.html

14 Kasım 2014 Cuma

Ağ Güvenliği

AĞ GÜVENLİĞİ 

1. GİRİŞ 

Bilgisayar sistemlerinde en genel anlamda sızma ya da saldırı makine başından yapılacak izinsiz erişimlerden başlar ve çok geniş bir spektruma yayılır. Bilgisayar ağları söz konusu olduğunda ise saldırılar sadece bu tip kullanıcı ve erişim temelli saldırılar ile sınırlı kalmaz. Ağ üzerinden yapılan saldırılar günümüzde en sık karşılaşılan problemlerdir. Bu çalışma ağ üzerinden yapılan saldırıları ve onlara karşı geliştirilen saldırı tespit mekanizmalarını incelemeyi hedeflemektedir. Bu tip saldırılar 4 temel kategoride incelenebilirler. 1) Bilgi Tarama (Probe ya da scan): Bu saldırılar bir sunucunun ya da herhangi makinanın, geçerli ip adreslerini, aktif portlarını veya işletim sistemini öğrenmek için yapılan saldırılardır. Bilinen saldırılardan bunlara örnek olarak: a. ipsweep: belirli bir protu sürekli tarama saldırısı. b. Portsweep: bir sunucu üzerindeki hizmetleri bulmak için tüm portları tarar. verilebilir. 2) Hizmet Engelleme (Denial of Service - DoS): Bu saldırılar genelde TCP/IP protokol yapısındaki açıklardan faydalanarak veya bir sunucuya çok sayıda istek yönelterek onu tıkamaya sebep olan saldırılardır. DoS saldırıları kendi içinde gruplara ayrılır [18]. DoS Şekil 1. DoS saldırı tipleri Protokol hatalarına dayalı saldırılara örnek olarak ping-of-death (ölümüne ping) saldırısı yani bir tek büyük boyutlu ICMP eko mesajı gönderilmesi saldırısı vardır. Başka bir saldırı, TCP SYN paketinin içersine kaynak ve varış adresi aynı makine olan bir paket gönderilmesiyle olur. Bunlar tek paketle ya da az paketle gerçekleştirilen, protokollerin açıklarını kullanan saldırılardır. Diğer gruptaki saldırılar devamlı istekte bulunulmasına dayanır. Hem sunucu makine hem de ağ meşgul edilir. Örneğin bu, bir sunucuya devamlı bağlantı isteği yapmak olabilir. Saldırı tek bir makine kaynaklı olabileceği gibi ağ üzerinden ele geçirilen birçok makine ile de yapılabilir. Bu tip makinelere zombi denir. Eğer zombi kullanılmıyorsa yansıtıcı da kullanılabilir. Yansıtıcı herhangi bir sunucu Protokol hatalarına dayalı Devamlı paket göndermeye dayalı Çok kaynak kullanarak Tek kaynak kullanarak Zombi kullanarak Yansıtıcı kullanarak 3 olabilir. Saldırgan kurbanın adresi ile sorgu yapar ve dolayısıyla sunucu farkında olmadan kurbanın adresine cevaplar gönderir. Özel olarak kullanılan saldırlardan bazıları: a. Smurf: ICMP mesajlarının broadcast ile tüm ağa dağıtılmasıyla oluşur. b. Selfping: kullanıcının makinayı sürekli pinglemesiyle gerçekleşir. c. tcpreset: saldırgan kurbanın kurmaya çalıştığı bağlantılar için kurban adına reset göndererek bağlantısını engeller. d. mailbomb:saldırgan sunucuya sürekli mail gönderir. 3) Yönetici Hesabı ile Yerel Oturum Açma (Remote to Local - R2L): Kullanıcı haklarına sahip olunmadığı durumda misafir ya da başka bir kullanıcı olarak izinsiz erişim yapılmasıdır. Bunlara örnek: a. Sshtrojan: unix üzerinde çalşına bir trojan saldırısıdır. b. guest: tahmini kolay şifreleri bularak sisteme girilmesidir. 4) Kullanıcı Hesabının Yönetici Hesabına Yükseltilmesi (User to root - U2R): Bu tip saldırılarda sisteme girme izni olan fakat yönetici olmayan bir kullanıcının yönetici izni gerektirecek işler yapmaya çalışmasıdır. Örnekleri: a. Eject: Solaris üzerinde eject programı ile tampon taşmasına yol açıp, yönetici haklarına sahip olunmasıdır. b. Sqlattack: sql veritabanı kurulu Linux makinalarda sunucuya bağlanan kullanıcının belirli komutlarla yönetici hakları ile komut satırı elde etmesidir. Bu çalışma çerçevesinde tüm bu saldırıları yakalamaya odaklanan saldırı tespit sistemlerinin yapıları, kullandıkları tespit yöntemleri genel olarak tanıtılacaktır. Fakat özelde odaklanılacak konu bir kullanıcının hakkı olmadan sisteme giriş yapmak istemesi veya sisteme girmeye hakkı olup da bazı işlemlere izni olmayan kullanıcının bu izinleri aşmaya çalışması gibi saldırılar olmayacaktır. Genel tanımlar verildikten sonra daha çok ağ üzerinden yapılan saldırı tespitine yönelik çalışmalara odaklanacağız. Ağ trafiğini esas alarak, burada oluşan anormallikleri gözlemleyerek, saldıryı belirlemek mümkündür. Bu tip modellere ağ aktivitesi modelleri (Network activity models) adı verilir ve ağdaki trafik yoğunluğu üzerinden saldırı tespitine odaklanırlar. Bu durumda tespit edilebilecek saldırılar yukarda sıralanan saldırılardan 3. ve 4. maddelere giren ve en yaygın saldırılardan olan DoS ve tarama (probe) saldırıları olacaktır. Bu tipteki saldırıların ne kadar önemli olduğu 2002 yılında yapılan bir çalışmada gösterilmiştir. Burada internet üzerindeki 1600 ağdan toplanmış verilerin analizi yapılmıştır [1]. İnternet üzerinde hergün 25000 civarında saldırı gerçekleştiği saptanmıştır. Bu çalışmadan alınan aşağıdaki grafikte sadece yoklama (probe/scan) saldırısı göz önüne alındığında Mayıs-Temmuz ayları arasındaki kapı numaralarına karşı düşen saldırı yoğunluğu verilmiştir. Tek bir saldırı tipi için verilen Şekil 2, durumun ne kadar ciddi boyutlarda olduğunu göstermektedir. Bundan başka sadece 1999 yıllında NASA, NATO, Beyaz saray, Pentagon gibi merkezlere yapılan ve başarı sağlanan saldırıların sayısı 10’u geçmektedir [17]. 4 Şekil 2. Mayıs-Temmuz 2002 arasında 10 kapı numarasına yapılan saldırı yoğunluğu [1]. 1980’lerde sadece bilgisayar sistemleri uzmanları tarafından yapılan saldırılar artık otomatikleşmiş saldırı araçları ile çok daha hızlı sürede yapılmaktadır. CERT (Computer Emergency Readiness Team) tarafından 2000 yılında yayınlanan bir rapordan alınan değerler Şekil 3’te gösterilmiştir. Saldırı sayılarındaki artışın boyutları daha o senelerden çok ciddi boyutlara ulaşmış ve giderek elektronik ticaret uygulmalarının da artmasıyla fazlaca maddi kayıba yol açmaya başlamıştır. Şekil 3 CERT’e raporlanan saldırı sayısı [17]. Şekil 4’te ise saldırgan davranışlarındaki değişim ve saldırı tiplerinin yıldan yıla değişimi verilmiştir [17]. 5 Şekil 4 1980-1999 arası saldırı tiplerindeki ve saldırgan profillerindeki değişiklikler [17]. Saldırı tanımını yaptıktan sonra Saldırı Tespit Sistemi (STS) tanımını yapmak gerekir. Saldırı tespitinde kullanılan sistemlere STS denir. Her ne kadar bir STS’nin hedefi DoS, tarama, U2R, R2L saldırılarını yakalamak olsa da bu pratikte pek mümkün olmamıştır. Ticari, devlet tarafından geliştirilen ve araştırmacılar tarafından geliştirilen bir çok STS mevcuttur. Sayıları çok fazla olduğundan çeşitli sınıflandırmalara göre incelemek yerinde olacaktır. STS’ler değişik yaklaşımlar ile sınıflandırılabilirler. Bunlar sistemin gerçek zamanlı olup olmaması, dağıtık mimaride olup olmaması, ağ veya sunucu tabanlı olması ve kullandığı analiz yöntemlerine göre dört adet sınıflandırmayı içerir. Bu çalışmada ilk iki sınıflandırma üzerinde fazlaca durmayacağız. Kendi gerçekleyeceğimiz basit analiz için gerçek zamanlı ve dağıtık olmayan, ağ tabanlı bir yapı ve anormallik tespit yöntemleri kullanılacağı için bunlar üzerinde daha fazla duracağız. Bu sınıflandırmalara daynarak gruplanan ticari ve akademik STS’lerin kısaca tanıtılmasının ardından iyi bir STS’de olması gereken özellikleri Bölüm 3’te vereceğiz. Saldırılara karşı verilebilecek tepkileri Bölüm 4’te inceledikten sonra Bölüm 5’te birçok çalışmada kullanılan DARPA saldırı tespit test veri setlerini tanıtacağız. Daha sonra 6. Bölümde kendi analizimizde örnek alabileceğimiz yakın tarihli çalışmalar hakkında detaylı bilgi vereceğiz. Burada çalışmamızın yakından ilgili olduğu anormallik tespinde istatistiksel yaklaşımları kullanan makale ve bildirileri inceleyeceğiz. Son olarak da Bölüm 7’de bu ders kapsamında gerçeklemeye çalıştığımız kendi uygulamamız hakkında bilgi vereceğiz.


2. STS’LERİN SINIFLANDIRILMASI 


2.1 Veri İşleme Zamanına Göre: Burada STS’ler “gerçek zamanlı” ve “gerçek zamanlı olmayan” şeklinde ikiye ayrılırlar. Gerçek zamalı olmayan sistemlerde veri önce depolanır, sonra analiz için ilgili STS’ye gönderilir. Gerçek zamanlı sistemlerde veri o anda analiz edilir. Bu tip STS’ler yoğun bilgi akışı olan ağlarda uygulanması zor olan ama aktif olarak cevap üretilmesi gereken durumlarda da tek çözüm olan sistemlerdir. Ticari uygulamaların gerçek zamanlı olması tercih edilir. Biz daha kolay olması açısından biz kendi çalışmamızda depolanmış veriler üzerinde analiz yapacağız. 2.2 Mimari Yapıya Göre: STS’ler ağ üzerinden birçok noktadan veri toplayıp bir merkezde işleyebilirler. Bu tip mimarilere sahip STS’lere dağıtık STS denir. Bunun karşısında ağ üzerinden tek bir yerden 6 veri toplayan STS’ler vardır. Bilinen STS’lerin çoğu bu kategoriye girer. Bizim hedeflediğimiz sistemde tek bir yerden veri toplanıp işlenmesi durumunu göz önüne almaktadır. Bunun için İnternet üzerinden aldığımız DARPA veri setlerine ait bir adet ağ dinleyicisi (sniffer) dosyasını kullanacağız (tcpdump.inside[19]). 2.3. Bilgi Kaynaklarına Göre: STS’ler bilgi kaynaklarına göre 2’ye ayrılılar. Ağ temelli STS’ler ve sunucu-temelli STS’ler. Sunucu temelli STS’lerin özel bir hali olarak uygulama temelli STS’ler de mevcuttur. Ağ-Temelli STS’ler Bu STS’lerin temel amacı ağ üzerinden yapılan saldırıları ağ trafiğini gözetleyerek tespit etmektir. Ağ paketlerini yakalayıp bunları analiz ederek saldırı tespiti yaparlar. Son yıllarda geliştirilen ağ temelli STS’ler bizim çalışmamızın da temelini oluşturmaktadır. Bunlardan bir kısmı bölüm 6’da ayrıntılı olarak inceleneceklerdir. Sunucu-Temelli STS’ler Sunucu-temelli STS’ler bir bilgisayar sistemi içerisinde toplanan veriler üzerinde çalışırlar. Bu şekilde işletim sistemine yönelen saldırılar için hangi sistem çağrılarının ve hangi kullanıcıların sorumlu olduğu tespit edilebilir. Sunucu-temelli STS’ler iki tür bilgi kaynağı kullanır: işletim sistemi izleme seçenekleri ve sistem günlük dosyaları. Bunların ağ temelli sistemlere göre bir avantajı: olayların olduğu yerel sunucuyu izleme yetenekleri sayesinde ağ-temelli STS’lerin yakalayamayacağı saldırıları tespit edebilirler. Bu saldırılar çoğu zaman fazla trafik yaratmayan R2L veya U2R saldırılarını içerir. Uygulama-Temelli STS’ler Bu STS’ler bir yazılım uygulaması ile meydana gelen olayları analiz eden sunucutemelli STS’lerin özel bir türüdür. Uygulama-temelli STS’lerde bilgi kaynağı olarak genellikle uygulamaya ait günlük dosyalar kullanılır. Analiz-motoruna belirli uygulamalar için o uygulamalara has özellikler bildirildiği taktirde, yetkisini aşan kullanıcıların gerçekleştirdiği saldırılar uygulama-temelli STS’lerce tespit edilebilir [2]. 2. 4 Saldırı Tespit Yöntemlerine Göre: STS’ler saldırı tespit yöntemlerine göre sınıflandırılırsa 2 temel yöntem söz konusudur. Bunlardan ilki anormallik tespitine dayanır. Diğeri kötüye kullanım tespiti ya da bazı kaynaklarda tanımlandığı üzere imza-tanıma üzerinden gider. Aşağıda iki yaklaşım da ayrıntılı olarak incelenecektir. 2.4.1. Anormallik Tespiti: Anormallik (anomaly) normal davranıştan sapma anlamına gelir. Burada normal davranıştan farklılık göstren davranışların saldırı olarak işaretlenmesi söz konusudur. Normal bir sistemde kullanıcı istekleri tahmin edilebilir istatistiksel değerlerle uyuşur. Burada normal davranışın bilinmesi ve modelenmesi esastır. Ancak bundan sonra bir anormallik varsa tespit edilebilir. Normal davranış bir dağılım ile (bkz. Şekil 5) veya dağılımın momentleriyle modellenebilir. Belirli kurallar zinciri ile tanımlanabilir veya başka yöntemler uygulanabilir ama sonuçta bu tanımlı ya da öğrenilen davranıştan sapma anormallik olarak değerlendirilir ve sapmanın şiddetine göre saldırı olarak sınıflandırılabilir. Bu yöntemin avantajı daha önceden tanınmayan saldırıların keşfedilmesi olasılığıdır. Dezavantajı ise yanlış alarmların (false alarm/positive) sayısının yüksek olmasıdır [3]. Yanlış alarm tanımı bir sonraki bölümde ayrıntılı olarak verilecektir fakat kabaca “var olmayan” bir durumu “var” olarak tanımaktır . 7 Şekil 5 Normal ve saldırı içeren dağılımın teorik ayrışımı [20] Anormallik tespitinde istatistiksel yöntemler, yapay sinir ağları, veri madenciliği bilgisayar bağışıklık sistemi (computer immunology) gibi birçok yaklaşım uygulanabilir [4]. Bunları kendi içinde sınıflandırmak gerekirse [5]: a) Kendi-kendine öğrenen sistemler: Belli bir veri seti ile eğitilerek normal davranışı öğreniler. Bunlar i) zaman serilerini kullanmayan kural tabanlı sistemler ve açıklayıcı istatistikleri kullanan sistemler olarak ve ii) zaman serilerini kullanan yapay sinir ağları temelli teknikler olarak üçe ayrılırlar. 1. Zaman serisi kullanmayan sistemler: a. Kural Tabalı (Rule Based) Sistemler: Sistem kendisi trafiği inceleyip kurallar oluşturuyor ve saldırı tespiti sırasında bu kararlara göre davranıyorsa bu sınıfa girer. b. Açıklayıcı İstatistikleri (Descriptive Statistics) Kullanan Sistemler: Kullanıcı profilinin basit istatistiklerle oluşturulup, buradan uzaklık vektörlerini (distance vector) kullanarak karar alan sistemlerdir. 2. Zaman serisi kullanan sistemler: a. Yapay Sinir ağları (Artificial Neural Networks – ANN) yaklaşımı: Burada sistem önceden bir zaman serisi ile eğitilir ve çalışmaya başladığında, buradan öğrendikleri ile karar verir. b) Programlanan Sistemler: a. Açıklayıcı İstatistikleri kullanan sistemler: Burada yukardakinden farklı olarak profiller daha önceden tanımlanmıştır. Profilleri sınırlayan belli bir eşik değeri, bir istatistiksel büyüklük veya basit bir kural olabilir. Bu yaklaşımı kullanan çalışmaların örnekleri Bölüm 6’da incelenecektir. b. Bilinmeyeni reddet (Default Deny) yaklaşımı: Tek başına çok sık kullanılan bir yaklaşım olmasa da, sistem davranışındaki durum-geçiş değerlerini kontrol ederek, farklı bir geçiş (transition) görüldüğünde izin vermemek şeklinde bir yaklaşıma sahiptir. 8 c. Sinyal İşleme Tekniklerini Kullanan yaklaşım: Burada sistem parametreleri sinyal işleme teknikleriyle belirlenir ve saldırı içermeyen normal veri setinden çıkartılan eşik değerleri ile anormallik tespiti yapılır. Bu yaklaşım diğerlerine göre yenidir ve çok geniş bir alanı kapsamaktadır. Henüz sınırlı sayıda sinyal işleme tekniği saldırı içeren zaman serilerine uygulanmıştır. Bölüm 6’da bunların örnekleri üzerinde duracağız. Özellikle son yıllarda popüler olan temel bileşen analizi (Principle Component Analysis - PCA) yaklaşımı ile elde edilen özdeğerlerin sistem parameteresi olarak kullanılması bu alandaki ilginç çalışmalardan biridir. 2.4.2. İmza-tanıma Temelli Saldırı Tespiti: Kötüye kullanım tespiti (Misuse detection) ya da imza-tanımaya dayalı sistemlerde ise her davranışın bir imzası-karakteri vardır. Bunlar daha önce görülen davranış şablonlarıdır. Eğer gözlenlenen davranış daha önceden bilinen bir saldırı imzası ile eşleşiyorsa saldırı olarak sınıflandırılır. Daha önce karşılaşılmadıysa saldırı olarak nitelenmez. Avantajı saldırıyı kesin olarak tanıyabilmesidir. Yani yanlış alarm vermezler fakat yeni bir saldırı gelirse bunu sezemezler. İmza temelli sistemler daha çok ticari sistemlerde kullanılırlar. İmza-tanımaya dayalı sistmelere ait yaklaşımlar sınıflandırılırsa [5]: a. Programlanan Sistemler: Kendi kendine öğrenen hibrid bir teknik olan Ripper dışında tüm imza temelli teknikler bu sınıfa girerler. a. Durum modellemesi: Burada tüm davranışlar durumlara karşı düşer. Eğer bir davranış daha önceden tanımlı durumlara ve durum geçişlerine denk düşen hareketler yapıyorsa saldırı olarak tanınır. b. Exper sistemler: Sızma belirlerme sistemlerin ilkleri kural-tabanlı (rulebased) exper sistemlerdir. c. Örüntü eşleme (Pattern Matching): Sistemde daha önceden tanımlanmış, olmaması gereken bazı sözcüklerin tanınmasına yardım eder. Esnek değildir fakat basittir. Örneğin “parola dosyasını kopyala” komutu görüldüğünde bunun bir saldırı olduğunu en basit şekilde bu yöntem tespit eder. Aşağıda Tablo 1’de saldırı tespit sistemlerinin sınıflandırması şeması ve bunlara denk düşen gerçeklenmiş sistemler yer almaktadır. Bu tablo ve sınıflandırma 2000 yılında yapılan bir çalışmada yer aldığından en son gelişmeleri içermemektedir. Biz 6. Bölümde bu seneden sonra önerilen istatistiksel yaklaşımları içeren anormallik tespiti sistemleri inceleyeceğiz. 9 Tablo 1. Saldırı Tespit Yöntemlerinin ve Araçlarının Sınıflandırılması Zaman serisi Kural tabanlı W&S kullanmayan Açıklayıcı İstatistikler IDES NIDES EMERALD Haystack Kendi-kendine Öğrenen Sistemler Zaman serisi kullanan Yapay sinir ağları Hyperview Basit istatistikler MIDAS NADIR Haystack Basit kural NSM Açıklayıcı İstatistikler Eşik değeri ComputerWatch Anormallik Tabanlı Programlanan Sistemler Bilinmeyeni Reddet Durum Serileri Modeli JANUS Bro Durum Modellemesi Durum Geçiş USTAT Petri-net IDIOT Exper sistem NIDES EMERALD MIDAS DIDS Örüntü eşleme NSM İmza Tanıma tabanlı Programlanan Sistemler Basit kural NADIR Bro HayStack İmza esinlenmeli Kendi kendine öğrenen Otomatik özellik seçme Ripper Tablo 1’de bazı sistemlerin birden fazla kategoride yer alması, ilgili yaklaşımların tümünü içerdiğini gösteriyor. Burada amacımız varolan bu sistemlerin incelenmesi olmadığından dolayı sistemler hakkında sadece kısa bilgi vermekle yetineceğiz. Haystack: Amerikan Hava Kuvvetlerinde kullanılan Unisys 1100/60 ana bilgisayarları için tasarlanmış bir saldırı tespit sistemidir. 1988 yılında geliştirilmiştir. MIDAS: 1988’de National Computer Security Centre (Ulusal Bilgisayar Güvelik Merkezi) için geliştirilmiştir. Exper sistem tabanlıdır. IDES (Intrusion Detection Expert System): IDES 1988-1992 yılları arasında üzerinde çalışılan birçok sistemi içerir. Bu arada birçok versiyonu çıkmıştır ve son olarak NIDES (Next-Generation Intrusion Detection Expert System) adını almıştır. Bu çalışmalardan en eskilerinden ve ünlülerinden biri olan Denning’in sistemi [6] aşağıda daha ayrıntılı olarak W&S (Wisdom and Sense – Zeka ve His): Geliştirilmesine 1984 yılında başlanmasına rağmen ilk makalesi 1989’da çıkmıştır. Zeka kısmı geçmişteki audit verileri inceleyerek normal davranışı oluşturması anlamına gelir. His kısmı ise bunların kural haline getirilip exper sisteme verildikten sonra anormal davranışların yakalanması anlamına gelmektedir. ComputerWatch: AT&T Bell Laboratuarları tarafından ticari bir ürün olarak 1990 yılında geliştirilmiştir. 10 NSM (Network Security Monitor): NSM’de IDES gibi revizyonlardan geçmiştir ve geliştirilmesi 1990-94 arasına denk düşer. NSM ağı dinleyerek, ağın kullanımıyla ilgili bir profil geliştirir ve geçerli kullanımı onunla karşılaştırır. Elde edilen veri beklenen bağlantı verisiyle karşılaştırılır ve beklenen aralıkta çıkmayan her veri anormal olarak işaretlenir. Biz çalışmamızda NSM tipinde bir STS gerçeklenmesi üzerinde duracağız. NADIR: 1991-93 yılları arasında Los Alamos Laboratuarlarında geliştirilmiştir. NADIR kullanıcılar hakkında haftalık istatistikler tutar. Daha sonra bu istatistikleri exper sistem kurallarıyla karşılaştırır. Hyperview: 1992 yılında geliştirilmiş diğer sistemlerden oldukça farklı bir sistemdir. İki ayrı parçadan oluşur. İlki davranışları izleyen ve sınıflayan bir exper sistem, ikincisi buradan öğrendikleriyle eğitilen yapay sinir ağlarını içeren parçadır. DIDS: 1992 yıllarında geliştirilmiş dağıtık mimarili sistemleri kapsar. Bu tip sistemlerde ağın değişik noktalarından veriler toplanır ve bir merkezde incelenir. USTAT: 1993-95 yılları arasında geliştirilmiştir. Durum geçiş analizi yapar. Eğer bir davranış saldırı için tanımlı durum geçişlerini yapıyorsa saldırı olarak sınıflandırılır. IDIOT: 1994-96 yılları arasında CERIAS (Center for Education and Research in Information Assurance and Security) geliştirilmiştir. Örüntü tanıma için petri-net’lerin kullanımına dayanır. JANUS: 1996’da Berkley’de geliştirilmiş bir sistemdir. EMERALD (Event Monitoring Enabling Responses to Anomalous Live Disturbances): 1997-98 yıllarında geliştirilmiş ölçeklenebilir, dağıtık bir STS’dir. Bu konuda çokca referans verilen çalışmalardan birdir. Bro: 1988’de Vern Paxson tarafından geliştirilmiş bir STS’dir. Gerçek zamanda ağ trafiğini pasif olarak gözlemleyerek saldırı tespiti yapmaktadır. Birçok değişik özelliği kendinde barındırması açısından sıkça söz edilen bir STS’dir. Ripper: 1999 yılında geliştirilen bu sistem veri madenciliği yaklaşımını kullanır. Ripper DARPA değerlendirmesine katılmış olan sistemlerden bir tanesidir. Burada adı geçen sistemlerden başkaca birçok STS mevcuttur. Bundan sonraki bölümde IDES tipinden bir STS modeli incelenecektir. Denning’e ait IDES tipinden STS modeli: Sızma belirleme dendiğinde konunun temel taşlarından sayılan Denning’in çalışmasından bahsetmek gereklidir [6]. Bu çalışmada exper sistemin karar vermesi için 3 farklı istatistiksel ölçü tanımlanmıştır. 1. Eşik ölçüsü: Kullanıcının belirli bir aralıkta bir işlemi tekrarlamasına izin verilir. Eğer bu değer aşılırsa anormallik olduğu tespit edilir. Örneğin bir sisteme kullanıcı n den fazla hatalı giriş (login) denemesi yaparsa kullanıcı hesabı kilitlenebilir. Burada normal davranış için belirlenen eşik değeri sistemden sisteme çok fazla değişkenlik gösterebileceği için zayıf bir yöntemdir. 11 2. İstatiksel momentlerin kullanılması: Belirlirli bir davranış için dağılım ve ilk iki momentin bilindiği varsayılırsa ve eğer değerler belirli bir aralıkta beklenen değerlerden dışarı çıkarsa bu davranış anormallik olarak kabul edilir. Eşik değerinde geçerli problemler burada da mevcuttur.3.Markov modeli kullanılması: Sistem bir durum makinası veya Markov zinciri gibi düşünülür. Yeni bir olay olunca sistem yeni bir duruma geçer. Eğer bir olay oluşunca, düşük olasılıklı durum geçişine neden oluyorsa bu davranış kural dışı olarak kabul edilir. Anormallikler, tek olaya değil bir dizi olaya bağlıdır. Denning’in kullanıcı hareketlerinden oluşturduğu audit kayıtları şu şekildedir. Örneğin bir dosyayı kopyalamak için Ali kullanıcısı şöyle bir komut yürütsün: [ali@computer]# COPY GAME.EXE TO GAME.EXE Bu komut için oluşturulacak kayıtlar şu şekilde olacaktır. Kullanıcı İşlem Üzerinde Çalışılan Nesne Hata kodu Kaynak Kullanımı Zaman Damgası Ali Execute COPY.EXE 0 CPU=00002 11...60 Ali Read GAME.EXE 0 RECORDS=0 11....61 Ali Execute COPY.EXE Write-viol RECORDS=0 11....62 Bu kayıtlardan hangi kullanıcının hangi işlemi ne zaman yaptığı, herhangi bir hataya yol açıp açmadığı ve ne kadarlık kaynak harcayıp, kaç kayıt üzerinde değişiklik yaptığı okunabilmektedir. Bu kayıtlara bakılarak uygulanan yukarda anlatılan 3 istatistiksel ölçüt ile saldırının varlığını tespit edilir. 


3. SALDIRI TESPİT SİSTEMLERİNİN BAŞARIMLARININ DEĞERLENDİRMESİ 



Bu bölümde bir saldırı tespit sisteminin hangi özelliklere göre başarılı veya başarısız şeklinde değerlendirilebileceği üzerinde tartışacağız. Değerlendirme kriterleri aşağıda verilmiştir [16]. 1- Yanlış Alarm Seviyesi Yanlış alarm, tespit edilmesi planlanan büyüklük için yapılan yanlış değerlendirmeleri içerir. Yanlış değerlendirmeler iki çeşit olabilir. Biri var olan bir değeri kaçırmak diğeri varolmayan bir değeri varmış gibi tespit etmektir. Yanlış alarm ikinicisidir. Genelde STS sistemlerinin başarımını ölçmekte önemli bir parametredir çünkü bir sistemde izin verilen yanlış alarm sayısı ve doğru tespit miktarı birbiriyle ilintilidir. Yanlış alarmlara izin verildikçe doğru tespit oranı artmaktadır. Sistem parametreleri ikisinin de optimum olduğu noktaya ayarlanmalıdır. Burada yapılacak analiz ve başarım hesaplamasında ROC (Receiver Operating Characteristic – Alıcı Karakteristiği) eğrileri kullanılır. ROC adını radar uygulamalarından almıştır. Şekil 6’da iki sistem için ROC eğrileri verilmiştir. Burada örneğin %40’lık bir yanlış alarma izin verilirse sistemin doğru yakalama şansı %50 olur. Eğer %60’lık yanlış alarm kabul edilirse %100’luk bir doğru tespit şansı vardır. 12 Şekil 6 Örnek ROC eğrileri [16] 2- Doğru tespit seviyesi: Kaç adet saldırılarının doğru olarak tespit edildiğidir. Yukarıda anlatıldığı gibi doğrudan yanlış alarm ile ilgilidir ve Şekil 6’daki y-eksenini oluşturur. Bir STS’nin var olan saldırıların kaçını yakaladığı önemli bir parametredir. Fakat bunu yaparken yanlış alarm sayısını da çok yükseltmemelidir. 3- Yoğun veri ile başa çıkabilme: Bu kriter ağ tabanlı sistemler için geçerlidir. Trafik yoğunluğu arttıkça tüm sistemler paket düşürebilir hale gelirler. Bazı STS’ler trafik yoğunluğu çok arttığı zaman saldırı tespitinde tamamen başarısız olabilirler. Özellikle DoS saldırlarında sistemin güvenli olması için bu önemli bir parametredir. 4- Olayları ilintilendirebilme: Farklı kaynaklardan gelen saldırı bilgilerini birleştirebilme yeteneğidir ve halihazırdaki STS’lerin bu konuda sınırlı yeteneği vardır. 5- Yeni saldırıları tanıyabilme: Bu sadece anormallik tespitine dayalı sistemler için geçerlidir. İmza temelli sistemler yeni gelen hiçbir saldırıyı tanıyamazlar ve bir çok ticari STS bu tip bir yöntem benimsediği için bu yetenekten zaten yoksundurlar. 6- Saldırıyı tanıyabilme: Saldırnın varlığını tespit etmek ve saldırının tipini söyleyebilmek iki ayrı kavramdır. STS’lerin ilk odaklandığı konu doğal olarak saldırıların varlığını tespit etmektir. Genelde saldırı tipi, saldırı olduktan sonra ağ yöneticisi tarafından çeşitli kayıtlar incelenerek ortaya çıkartılır. Fakat gene de çok genel sınıflandırmalar yapabilen STS’ler mevcuttur. 7- Saldırının başarılı olup olmadığını belirleme: Aslında gerçekleştirilen saldırıların hepsi başarı ile sonuçlanmaz yani sisteme zarar vermez. Genelde STS’ler sisteme zarar veren veya vermeyen saldırıları sınıflandırmak konusunda bir çalışmayı barındırmazlar. Fakat bu özellik bir STS’nin sahip olması istenen özelliklerdendir. 13 



4. SALDIRILARA KARŞI ALINACAK ÖNLEMLER: 


Saldırı olduktan sonra alınabilecek önlemler saldırının tekrar olmasını engellemeye yarar ve o andaki saldırı için hiçbirşey yapamazlar. Bu önlemler örneğin yazılım açıklarından kaynaklanan saldırıları önlemek için yazılım yaması yapmak olabilir. Ama asıl önemli olan saldırı anında önlem alabilmektir. Saldırılara karşı iki farklı önlem gerçeklenebilir; pasif gözetleme ve erişim engelleme. a) Pasif Gözetleme: Bu yaklaşımda saldırganın davranışları kaydedilir, saldırıda araya girilmez. Amaç, saldırganın istediği şeyi ve kullandığı yöntemleri öğrenmektir. Burada en büyük sorun, sistemin savunmasız bırakılmasıdır. Saldırgan bu savunmasız durumda diğer sistemlere de saldırabilir. b) Erişimi Engelleme: Burada amaç saldırganın erişebileceği sistem kaynaklarını sınırlamaktır. Saldırıya karşı yukardaki önlemler alındıktan sonra, saldırıya karışmış sistemlerin erişimi kaldırılır veya süreçleri sonlandırılır. STS’leri genel olarak tanıttıktan sonra daha özelde yeni geliştirilen STS’ler ve önerilen yeni yöntemler üzerinde biraz bilgi vermek gerekir. Bu yakın tarihli çalışmalara geçmeden önce bu çalışmaların kullandığı veri setlerinin özelliklerinden bahsetmek yerinde olacaktır. Bundan sonraki bölümde STS’lerin kullanabileceği MIB tabanlı veri setleri ve internetten de bulunabilecek olan DARPA 1998 ve 1999 saldırı tespit değerlendirme veri setleri ile KDD Cup veri setlerini tanıtacağız. 
5. STS TESTLERİNDE KULLANILAN VERİ SETLERİ STS’lerin sınanmasında en zorlu kısım güvenilir veri setleri elde edilmesidir. İnternet ortamından elde edilmiş verilerin çoğu saldırı var ya da yok bilgisi içermez. Herhangi bir ağda bu bilginin edinilmesi için ağ yöneticisinin sistemi gözlüyor olması ve sistem kayıtlarını tutuyor olması gerekir. Bu birçok ISP için çok masraflı ve gereksiz görülen bir iştir. Saldırıları içeren veri setine tümüyle hakim olunmak isteniyorsa, bir benzetim (simulasyon) yapılarak sentetik test verisi yaratılabilir. Fakat bunun da internet trafiğine benzediğini kanıtlamak zordur. Bu konudaki zorlukları kısaca özetlersek: 1- Gerçek veri bulmak zordur. 2- Atak sırasında etiketlenmiş veri seti bulmak daha da zordur. 3- Verileri saklamak masraflıdır. 4- Normal davranışı tanımlamak ve simule etmek zordur (çünkü internet trafiği fazlasıyla dinamiktir.) Bütün bu zorluklara rağmen STS’lerin test edilmesi için bir veri seti şarttır. Bu durumda 2 değişik veri toplama yöntemi kullanılabilir [7]. Bir yöntem yönlendirici MIB’inde (Management Information Base – Yönetim Veri Tabanı) tutulan, giren-çıkan IP paketi ve bunun gibi bazı sayaç değerlerinin SNMP ile sorgulanarak bir makinaya aktarılmasından ibarettir. Bu yöntem sıkça kullanılmaktadır çünkü maliyeti düşüktür. Fakat veri 5 dakikada bir sorgulandığından ve 5 dakikanın ortalaması sonuç olarak geri döndüğünden dolayı yeterince hassas değildir. Ayrıca ağ yöneticisi ile işbirliği içinde olunması gerekir aksi takdirde her yönlendirici üzerindeki bilgilere erişim hakkı tanımaz. Bir diğer problem bu yöntemle sadece yönlendirici MIB’inde tutulan verilerin elde edilebilir olmasıdır. Yani sayaç değerleri dışında, örneğin gidip-gelen paketlerin içeriği gibi bilgilere kesinlikle ulaşılamaz. Burada paket içeriğinde belirli bir anahtar kelime saldırı yapıldığı anlamına geliyorsa, tespit edilmeden 14 sistemden geçer. Bu durumda zaman serilerini kullanan yaklaşımlar ile analiz yapılabilir ve sadece trafik volumunde değişikliğe yol açan saldırılar tespit edilebilir. Diğer yöntem ise IP flow monitor’lerinden veya ağ dinleyicisi (sniffer) programlarından veri toplanmasıdır. IP Flow monitorleri genelde pahalıdır. Sadece paket başlıklarına bakıldığından dolayı sınırlı bir bilgi içerir. Yoklayıcı programlar ise en ayrıntılı bilgiyi içerirler ve dolayısıyla çok fazla disk alanına ihtiyaç duyarlar. Ayrıca çok yoğun trafiklerde paketlerin hepsini yakalayamayabilirler. Simule edilen bir ağdan ağ ve en sık kullanılan veri seti DARPA 1998 ve 1999 veri setleridir. Bu veri setleriyle ilgili bilinen problemler olmasına rağmen kontrollü bir çerçevede üretilip, ortak kullanıma açık olan yegane veri setleridir. Daha yeni tarihli çalışmalara geçmeden önce bu çalışmaların kullandığı DARPA veri setlerinin özelliklerinden bahsetmek yerinde olacaktır. Bundan sonraki bölümde DARPA 1998 ve 1999 saldırı tespit değerlendirme veri seti, bu veri setine getirilen eleştiriler ile yine bu verilerden türetilen KDD Cup’99 veri setlerini tanıtacağız. 5.1 DARPA Veri Seti Detayları: DARPA’nın sponsorluğunda MIT Lincoln Laboratuarlarında STS’ler için bir karşılaştırma ortamı sunan IDEVAL veri setlerini oluşturulmuştur [8]. Özellikle saldırı tespit sistemlerinin sınanması amacıyla saldırıların hedefi olacak bir ağ ve saldırıları gerçekleştiren başka bir ağ dizayn edilmiştir. İç ağda Amerikan Hava Kuvvetlerindeki bir yerel ağın simülasyonu gerçeklenmiştir. 1999 değerlendirmesinde kullanılan ağ aşağıdaki gibidir. Şekil 7 DARPA 99 Ağ yapısı[2] Hava kuvvetlerini temsil eden iç ağ 172.16.0.0/16 IP adres uzayına sahiptir. Bu ağ içerisinde dört “kurban” makine bulunmaktadır. Bunların üzerinde SunOS, Solaris, Linux, ve Windows NT koşmaktadır. (1998 veri setlerinde sadece UNIX makinalar kullanılmıştır.) Şekilde görülen trafik oluşturucular yüzlerce sunucuyu ve çeşitli uygulamaları çalıştıran İnternet kullanıcılarını simüle etmektedir. Protokollerin (HTTP, SMTP, telnet,...) karışımı, trafik yoğunluğunun saatlik değişimleri, 1998’de gerçek Hava Kuvvetleri ağından toplanan trafiğe benzer olacak şekilde tasarlanmıştır. Ağ üzerinden 2 noktadan veri toplanmıştır: dört 15 kurban makine ile yönlendirici arasındaki iç ağ dinleyicisi ve yönlendirici ile İnternet arasındaki dış ağ dinleyicisi üzerinden [2]. 1999 değerlendirmesi iki aşamadan oluşmaktadır. Veri setleri toplam 5 haftalık bir süreyi kapsamaktadır, ilk 3 haftası eğitim (training) verileri, son 2 haftası da test verileridir. 1. hafta ve 3. hafta saldırı içermemektedir. 2. hafta bazı saldırılar içermekte ve bu saldırılar ayrıca bir dosyada işaretlenmiştir. Bu kısım değerlendirmeye alınacak sistemlerin kendi başarımlarını test etmeleri içindir. Geriye kalan 4. ve 5. haftalarda ise 58 değişik saldırı tipinde 200 adet saldırı mevcuttur. Bu saldırı yazılımları internet ortamından ve hacker sitelerinden toplanmış saldırılardır. (1998 veri setinde çok fazla sayıda değişik saldırı bulunmamaktadır). 1999 değerlendirmesine 8 grup 18 IDS ile katılmış ve katılan gruplara: 1) Ağ dinleyicisindan elde dilen dosyalar a. İç ağ dinleyicisindan alınan tcpdump dosyası b. Dış ağ dinleyicisidan alınan tcpdump dosyası 2) Solaris Temel Güvenlik Modülü (Basic Security Module -BSM) audit dosyaları 3) Windows NT olay log dosyaları 4) Kurban makinalardan her gece alınan güvenlik kayıtları. sağlanmıştır. Bu dosyalar şu anda İnternet sitesinden de indirilebilir durumdadır [19]. Değerlendirmenin ilk aşamasında katılımcılara üç haftalık veri dağıtılmıştır. İkinci aşamada, katılımcılara sistemlerini test edebilmeleri için iki haftalık test verisi dağıtılmıştır. Bunlar tüm setin dördüncü ve beşinci haftalarını oluşturur. Tüm günler için yukarda belirtilen 5 tip dosya sağlanmıştır. Tahmin edileceği üzere exper sistem tabanlı çalışmalar 2, 3 ve 4’ü kullanırken, anormallik tespiti yapan sistemler 1 numaralı verileri kullanmayı tercih etmişleridir. Veriler 5 hafta için 5’er gunluk olmak üzere toplam 25 gunluk trafik içerir. Verinin toplam boyutu 7,5 GB civarındadır. Hergun sabah 08:00 ve ertesi gün sabah 06:00 arasında 22 saat veri toplanması sonucu oluşturulmuş verilerdir. Gün başına ortalama 41MB veri duşmektedir [8]. Bunlardan protokol istatistikleri TPC (384MB), UDP (26MB) ve ICMP (98MB) olarak en baskın protokoller olmuştur. Aslında bir gunde oluşan trafik internet ortamına kıyasla düşük seviyededir fakat dosya boyutları ve daha sonra bu dosyaların internet ortamından araştırmacılara aktarılacak olması dolayısıyla bu şekilde tutulmuştur. Giriş kısmında belirttiğimiz 4 tip saldırı, Hizmet Engellme (DoS), Bilgi tarama (probe), yönetici hesabı ile yerel oturum açma (R2L), kullanıcı hesabının yönetici hesabına yükseltilmesi (U2R) saldırıları çeşitli saldırı sitelerinden toplanan kodlarla gerçeklenmiş ve sisteme aralıklarla enjekte edilmiştir. Burada saldırı tespitinde dikkat edilmesi gereken nokta 5 dosyadan hangisinin hangi tip saldırılar için kullanılacağıdır. Sniffer verisi ağ saldırıları yani probe ve DoS için kullanılabilecekken, BSM kayıtları ile tüm saldırılar tesbit edilebilir. Biz çalışmamızda ağ saldırılarını hedef alacağız dolayısıyla ağ dinleyicisi verilerini kullanacağız. DARPA veri setleri bazı özellikleri dolayısıyla bir sonraki bölümde ayrıntılı olarak inceleyeceğimiz eleştiriler almıştır fakat yine de var olan tek açık veri setidir. Bundan başkaca KDD-99 Cup Veri Setleri [9] olarak da bilinen veri seti mevcuttur. Aslında bu veri seti de DARPA 1998 veri setinden bazı özelliklerin ayıklanmış olduğu ve 5. Uluslararası Knowledge Discovery and Data Mining konferansı çerçevesinde düzenlenen bir yarışmada kullanıma sunulan veri setleridir. Sonuçta yine DARPA verileri ile aynı özelliklere sahiptir. 16 5.2. DARPA Veri Setine Getirilen Eleştiriler DARPA veri setleri ile ilgili problemler olduğu bilinmektedir. DARPA verilerini ve dökümantasyonunu derinlemesine inceleyen bir çalışma [10] McHugh tarafından yapılmıştır. 2000 yılında yapılan bu çalışma daha çok 1998 veri setlerinin kritiğini yapmaktadır. Fakat benzer problemlerin 1999 setlerinde de sürdüğü bilinmektedir. Getirilen eleştirilerden ilki arka plan trafiği denebilecek gerçek bir ağın çalışmasına ilişkin verinin alındığı Hava Kuvvetleri trafiği ile benzetim sonucu ortaya çıkan verinin hangi özelliklerinin benzediğinin Lincoln araştırma ekibi tarafından belirtilmediğidir. Aslında geliştirilecek STS’lerin DARPA veri setlerini temel alması ve buradan alacakları sonuca göre hareket etmeleri ve kendilerini kalibre etmeleri DARPA’nın temel amacı olarak düşünülürse bu verilerin sağlıklı olması yani gerçeğe yakın olması son derece önemlidir. Bundan başka arka plan trafiği, internette sıkça gözlenen paket fırtınalarını içermemektedir. Yanlış protokol gerçeklemeleri sonucu ortaya çıkan bu davranış anormallik içerir. Saldırı olmayan veri setlerinde de bu paket fırtınaları yer alabilirdi. Ayrıca çok daha önemli bir parametre olarak iletişim yoğunluğunun ne olduğu DARPA setlerinde belirtilmemiştir. McHugh çalışmasında veri hızını incelediğinde bazı gunler için 10Kbps bazı günler için 50Kbps mertebesinde olduğu yani çok farklılık gösterdiği ve gerçek ağlarla kıyaslandığında bunun en az 10- 100 katı bir trafikle karşılaşıldığını söylemektedir. DARPA setlerinde başka bir yanılgı ise saldırıların nasıl enjekte edildiğidir. Burada da gerçekçi bir yaklaşımdan ziyade rastgele, günde 3-4 saldırı olacak şekilde yerleştirildiği söylenmektedir. Ayrıca en yaygın saldırı probe olmasına rağmen saldırı karışımı aşağıda verildiği şekildedir. Tablo 2. DARPA veri setindeki saldırların sınıflandırılması U2R 114 R2L 34 DoS 99 Probe 64 McHugh’ün çalışmasından başka DARPA veri setlerine ait özbenzeşimliliği inceleyen bir başka çalışma 2003 tarihinde yapılmıştır [22] Burada da Hurst parametresinin günün değişik saatlerinde gündüz (H=0.7), gece (H=0.5) farklı değerler aldığı yani özbenzeşimli yapının herzaman korunmadığı söylenmiştir. Ayrıca bizim yaptığımız çalışmada ihtiyaç duyduğumuz propagasyon gecikmesi ya da en azından TCP bağlantılarına ait ortalama RTT değerleri verilemesi gerekirdi. Zaman serisi oluşturulurken örnekelme frekansının seçilmesi için bu bilgilerin elde edilmesi önemlidir. Aksi takdirde deneme yanılma yoluyla çalışılmak zorundadır. Tasarlanan STS’ler kendi başarımlarını bu veri setleri ile değerlendireceği için veri setinden kaynaklanan bir hata yanlış yollara sapılmasına yol açacaktır. Dolayısyla bu hatalara dikkat çeken çalışmalar önemlidir. 17 

6. İSTATİSTİKSEL ANORMALLİK TESPİTİ KULLANAN AĞ TEMELLİ STS’LERDE YENİ YAKLAŞIMLAR Anormallik tespitinde en populer yaklaşımlar zaman serilerini kullanmak veya veri setinden çıkartılan özellikler (feature) ile uzaklık hesabı yapmaktır. Zaman serisi kullanılacaksa sinyal işleme teknikleri de rahatça kullanılabilme olanağı bulurlar. Verinin herhangi bir zaman serisi olarak elde edilebilmesi uygulama alanını genişletir. Belirli aralıklarla olaylar (gelen paket sayısı, gelen bağlantı sayısı, vs.) zamanda dizilirse, buradan en basit istatistiksel testler (ortalama ve diğer momentler) başlayarak, spektrum kestirimi, özdeğer analizi, dalgacık analizi gibi birçok karmaşık sinyal işleme tekniğine de yol açılmış olur. Özellikle son zamanlarda sinyal işleme ile STS’lerin birleştirilmesi çok sayıda çalışmaya konu olmuştur [11,12]. Bu çalışmalarda genellike MIB verisi kullanılır. Eğer zaman serileri değil de özellikler kullanılıyorsa bu durumda ayrıksı tespitine (outlier detection) olanak veren örüntü tanımadan bildiğimiz kümeleme algoritmaları kullanım olanağı bulur. Bu bölümde bu iki temel yaklaşımı kullanan yakın zamanlı çalışmaları inceleyip kendi çalışmamızda kullanılabilecek özellikleri gözden geçireceğiz. İnceleyeceğimiz çalışmalar 3 ayrı tipte veri seti kullanmaktadır ve biz de buna göre sıralayacağız. Öncelikle DARPA veri setlerini kullanan çalışmalara daha sonra KDD Cup verisini kullanan çalışmaya ve son olarak da yönlendirici MIB’lerini kullanmak suretiyle kendi yönetimlerindeki ağlardan veri toplayan ve analiz eden grupların çalışmalarına yer vereceğiz. DARPA 1998 veri setini kullanarak yapılan bir çalışma [13]dır. Bu çalışma kaynak varış adresleri arasında yapılan bağlantı sayısını kullanarak saldırı tespiti yapmayı öngörür. Bağlantı sayıları bir zaman sersine dönüştürülüp üzerinde basit istatistik testler uygulanır. Bu çalışmada verilere değişik ölçeklerde bakılarak trafiğin gunduz, akşam ve gece rejimlerinde farklı ölçeklerde farklı saldırıların tespitinde kolaylık sağladığı ortaya çıkartılmıştır. Örneğin gündüz saatlerinde 100sn’lik örnekleme frekansı kullanılırsa ve gece saatlerinde 10sn’lik örnekleme frakansı kullanılırsa saldırı yakalamada daha başarılı olunduğu gözlemlenmiştir. Bu rejimlerin “normal” davranışlarının farklı olacağı beklenen bir özelliktir. Uygun ölçeklerde gelen bağlantı sayıları belirli bir dağılıma oturtulmuş ve uygun olmayan veriler saldırı olarak işaretlenmiştir. Dağılım kullanılarak yapılan çalışmalar her ne kadar sağlıklı olmasa da DARPA veri setine zaman serisi olarak bakması açısından önemli bir çalışmadır. DARPA veri setlerini kullanarak ayrıksı eleman tespiti (outlier detection) yapan bir sistem [14]de tanıtılmıştır. Burada önce eldeki verilere uygun olacak şekilde bazı özellikler seçilmiştir. Bu özelliklere karşı düşen sayısal büyüklükler uyarınca yapılan kümelemede dışarda kalan örnekler ayrıksı olarak nitelenip saldırı olarak işaretlenmişlerdir. Örnegin bu çalışmada kullanılan bazı özellikler: “kaynak_varış_paket_sayısı”, “varış_kaynak_paket_sayısı”, “son 15saniyede bir kaynağa yapılan bağlantılar” gibi 23 değişik özellik seçilmiş ve bunların sayısal değerleri ile saldırı içermeyen veri setinden normal bir küme oluşturulmuştur. Daha sonra test verileri bu küme ile karşılaştırılıp genel davranıştan ayrılma varsa bunun tespitine çalışılmıştır. Burada en yakın komşu (nearest neighbor), Mahalanobis uzaklığı algoritması gibi örüntü tanımadan bilinen yaklaşımlar uygulanmıştır. 18 DARPA veri setlerini kullanan bir başka çalışma [4] dur. Burada yukarda anlatılan iki tekniğe ait presiplerin; özellik çıkartma (feature selection) ve sinyal işlemenin birleştirilmesi söz konusudur. Bunları uygulamak için 3 adımlı bir kombine işlem serisi gerçeklenmiştir. Önce ham DARPA veri setinden yani TCP/IP bilgilerinden 3 ayrı set elde ediyor. Bunları elde etmek için tek-aşamalı bağdaştırma (single-level association mining), çok-aşamalı bağdaştırma (multi level association mining) ve özellik çıkartma adlı 3 veri madenciliği algoritması koşturuluyor. Bu bağdaştırma kurallarını anlamak için bir örneğe bakalım. Bir TCP/IP bağlantısı kaydı şu şekilde tanımlanabilir. K= {Bt, kaynak.ip, kaynak.port, varış.ip, varış.port, servis, bayrak} Bt bağlatı başlangıç zamanını verir. Daha sonra sırasıyla kaynak IP adresi, kaynak kapı numarası, varış IP adresi, varış kapı numarası yer alır. Servis ftp, smtp gibi uygulama protokolerini içerir. Bayrak ise bir bağlantı için {açık, kapalı, albaştan} gibi durumları ifade eder. Örneğin aşağıdaki kayıt: (kaynak.ip: 129.174.111.3, kaynak.kapı: 3167, varış.ip: 73.8.19.5, varış.kapı: 23, servis: telnet, zaman: 15:23:12) sadece saat 15:23:12 de 129.174.111.3 ve 73.8.19.5 arasında telnet bağlantısı olduğunu söylerken, aşağıdaki bağlantı kuralı bunu daha anlaşılır bir halde ifade edebilir. (kaynak.ip: 129.174.111.3 ??varış.ip: 73.8.19.5, varış.kapı: 23, servis: telnet, süre: 15:20:49-15:29:03 ) Buna benzer bağdaştırma kuralları ortaya çıkartılıp herbir kayda sayısal bir değer atanıp 3 ayrı matrise yazılır. Bağdaştırma kuralları Denning’in tablolarına benzetilebilir. Herbir kayda değer (skor) atanması konusunda alınacak kararlar da başlı başına bir çalışmadır. Şimdilik sayısal değerlerin oluşturulup matrislerle ifade edildiğini var sayalım. Bu 3 matrisin özilinti (otokerelasyon) matrisleri üzerinde temel bileşen analizi (principal component analysis - PCA) ya da başka adıyla factor analizi yapılıp yüksek boyuttaki veri daha az boyutta ifade ediliyor. Bunun anlamı örneğin 100x100’luk bir matrisin toplam 100 özdeğer ile belirtilmesi ve de bu değerlerin sadece belli başlı olanlarının (mesela ilk 10) kullanılmasıdır. Yani verinin kendisi yerine ondan daha az boyuttaki temel bileşenler ile analiz yapılıyor. Bu bileşenlerin davranışı saldırı içermeyen veri setleri için normal davranışı modellemek üzere çıkartılıyor. Daha sonra test veri için de aynı işlem yapılıp normal değerler arasındaki Mahalanobis uzaklığına bakılıyor. Eğer belli bir eşik değeri aşılmışsa eldeki veri ayrıksı olarak adlandırılıyor ve saldırı olarak damgalanıyor. Burada korelasyon matrisinin temel alınması bağlantı kayıtları arasında korelasyon varsa bunu açığa çıkartmaya yarar. Bu çalışma birçok tekniği bünyesinde barındıran bir çalışma olması açısından buraya alınmıştır. Karmaşık olması dolayısıyla gerçeklenmesi düşünülmemiştir. Buraya kadar DARPA veri setini kullanan çalışmalara odaklandık. Buradan sonra KDD Cup verisi üzerinde yapılmış sinyal işleme tekniklerini içeren bir çalışmaya bakacağız. KDD’99 verileri kullanarak temel bileşen analizini uygulayan ve bu konuda yapılmış farklı çalışmalardan biri [15]tir. Temel bileşen tabanlı sınıflandırıcı yöntemini önerilmiştir. Temel bileşen analizinin güzel yanının kestirim ya da saldırı tespitinde kullanılacak verinin boyutunu azaltması olduğunu biliyoruz. Temel bileşenler (TB) verinin varyansını ve korelasyonunu yakalarlar. TB’ler büyükten küçüğe sırayla dizildiklerinde ilk TB’ler en yuksek varyansa 19 sahip olanlardır. Sondaki TB’lerde verideki otokorelasyon bilgisini içerirler. TB’lerin hesabı korelasyon matrisi R den yapılabilir. i. TB yi şu şekilde elde edilir: y e z i i = , ei özvektör ve z: ( , ,..., ) 1 2 p z = z z z , k p s z x x kk k k k , 1,2,..., ( ) = - = skk standart sapma olmak üzere. Buradan temel bileşen ve ona ilişkin özdeğerler birlikte bir sınıflandırma ölçütü oluştururlar: ?= = p i i i y 1 2 ? µ ?i’ler özdeğerler olmak üzere, µ değerine göre bir sınıflandırma yapılacaktır. Fakat burada hangi özdeğerler kullanılacak bunu belirlemek önemli bir problemdir. İlk özdeğerler yuksek varysansı temsil ederler. Eğer eğitim veri setinden elde edilen varyans değerini aşan değerler test verisinde varsa bunlar ayrıksı sayılırlar. Fakat küçük TB’lerde korelasyon yapısına duyarlıdırlar. Saldırı sırasında farklı bir korelasyon yapısı söz konusu ise bunlar işe yarayabilir. Dolayısıyla bu çalışmada ilk TB’lerin bir kısmı ?= q i i i y 1 2 ? ve son TB’lerin bir kısmının kullanılması önerilmiştir: ? = - + p i p r i i y 1 2 ? Burada 1 1 2 y c q i i i ? ?= ? ve 2 1 2 c i p y i p r ? i ? = - + ? için c1 ve c2 değerleri eşik değerleridir. Yanlış alarm değerini belirli bir seviyede tutacak şekilde seçilebilirler. Dolayısıyla belirli bir yanlış alarm seviyesi için belirlenen eşik ile özdeğerler ve TB’lerden oluşan sayısal değer karşılaştırılarak bir sınıflandırıcı gerçeklenmiş olur. [15]. Hazır veri setlerini kullanmak yerine kampüs ağından topladığı verilere sinyal işleme yöntemlerini uygulayan bir saldırı tespiti çalışması Wisconsin- Madison Üniversitesinden Barford ve arkadaşlarının yaptığı çalışmalardır [7]. Kampüs ağının dış ağ bağlantısını sağlayan yönlendiricisinden SNMP mesajlarını ve IP flow monitörlerinden alınan bilgileri işlemişlerdir. Buraya kadar anlatılan yöntemlerden farklı olarak verilere dalgacık yöntemi uygulanmıştır. Zaman serisi olarak elde edilen veriler üç ayrı frekans bileşenine: düşük, orta ve yüksek olmak üzere ayrılmışlardır. Burada dalgacık yöntemi kullanılarak veri ayrıştırılmıştır. Verinin kendisinden oluşturulan zaman serisi ve bu filtrelemenin sonundaki, 3 değişik ölçekteki zaman serisine kayan ortalama hesabı (moving average) uygulanıp belirlenen bir eşik değerinden sapmalara saldırı etiketi konmuştur. Bu zaman-frekans incelemesi sonucunda saldırı uzunluğu konusunda da bilgi sahibi olunabilecek bir teknik oluşturulmuş olup, saldırılar uzun-vadeli (long-lived) ve kısa vadeli (short-lived) olarak sınıflandırılabilmiştir. 20 Kendi topladığı verileri kullanan başka bir çalışma [12] dır. Bu çalışmanın dayandığı temel nokta “anormal bir davranış öncesi keskin–ani bir degisiklik (abrubt change) oluyor olması” ve bu degisiklik noktası yakalanırsa, anormallik olmadan tespit yapılabileceğinin düşünülmesidir. Burada da bir zaman serisi elde edilip örnekleme zamanından büyük olacak aralıklardaki ani değişkliklerin tespiti söz konusudur. Zaman serilerini oluşturmada MIB değişkenlerinden, ip katmanı sayaçları ve yönelendirici arayüz sayaçları ndan, ipIR (ip in received), ipIDe (ip in delivred) ve ipOR (ip out requestst) kullanılıyor. Ani davranışı kestirme başlı başına bir çalışma alanı olduğundan burada detaylarına girmeyeceğiz fakat bu örnek bize sinyal işleme konularının STS’lerde uygulanmasının açacağı yeni ufuklar konusunda ip uçları vermektedir. 7. DARPA VERİ SETLERİNİ KULLANARAK ZAMAN-SERİSİ OLUŞTURULMASI VE BUNLARIN ANALİZİ: Bir Gerçekleme Çalışması Yapmayı hedeflediğimiz çalışma DARPA veri setlerini kullanarak MIB verilerine benzer IP trafik yoğunluğunu gösteren bir zaman serisi elde etmek ve buradan DoS ve probe saldırılarını tespit etmektir. Aslında yaptığımız çalışmanın hedefi eldeki DARPA 1999 veri setine sinyal işleme tekniklerini uygulamaktır. Bunun için iç ağ dinleyicisi dosyalarından, 5 haftalık verilerden saldırı içermeyen 3. hafta ve saldırı içeren test haftası 5. haftadan ilk güne (pazartesi) ait dosyalar alındı. Burada düşünülen amaç saldırı içermeyen günlerin gürültü, saldırıların sinyal olarak tanımlanıp, gürültüde sinyal tespiti yapılması işlemini gerçeklemektir. Bu bildik bir kestirim (detection-estimation) konusudur. Ağ dinleyicisi verisi ile zaman serisi oluşturmak ilk elden yapılabilecek kolay bir işlem değildir. Dinleyici veri seti tcpdump veri formatında olup, ağa giren ve çıkan tüm paketleri tüm ayrıntılarıyla tutmaktadır. Öncelikle bu çok fazla disk yeri tutan bir durumdur. Dinleyici verileri ağ üzerinde, çift yönlü gelip-giden tüm paketleri içerdiğinden, bir bağlantının iki yönlü paketleri, yönlendirme paketleri ve diğer tüm gereksiz trafik filtrelenmelidir. Her 2 gün için tcpdump veri seti ethereal aracılığıyla açılmış ve filtrelenmiştir. İç ağdaki yönlendiricilere gelen mesajların makinalara yapılan saldırı ile ilgisi olmadığı düşünülerek ağa giren yönlendirme mesajları rip, loop, cdp, vsvs gibi mesajlar filtrelenerek dışarda bırakılmıştır. Ağ dinleyicisi iki yönlü paketleri yakaladığı için kurban makinalara gelen paketler için varış ip adresi 172.16. xxxx olan paketler olarak süzülmelidir. Bunun için ilk olarak ele alınan 3. hafta pazartesi (saldırı içermeyen veriler) tcpdump.inside dosyası ethereal de açılmalı ve uygun filtre uygulanmalıdır. Şekil 8’de bugüne ait ilk paketler görülmektedir. Uygulanan filtre: (ip.dst == 172.16.0.0/16) and !(ip.src == 172.16.0.0/16) and !(ntp) and !(rip) and !(loop) and !(arp) and !(nbns) dir. 21 Şekil 8. Ethereal ekran görüntüsü Nihayi amaç bir zaman-serisi oluşturmak olduğundan ayıklanan veriler zaman damgası ve paket boyu kalacak şekilde 2 sütuna düşürülecektir. Buradan belli zaman aralıkları için kovalarda biriktirilerek örnekleme yapılacaktır. Burdan sonra Ethereal’daki bilgi, programın export özelliği kullanılarak text dosyasına aktarılmıştır. Artık bu dosya herhangi bir programlama dilinde incelenebilir. Biz çalışmamızda C++ kullandık. Yazılan kod ile sadece zaman ve paket boyu bilgisi alınıp 2 sütunlu başka bir dosya oluşturulmuştur. Aslında buradan sonra veriler sinyal işleme kodlarının da kolaylıkla yazılacağı MATLAB ortamına aktarılabilirdi fakat MATLAB’deki matris ve dizi boyları dosyadaki verilerden kısa olduğundan dolayı bir adım daha önişleme yapılmalıdır. Önişlemenin ikinci adımında yine bir C++ kodu ile her 5 saniyede bir gelen paketler kovalarda toplanmıştır. Bu adımdan sonra MATLAB’e aktarılacak zaman serisi oluşmuş olur. Şekil 9 ve 10’da 3. Hafta (saldırı içermeyen) ve 5. hafta (saldırı içeren) Pazartesi günlerine ait ağda akan byte sayısı görülmektedir. Şekil 11 ve Şekil 12’te yine aynı günler için 100snlik kovalarda toplanan veriler gösterilmiştir. 22 Şekil 9. 3. hafta pazartesi verileri (5sn lik kovalarda toplanmış) Şekil 10. 5. hafta pazartesi verileri (5sn lik kovalarda toplanmış) 23 Şekil 11. 3. hafta pazartesi verileri (100sn lik kovalar) Şekil 12. 5. hafta pazatesi verileri (100sn lik kovalar) Şekillerden görülen en belirgin özellik normal veri setindeki 2 adet tepenin saldırı setinde daha yüksek değerlerde oluşmasıdır. Aslında burada normal veri setinde bu şekilde tepelerin görülmesi gerçek trafikle kıyaslandığında bir problem olduğunu göstermektedir. Bunun DARPA setiyle ilgili daha önce bahsedilen problemlerden kaynaklandığını düşünmekteyiz. Çünkü Hava kuvvetleri ortamı simule edilirken istatistiksel özellikler göz önüne alınmamış gibi gözükmektedir. 24 Bütün bu işlemler sonucunda sadırı tespitinde, tcpdump verisinden zaman ve paket boyu bilgisi yani trafik hacmi verisi çıkartıldığı için DARPA veri setinin içerdiği çok az özellik kullanılmış durumdadır. Bu durumu engellemek için farklı bir yaklaşım düşünülmüştür. Bu yaklaşım bağlantı isteklerinden zaman serisi oluşurmak olabilir. Burada DoS saldırıları hedef alınabilir. Bir zaman diliminde bir kaynağa gelen bağlantı sayılarındaki ani değişiklik saldırı habercisi olabilir. Yalnız burada saldırı hakkında ön bilgi olamayacağı için her makinaya ait ayrı ayrı zaman serileri oluşturmak gerekir. DARPA ağında dört adet kurban makina bulunduğundan bunu yapmak çok zor değildir fakat çıkan sonuçlar gerçekçi olmayacaktır. Dolayısıyla biz makine tabanlı olmayan ama yeni bağlantı sayılarını gösteren TCP paketlerinin SYN bayrağına bakacağız. Ağ dinleyicisi paket başlık detaylarını da gösterdiğinden dolayı SYN=set durumuna bakılabilir. Burada gelen SYN paketleri sayılacaktır. Örneğin son 10 saniyede gelen SYN sayılarındaki artış bir belirteç olabilir. Fakat SYN mesajına SYN-ACK gelip gelmediğinin kontrolünün yapılması da gereklidir. Bu bağlantı isteğinin istekte bulunan taraf tarafından onaylandığını gösterir [21]. Bunlar da sayıldığı takdir de normal gelişen bağlantılara ait SYN’ler boş yere sayılmamış olur. Biz çalışmamız da bu kısma dikkat etmeden sadece SYN sayılarındaki artışa eşik değeri uygulayarak bir saldırı tespiti yapmaya çalışacağız. Yine Ethereal ile açtığımız dosyaya sadece TCP bağlantılarını filtreleyecek bir filtre koymak gereklidir: (ip.dst == 172.16.0.0/16) and !(ip.src == 172.16.0.0/16) and tcp Buradan sonra yine bir C++ kodu ile zaman damgaları ve SYN anahtar kelimesini içeren satırlar ayıklanacaktır. Daha sonra 10sn’de kaç adet SYN içeren satır geçtiği sayılıp toplanmıştır. Buradan oluşan sonuç MATLAB’e aktarılacak zaman serisini oluşturulmuştur. Burada dikkat edilmesi gereken nokta seçilen örnekleme süresinin saldırıyı gösterebilecek kadar SYN mesajının toplanmasına yetmesi gerekliliğidir. DARPA setinde propagasyon gecikmesi ya da ortalama RTT süreleri verilmediğinden burada bir hesap yapılamamakta ve denyesel olarak sonuçlar üretilmektedir. Bu sürelerin gerçekçi olup olmadıkları da bilinemektedir ve bizim tarafımızdan veri setine getirilen bir eleştiridir. Şekil 13 ve 14’te bu analizin sonucunda çıkan zaman serileri verilmiştir. 25 Şekil 13. 3. hafta Pazartesi için SYN paket sayısı (100sn) Şekil 14. 5. hafta Pazartesi için SYN paket sayısı (100sn) Şekillerden de görüldüğü gibi SYN paketleri de yeterli bilgi içermemektedir. Ayrıca kendi içersinde de problemleri vardır. Normal veri setinde daha fazla bağlantı bulunması analizde bir hata yapılmış olduğunu düşündürtmektedir. Bunu görmek için ilk aşamada SYNACK iklisinin kaç bağlantıda gönderilmediği araştırılmalıdır. 26 8. SONUÇ Ağ Güvenliği dersi kapsamında yapılan bu projde ağ üzerinden gerçekleşen saldırılar hakkında genel bir bilgi birikimi oluşması amaçlanmıştır. Literatür taramasıyla oluşturulan bilgi birikimi, kendi çabamızla tasarladığımız basit sistem üzerinde kullanılmıştır. Bu sayede STS çalışmalarının temel aşamaları hakkında bilgi sahibi olunmuştur.

Visual Basic.Net Yeni 2 Adet Tema Süperler

Merhaba Arkadaşlar

   Başlıktanda Anlaşıldığı gibi 2 adet bomba temalarımız var. sözü Fazla Uzatmadan Hemen Temaları Veriyorum .





1. KONU



2.TEMA



1.TEMA KODLAR


İthalat System.Drawing.Drawing2D
İthalat System.ComponentModel
İthalat System.Runtime.ınteropservices
MustInherit Sınıf Tema
    Inherits ContainerControl

#Region "Başlatma"

    Korumalı G gibi Grafik
    Sub New ()
        SetStyle (DirectCast (139.270, ControlStyles), True)
    End Sub

    As Boolean Private ParentIsForm
    Korumalı Overrides Sub OnHandleCreated (EventArgs ByVal e As)
        Dok = DockStyle.Fill
        ParentIsForm = TypeOf Veli Formu mi
        Sonra ParentIsForm Eğer
            Değil _TransparencyKey = Color.Empty sonra ParentForm.TransparencyKey = _TransparencyKey halinde
            ParentForm.FormBorderStyle = FormBorderStyle.None
        End If
        MyBase.OnHandleCreated (e)
    End Sub

    As String Overrides Mülkiyet Metin ()
        Almak
            Dönüş MyBase.Text
        Get End
        Set (As String ByVal v)
            MyBase.Text = h
            () Geçersiz
        Bitiş Seti
    End Property
#end Bölge

#Region "Boyutlandırma ve Hareket"

    As Boolean Private _Resizable = true
    As Boolean Property Resizable ()
        Almak
            Dönüş _Resizable
        Get End
        Set (As Boolean ByVal değeri)
            _Resizable = value
        Bitiş Seti
    End Property

    Özel _MoveHeight Tamsayı 24 = Adı
    As Integer Property MoveHeight ()
        Almak
            Dönüş _MoveHeight
        Get End
        Set (As Integer ByVal v)
            _MoveHeight = H
            Header = Yeni Dikdörtgen (7, 7, Genişlik - 14 _MoveHeight - 7)
        Bitiş Seti
    End Property

    As IntPtr özel Bayrak
    Korumalı Overrides Sub OnMouseDown (MouseEventArgs ByVal e As)
        Değil e.Button = Sonra MouseButtons.Left dön eğer
        ParentIsForm Sonra ise ParentForm.WindowState = FormWindowState.Maximized Dönüş Sonra ise

        Sonra Header.Contains (e.Location) ise
            Flag = Yeni ıntptr (2)
        ElseIf Current.Position = 0 ya da değil Sonra _Resizable
            Dönüş
        Başka
            Flag = Yeni ıntptr (Current.Position)
        End If

        Yakalama = False
        DefWndProc (Message.Create (Parent.Handle, 161, Bayrak, hiçbir şey))

        MyBase.OnMouseDown (e)
    End Sub

    Özel Yapısı Pointer
        ReadOnly İmleç olarak İmleç, As Byte pozisyonu
        Sub New (İmleç olarak ByVal c, As Byte ByVal p)
            = C İmleç
            Pozisyonu = p
        End Sub
    Bitiş Yapısı

    Özel F1, F2, F3, As Boolean F4, PTC gibi Noktası
    Pointer gibi özel Function GetPointer ()
        PTC = PointToClient (MousePosition)
        F1 = PTC.X <7
        F2 = PTC.X> Genişlik - 7
        F3 = PTC.Y <7
        F4 = PTC.Y> Yükseklik - 7

        F1 Ve F3 Sonra İade Eğer Yeni Pointer (Cursors.SizeNWSE, 13)
        F1 Ve F4 Sonra İade Eğer Yeni Pointer (Cursors.SizeNESW, 16)
        F2 Ve F3 Sonra İade Eğer Yeni Pointer (Cursors.SizeNESW, 14)
        F2 Ve F4 Sonra İade Eğer Yeni Pointer (Cursors.SizeNWSE, 17)
        Eğer F1 Sonra Dönüş Yeni Pointer (Cursors.SizeWE, 10)
        Eğer F2 Sonra Dönüş Yeni Pointer (Cursors.SizeWE, 11)
        F3 Ardından, Yeni Pointer dön if (Cursors.SizeNS, 12)
        F4 Ardından, Yeni Pointer dön if (Cursors.SizeNS, 15)
        Dönüş Yeni Pointer (Cursors.Default, 0)
    End Function

    Pointer gibi Bekleyen Özel Cari,
    Private Sub setCurrent ()
        Bekleyen = GetPointer ()
        Current.Position = Sonra Pending.Position dön eğer
        Mevcut = GetPointer ()
        = Current.Cursor İmleç
    End Sub

    Korumalı Overrides Sub OnMouseMove (MouseEventArgs ByVal e As)
        Eğer _Resizable sonra setCurrent ()
        MyBase.OnMouseMove (e)
    End Sub

    Dikdörtgen olarak Korumalı vurusu
    Korumalı Overrides Sub OnSizeChanged (EventArgs ByVal e As)
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise
        Header = Yeni Dikdörtgen (7, 7, Genişlik - 14 _MoveHeight - 7)
        () Geçersiz
        MyBase.OnSizeChanged (e)
    End Sub

#end Bölge

#Region "Convienence"

    MustOverride Alt PaintHook ()
    Korumalı NotOverridable Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise
        G = e.Graphics
        PaintHook ()
    End Sub

    Renk olarak özel _TransparencyKey
    Renk olarak Property TransparencyKey ()
        Almak
            Dönüş _TransparencyKey
        Get End
        Set (Color ByVal v)
            _TransparencyKey = H
            () Geçersiz
        Bitiş Seti
    End Property

    Özel _Image gibi Görüntü
    Mülkiyet Görüntü () As Image
        Almak
            Dönüş _Image
        Get End
        Set (As Image ByVal değeri)
            _Image = Değer
            () Geçersiz
        Bitiş Seti
    End Property
    As Integer ReadOnly özelliği ImageWidth ()
        Almak
            _Image Şey mi eğer Sonra 0 Dönüş
            Dönüş _Image.Width
        Get End
    End Property

    Boyutu itibariyle özel _Size
    Özel _Rectangle gibi Dikdörtgen
    LinearGradientBrush gibi özel _Gradient
    Özel _Brush olarak SolidBrush

    Korumalı Alt DrawCorners (Color ByVal c, Dikdörtgen olarak ByVal ru)
        _Brush = Yeni SolidBrush (c)
        G.FillRectangle (_Brush, rect.X, rect.Y, 1, 1)
        G.FillRectangle (_Brush, rect.X + (rect.Width - 1), rect.Y, 1, 1)
        G.FillRectangle (_Brush, rect.X, rect.Y + (rect.Height - 1), 1, 1)
        G.FillRectangle (_Brush, rect.X + (rect.Width - 1), rect.Y + (rect.Height - 1), 1, 1)
    End Sub

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal p2 Kalem, Dikdörtgen olarak ByVal rect gibi)
        G.DrawRectangle (P1, rect.X, rect.Y, rect.Width - 1, rect.Height - 1)
        G.DrawRectangle (P2, rect.X + 1, rect.Y + 1, rect.Width - 3, rect.Height - 3)
    End Sub

    Alt DrawText Korumalı (As a HorizontalAlignment ByVal, Renk olarak ByVal c, ByVal x As Integer)
        DrawText (a, c, x, 0)
    End Sub
    Alt DrawText Korumalı (As a HorizontalAlignment ByVal, Renk olarak ByVal c, ByVal x Integer, Integer olarak ByVal y gibi)
        String.IsNullOrEmpty (Metin) Sonra Dönüşü ise
        _Size = G.MeasureString (Metin, Font) .ToSize
        _Brush = Yeni SolidBrush (c)

        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawString (Metin, Yazı, _Brush, x _MoveHeight \ 2 - _Size.Height \ 2 + y)
            Vaka HorizontalAlignment.Right
                G.DrawString (Metin, Yazı, _Brush, Genişlik - _Size.Width - x, _MoveHeight 2 \ - _Size.Height \ 2 + y)
            Neredeyse HorizontalAlignment.Center
                G.DrawString (Metin, Yazı, _Brush, Genişlik \ 2 - _Size.Width \ 2 + x, _MoveHeight \ 2 - _Size.Height \ 2 + y)
        End Select
    End Sub

    Korumalı Alt DrawIcon (As a HorizontalAlignment ByVal, ByVal x As Integer)
        DrawIcon (A, X, 0)
    End Sub
    Korumalı Alt DrawIcon (As a HorizontalAlignment ByVal, ByVal x Integer, Integer olarak ByVal y gibi)
        _Image Hiçbir Sonra İade mı varsa
        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawImage (_Image, x _MoveHeight \ 2 - _Image.Height \ 2 + y)
            Vaka HorizontalAlignment.Right
                G.DrawImage (_Image, Genişlik - _Image.Width - x, _MoveHeight 2 \ - _Image.Height \ 2 + y)
            Neredeyse HorizontalAlignment.Center
                G.DrawImage (_Image, Genişlik \ 2 - _Image.Width \ 2, _MoveHeight \ 2 - _Image.Height \ 2)
        End Select
    End Sub

    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        _Rectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        _Gradient = Yeni LinearGradientBrush (_Rectangle, C1, C2, açı)
        G.FillRectangle (_Gradient, _Rectangle)
    End Sub

#end Bölge

End Class
Modül Kurası
    GraphicsPath gibi Public Function RoundRect (ByVal Dikdörtgen olarak Dikdörtgen As Integer, ByVal Eğrisi)
        () GraphicsPath = Yeni GraphicsPath zamanda P Dim
        As Integer ArcRectangleWidth Dim = Eğrisi * 2
        P.AddArc (Yeni Dikdörtgen (Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -180, 90)
        P.AddArc (Yeni Dikdörtgen (Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -90, 90)
        P.AddArc (Yeni Dikdörtgen (Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 0, 90)
        P.AddArc (Yeni Dikdörtgen (Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 90, 90)
        P.AddLine (Yeni Nokta (Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y) New Point (Rectangle.X, Eğri + Rectangle.Y))
        Dönüş P
    End Function
    GraphicsPath gibi 'Public Function RoundRect (As Integer ByVal X, Integer, Integer olarak ByVal Genişlik As Integer, ByVal Yükseklik As Integer, ByVal Curve ByVal Y)
    'Dim Dikdörtgen olarak Dikdörtgen = Yeni Dikdörtgen (X, Y, Genişlik, Yükseklik)
    GraphicsPath = Yeni GraphicsPath gibi 'Dim P ()
    'Dim As Integer ArcRectangleWidth = Eğrisi * 2
    'P.AddArc (Yeni Dikdörtgen (Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -180, 90)
    'P.AddArc (Yeni Dikdörtgen (Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -90, 90)
    'P.AddArc (Yeni Dikdörtgen (Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 0, 90)
    'P.AddArc (Yeni Dikdörtgen (Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 90, 90)
    'P.AddLine (Yeni Nokta (Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y) New Point (Rectangle.X, Eğri + Rectangle.Y))
    'Dönüş P
    'End Function
End Module
MustInherit Sınıf ThemeControl
    Inherits Kontrol

#Region "Başlatma"

    Grafik, Bitmap Olarak B olarak G Korumalı
    Sub New ()
        SetStyle (DirectCast (139.270, ControlStyles), True)
        B = Yeni Bitmap (1, 1)
        G = Graphics.FromImage (B)
    End Sub

    Alt AllowTransparent ()
        SetStyle (ControlStyles.Opaque, False)
        SetStyle (ControlStyles.SupportsTransparentBackColor, True)
    End Sub

    As String Overrides Mülkiyet Metin ()
        Almak
            Dönüş MyBase.Text
        Get End
        Set (As String ByVal v)
            MyBase.Text = h
            () Geçersiz
        Bitiş Seti
    End Property
#end Bölge

#Region "Fare Kullanma"

    Korumalı Enum Devlet olarak Bayt
        MouseNone = 0
        MouseOver = 1
        MouseDown = 2
    End Enum

    Korumalı MouseState olarak Devlet
    Korumalı Overrides Sub OnMouseLeave (EventArgs ByVal e As)
        ChangeMouseState (State.MouseNone)
        MyBase.OnMouseLeave (e)
    End Sub
    Korumalı Overrides Sub OnMouseEnter (EventArgs ByVal e As)
        ChangeMouseState (State.MouseOver)
        MyBase.OnMouseEnter (e)
    End Sub
    Korumalı Overrides Sub OnMouseUp (MouseEventArgs ByVal e As)
        ChangeMouseState (State.MouseOver)
        MyBase.OnMouseUp (e)
    End Sub
    Korumalı Overrides Sub OnMouseDown (MouseEventArgs ByVal e As)
        E.Button = MouseButtons.Left Sonra ChangeMouseState (State.MouseDown) ise
        MyBase.OnMouseDown (e)
    End Sub

    Private Sub ChangeMouseState (Devlet ByVal e As)
        MouseState = E
        () Geçersiz
    End Sub

#end Bölge

#Region "Convienence"

    MustOverride Alt PaintHook ()
    Korumalı NotOverridable Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise
        PaintHook ()
        e.Graphics.DrawImage (B, 0, 0)
    End Sub

    Korumalı Overrides Sub OnSizeChanged (EventArgs ByVal e As)
        Eğer Değil Genişliği = 0 AndAlso değil Yükseklik Sonra = 0
            B = Yeni Bitmap (Genişlik, Yükseklik)
            G = Graphics.FromImage (B)
            () Geçersiz
        End If
        MyBase.OnSizeChanged (e)
    End Sub

    As Boolean Private _NoRounding
    As Boolean Property NoRounding ()
        Almak
            Dönüş _NoRounding
        Get End
        Set (As Boolean ByVal v)
            _NoRounding = H
            () Geçersiz
        Bitiş Seti
    End Property

    Özel _Image gibi Görüntü
    Mülkiyet Görüntü () As Image
        Almak
            Dönüş _Image
        Get End
        Set (As Image ByVal değeri)
            _Image = Değer
            () Geçersiz
        Bitiş Seti
    End Property
    As Integer ReadOnly özelliği ImageWidth ()
        Almak
            _Image Şey mi eğer Sonra 0 Dönüş
            Dönüş _Image.Width
        Get End
    End Property
    As Integer ReadOnly özelliği ImageTop ()
        Almak
            _Image Şey mi eğer Sonra 0 Dönüş
            Dönüş Yükseklik \ 2 - _Image.Height \ 2
        Get End
    End Property

    Boyutu itibariyle özel _Size
    Özel _Rectangle gibi Dikdörtgen
    LinearGradientBrush gibi özel _Gradient
    Özel _Brush olarak SolidBrush

    Korumalı Alt DrawCorners (Color ByVal c, Dikdörtgen olarak ByVal ru)
        Sonra Return _NoRounding ise

        B.SetPixel (rect.X, rect.Y c)
        B.SetPixel (rect.X + (rect.Width - 1), rect.Y c)
        B.SetPixel (rect.X, rect.Y + (rect.Height - 1) c)
        B.SetPixel (rect.X + (rect.Width - 1), rect.Y + (rect.Height - 1) c)
    End Sub

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal p2 Kalem, Dikdörtgen olarak ByVal rect gibi)
        G.DrawRectangle (P1, rect.X, rect.Y, rect.Width - 1, rect.Height - 1)
        G.DrawRectangle (P2, rect.X + 1, rect.Y + 1, rect.Width - 3, rect.Height - 3)
    End Sub

    Alt DrawText Korumalı (As a HorizontalAlignment ByVal, Renk olarak ByVal c, ByVal x As Integer)
        DrawText (a, c, x, 0)
    End Sub
    Alt DrawText Korumalı (As a HorizontalAlignment ByVal, Renk olarak ByVal c, ByVal x Integer, Integer olarak ByVal y gibi)
        String.IsNullOrEmpty (Metin) Sonra Dönüşü ise
        _Size = G.MeasureString (Metin, Font) .ToSize
        _Brush = Yeni SolidBrush (c)

        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawString (Metin, Yazı, _Brush, x Yükseklik \ 2 - _Size.Height \ 2 + y)
            Vaka HorizontalAlignment.Right
                G.DrawString (Metin, Yazı, _Brush, Genişlik - _Size.Width - x Yükseklik \ 2 - _Size.Height \ 2 + y)
            Neredeyse HorizontalAlignment.Center
                G.DrawString (Metin, Yazı, _Brush, Genişlik \ 2 - _Size.Width \ 2 + x, Yükseklik \ 2 - _Size.Height \ 2 + y)
        End Select
    End Sub

    Korumalı Alt DrawIcon (As a HorizontalAlignment ByVal, ByVal x As Integer)
        DrawIcon (A, X, 0)
    End Sub
    Korumalı Alt DrawIcon (As a HorizontalAlignment ByVal, ByVal x Integer, Integer olarak ByVal y gibi)
        _Image Hiçbir Sonra İade mı varsa
        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawImage (_Image, x Yükseklik \ 2 - _Image.Height \ 2 + y)
            Vaka HorizontalAlignment.Right
                G.DrawImage (_Image, Genişlik - _Image.Width - x Yükseklik \ 2 - _Image.Height \ 2 + y)
            Neredeyse HorizontalAlignment.Center
                G.DrawImage (_Image, Genişlik \ 2 - _Image.Width \ 2, Boyut \ 2 - _Image.Height \ 2)
        End Select
    End Sub

    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        _Rectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        _Gradient = Yeni LinearGradientBrush (_Rectangle, C1, C2, açı)
        G.FillRectangle (_Gradient, _Rectangle)
    End Sub
#end Bölge

End Class
MustInherit Sınıf ThemeContainerControl
    Inherits ContainerControl

#Region "Başlatma"

    Grafik, Bitmap Olarak B olarak G Korumalı
    Sub New ()
        SetStyle (DirectCast (139.270, ControlStyles), True)
        B = Yeni Bitmap (1, 1)
        G = Graphics.FromImage (B)
    End Sub

    Alt AllowTransparent ()
        SetStyle (ControlStyles.Opaque, False)
        SetStyle (ControlStyles.SupportsTransparentBackColor, True)
    End Sub

#end Bölge
#Region "Convienence"

    MustOverride Alt PaintHook ()
    Korumalı NotOverridable Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise
        PaintHook ()
        e.Graphics.DrawImage (B, 0, 0)
    End Sub

    Korumalı Overrides Sub OnSizeChanged (EventArgs ByVal e As)
        Eğer Değil Genişliği = 0 AndAlso değil Yükseklik Sonra = 0
            B = Yeni Bitmap (Genişlik, Yükseklik)
            G = Graphics.FromImage (B)
            () Geçersiz
        End If
        MyBase.OnSizeChanged (e)
    End Sub

    As Boolean Private _NoRounding
    As Boolean Property NoRounding ()
        Almak
            Dönüş _NoRounding
        Get End
        Set (As Boolean ByVal v)
            _NoRounding = H
            () Geçersiz
        Bitiş Seti
    End Property

    Özel _Rectangle gibi Dikdörtgen
    LinearGradientBrush gibi özel _Gradient

    Korumalı Alt DrawCorners (Color ByVal c, Dikdörtgen olarak ByVal ru)
        Sonra Return _NoRounding ise
        B.SetPixel (rect.X, rect.Y c)
        B.SetPixel (rect.X + (rect.Width - 1), rect.Y c)
        B.SetPixel (rect.X, rect.Y + (rect.Height - 1) c)
        B.SetPixel (rect.X + (rect.Width - 1), rect.Y + (rect.Height - 1) c)
    End Sub

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal p2 Kalem, Dikdörtgen olarak ByVal rect gibi)
        G.DrawRectangle (P1, rect.X, rect.Y, rect.Width - 1, rect.Height - 1)
        G.DrawRectangle (P2, rect.X + 1, rect.Y + 1, rect.Width - 3, rect.Height - 3)
    End Sub

    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        _Rectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        _Gradient = Yeni LinearGradientBrush (_Rectangle, C1, C2, açı)
        G.FillRectangle (_Gradient, _Rectangle)
    End Sub
#end Bölge

End Class

Sınıf TxtBox
    Inherits ThemeControl
    Yeni TextBox Dim WithEvents txtbox
#Region "Lol"
    Özel _passmask Boolean = False olarak
    As Boolean Public Shadows Property UseSystemPasswordChar ()
        Almak
            _passmask Dön
        Get End
        Set (As Boolean ByVal v)
            txtbox.UseSystemPasswordChar = UseSystemPasswordChar
            _passmask h =
            () Geçersiz
        Bitiş Seti
    End Property
    As Integer Private _maxchars = 32767
    As Integer Public Shadows Property MaxLength ()
        Almak
            Dönüş _maxchars
        Get End
        Set (As Integer ByVal v)
            _maxchars = h
            txtbox.MaxLength = MaxLength
            () Geçersiz
        Bitiş Seti
    End Property
    HorizontalAlignment gibi özel _align
    HorizontalAlignment olarak Kamu Shadows Property TextAlignment ()
        Almak
            _align Dön
        Get End
        Set (HorizontalAlignment ByVal v)
            _align = v
            () Geçersiz
        Bitiş Seti
    End Property

    Korumalı Overrides Sub OnPaintBackground (ByVal pevent System.Windows.Forms.PaintEventArgs gibi)
    End Sub
    Korumalı Overrides Sub OnTextChanged (System.EventArgs ByVal e As)
        MyBase.OnTextChanged (e)
        () Geçersiz
    End Sub
    Korumalı Overrides Sub OnBackColorChanged (System.EventArgs ByVal e As)
        MyBase.OnBackColorChanged (e)
        txtbox.BackColor = BackColor
        () Geçersiz
    End Sub
    Korumalı Overrides Sub OnForeColorChanged (System.EventArgs ByVal e As)
        MyBase.OnForeColorChanged (e)
        txtbox.ForeColor = ForeColor
        () Geçersiz
    End Sub
    Korumalı Overrides Sub OnFontChanged (System.EventArgs ByVal e As)
        MyBase.OnFontChanged (e)
        txtbox.Font = Yazı
    End Sub
    Korumalı Overrides Sub OnGotFocus (System.EventArgs ByVal e As)
        MyBase.OnGotFocus (e)
        txtbox.Focus ()
    End Sub
    Alt TextChngTxtBox () txtbox.TextChanged Kolları
        Text = txtbox.Text
    End Sub
    Alt TextChng () MyBase.TextChanged Kolları
        txtbox.Text = Metin
    End Sub

#end Bölge

    Korumalı Overrides Sub WndProc (Message gibi ByRef m)
        Vaka m.Msg seçin
            Vaka 15
                () Geçersiz
                MyBase.WndProc (m)
                Me.PaintHook ()
                Çık Seç
            Else Vaka
                MyBase.WndProc (m)
                Çık Seç
        End Select
    End Sub

    Sub New ()
        MyBase.New ()

        Controls.Add (txtbox)
        Txtbox ile
            .Multiline = False
            .BackColor = Color.FromArgb (0, 0, 0)
            .ForeColor = ForeColor
            .Text = String.Empty
            .TextAlign = HorizontalAlignment.Center
            .BorderStyle = BorderStyle.None
            .location = Yeni Noktası (5, 8)
            .Font = Yeni Font ("Arial", 8.25F, FontStyle.BOLD)
            .Size = Yeni Boyut (Genişlik - 8, Yükseklik - 11)
            .UseSystemPasswordChar = UseSystemPasswordChar
        End With

        Text = ""

        DoubleBuffered = True
    End Sub

    ) (Sub PaintHook geçersiz kılar
        Me.BackColor = Color.White
        G.Clear (Parent.BackColor)
        Yeni Kalem gibi s Dim (Color.FromArgb (204, 204, 204), 1)
        O Dim Yeni Kalem gibi (Color.FromArgb (249, 249, 249), 8)
        G.FillPath (Brushes.White, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 2))
        G.DrawPath (o, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 2))
        G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 2))
        Height = txtbox.Height + 16
        Yeni Yazı ("Tahoma", 9, FontStyle.REGULAR) olarak drawFont Dim
        Txtbox ile
            .Width = Genişliği - 12
            .ForeColor = Color.FromArgb (72, 72, 72)
            .Font = DrawFont
            .TextAlign = TextAlignment
            .UseSystemPasswordChar = UseSystemPasswordChar
        End With
        DrawCorners (Parent.BackColor, ClientRectangle)
    End Sub
End Class

Sınıf PanelBox
    Inherits ThemeContainerControl
    As Boolean Private _Checked
    Sub New ()
        AllowTransparent ()
    End Sub
    ) (Sub PaintHook geçersiz kılar
        Me.Font = Yeni Font ("Tahoma", 10)
        Me.ForeColor = Color.FromArgb (40, 40, 40)
        G.SmoothingMode = SmoothingMode.AntiAlias
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (235, 235, 235)), Yeni Dikdörtgen (2, 0, Genişlik, Yükseklik))
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (249, 249, 249)), Yeni Dikdörtgen (1, 0, Genişlik - 3, Yükseklik - 4))
        G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 2, Yükseklik - 3)
    End Sub
End Class
Sınıf GroupDropBox
    Inherits ThemeContainerControl
    As Boolean Private _Checked
    As Integer Private X
    As Integer Private y
    Boyutu itibariyle özel _OpenedSize

    Public Property As Boolean Kontrol
        Almak
            Dönüş _Checked
        Get End
        Set (As Boolean ByVal V)
            _Checked = V
            () Geçersiz
        Bitiş Seti
    End Property
    Public Property OpenSize olarak Boyutu
        Almak
            Dönüş _OpenedSize
        Get End
        Set(ByVal V As Size)
            _OpenedSize = V
            () Geçersiz
        Bitiş Seti
    End Property
    Sub New ()
        AllowTransparent ()
        Size = Yeni Boyut (90, 30)
        MinimumSize = New Size(5, 30)
        = True _Checked
    End Sub
    ) (Sub PaintHook geçersiz kılar
        Me.Font = Yeni Font ("Tahoma", 10)
        Me.ForeColor = Color.FromArgb (40, 40, 40)
        _Checked Sonra = True ise
            G.SmoothingMode = SmoothingMode.AntiAlias
            G.Clear (Color.FromArgb (245, 245, 245))
            G.FillRectangle (Yeni SolidBrush (Color.FromArgb (231, 231, 231)), Yeni Dikdörtgen (0, 0, Genişlik, 30))
            G.DrawLine (Yeni Kalem (Color.FromArgb (233, 238, 240)), 1, 1, Genişlik - 2, 1)
            G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 1, Yükseklik - 1)
            G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 1, 30),
            Me.Size = _OpenedSize
            G.DrawString ("t" Yeni yazı tipi ("Marlett", 12), yeni SolidBrush (Me.ForeColor), Genişlik - 25, 5)
        Başka
            G.SmoothingMode = SmoothingMode.AntiAlias
            G.Clear (Color.FromArgb (245, 245, 245))
            G.FillRectangle (Yeni SolidBrush (Color.FromArgb (231, 231, 231)), Yeni Dikdörtgen (0, 0, Genişlik, 30))
            G.DrawLine (Yeni Kalem (Color.FromArgb (231, 236, 238)), 1, 1, Genişlik - 2, 1)
            G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 1, Yükseklik - 1)
            G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 1, 30),
            Me.Size = Yeni Boyut (Genişlik, 30)
            G.DrawString ("u" Yeni Font ("Marlett", 12), Yeni SolidBrush (Me.ForeColor), Genişlik - 25, 5)
        End If
        G.DrawString (Metin, Yazı, Yeni SolidBrush (Me.ForeColor), 7, 6)
    End Sub

    Private Sub meResize (As Object ByVal sender, System.EventArgs ByVal e As) Me.Resize Kolları
        _Checked Sonra = True ise
            _OpenedSize = Me.Size
        Başka
        End If
    End Sub


    Korumalı Overrides Sub OnMouseMove (ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseMove (e)
        X = eX
        y = keşfedilmiştir
        () Geçersiz
    End Sub

    Alt changeCheck () Me.MouseDown Kolları


        X> = Genişlik ise - 22 O
            Y <Eğer = 30 Ardından
                Select Case Kontrol
                    Vaka Gerçek
                        İşaretli = False
                    Yanlış Vaka
                        İşaretli = True
                End Select
            End If
        End If
    End Sub
End Class
Sınıf GroupPanelBox
    Inherits ThemeContainerControl
    As Boolean Private _Checked
    Sub New ()
        AllowTransparent ()
    End Sub
    ) (Sub PaintHook geçersiz kılar
        Me.Font = Yeni Font ("Tahoma", 10)
        Me.ForeColor = Color.FromArgb (40, 40, 40)
        G.SmoothingMode = SmoothingMode.AntiAlias
        G.Clear (Color.FromArgb (245, 245, 245))
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (231, 231, 231)), Yeni Dikdörtgen (0, 0, Genişlik, 30))
        G.DrawLine (Yeni Kalem (Color.FromArgb (233, 238, 240)), 1, 1, Genişlik - 2, 1)
        G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 1, Yükseklik - 1)
        G.DrawRectangle (Yeni Kalem (Color.FromArgb (214, 214, 214)), 0, 0, Genişlik - 1, 30),
        G.DrawString (Metin, Yazı, Yeni SolidBrush (Me.ForeColor), 7, 6)
    End Sub
End Class

Sınıf ButtonGreen
    Inherits ThemeControl
    ) (Sub PaintHook geçersiz kılar
        Me.Font = Yeni Font ("Arial", 10)
        G.Clear (Me.BackColor)
        G.SmoothingMode = SmoothingMode.HighQuality
        Vaka MouseState seçin
            Vaka State.MouseNone
                Yeni Kalem gibi s Dim (Color.FromArgb (120, 159, 22), 1)
                Yeni LinearGradientBrush (ClientRectangle, Color.FromArgb (157, 209, 57), Color.FromArgb (130, 181, 18), LinearGradientMode.Vertical) Dim X
                G.FillPath (x, Draw.RoundRect (ClientRectangle, 4))
                G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 3))
                G.DrawLine (Yeni Kalem (Color.FromArgb (190, 232, 109)), 2, 1, Genişlik - 3, 1)
                DrawText (HorizontalAlignment.Center, Color.FromArgb (240, 240, 240), 0)
            Vaka State.MouseDown
                Yeni Kalem gibi s Dim (Color.FromArgb (120, 159, 22), 1)
                Yeni LinearGradientBrush (ClientRectangle, Color.FromArgb (125, 171, 25), Color.FromArgb (142, 192, 40), LinearGradientMode.Vertical) Dim X
                G.FillPath (x, Draw.RoundRect (ClientRectangle, 4))
                G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 3))
                G.DrawLine (Yeni Kalem (Color.FromArgb (142, 172, 30)) 2, 1, Genişlik - 3, 1)
                DrawText (HorizontalAlignment.Center, Color.FromArgb (250, 250, 250), 1)
            Vaka State.MouseOver
                Yeni Kalem gibi s Dim (Color.FromArgb (120, 159, 22), 1)
                Yeni LinearGradientBrush (ClientRectangle, Color.FromArgb (165, 220, 59), Color.FromArgb (137, 191, 18), LinearGradientMode.Vertical) Dim X
                G.FillPath (x, Draw.RoundRect (ClientRectangle, 4))
                G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 3))
                G.DrawLine (Yeni Kalem (Color.FromArgb (190, 232, 109)), 2, 1, Genişlik - 3, 1)
                DrawText (HorizontalAlignment.Center, Color.FromArgb (240, 240, 240), -1)
        End Select
        Me.Cursor = Cursors.Hand
    End Sub
End Class
Sınıf ButtonBlue
    Inherits ThemeControl
    ) (Sub PaintHook geçersiz kılar
        Me.Font = Yeni Font ("Arial", 10)
        G.Clear (Me.BackColor)
        G.SmoothingMode = SmoothingMode.HighQuality
        Vaka MouseState seçin
            Vaka State.MouseNone
                Yeni Kalem gibi s Dim (Color.FromArgb (34, 112, 171), 1)
                Yeni LinearGradientBrush (ClientRectangle, Color.FromArgb (51, 159, 231), Color.FromArgb (33, 128, 206), LinearGradientMode.Vertical) Dim X
                G.FillPath (x, Draw.RoundRect (ClientRectangle, 4))
                G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 3))
                G.DrawLine (Yeni Kalem (Color.FromArgb (131, 197, 241)), 2, 1, Genişlik - 3, 1)
                DrawText (HorizontalAlignment.Center, Color.FromArgb (240, 240, 240), 0)
            Vaka State.MouseDown
                Yeni Kalem gibi s Dim (Color.FromArgb (34, 112, 171), 1)
                Yeni LinearGradientBrush (ClientRectangle, Color.FromArgb (37, 124, 196), Color.FromArgb (53, 153, 219), LinearGradientMode.Vertical) Dim X
                G.FillPath (x, Draw.RoundRect (ClientRectangle, 4))
                G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 3))

                DrawText (HorizontalAlignment.Center, Color.FromArgb (250, 250, 250), 1)
            Vaka State.MouseOver
                Yeni Kalem gibi s Dim (Color.FromArgb (34, 112, 171), 1)
                Yeni LinearGradientBrush (ClientRectangle, Color.FromArgb (54, 167, 243), Color.FromArgb (35, 165, 217), LinearGradientMode.Vertical) Dim X
                G.FillPath (x, Draw.RoundRect (ClientRectangle, 4))
                G.DrawPath (p, Draw.RoundRect (Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1), 3))
                G.DrawLine (Yeni Kalem (Color.FromArgb (131, 197, 241)), 2, 1, Genişlik - 3, 1)
                DrawText (HorizontalAlignment.Center, Color.FromArgb (240, 240, 240), -1)
        End Select
        Me.Cursor = Cursors.Hand
    End Sub

End Class






2.TEMA KODLAR



 'Www.kodyuvasi.com

İthalat Sistemi, System.IO, System.Collections.Generic
İthalat System.Drawinggörüntü, System.Drawing.Drawing2D
İthalat System.ComponentModel, System.Windows.Forms
İthalat System.Runtime.ınteropservices
İthalat System.Drawing.Imaging
İthalat System.Windows.Forms.TabControl
İthalat System.ComponentModel.Design


#Region "THEMEBASE"
MustInherit Sınıf ThemeContainer154
    Inherits ContainerControl

#Region "Başlatma"

    Grafik, Bitmap Olarak B olarak G Korumalı

    Sub New ()
        SetStyle (DirectCast (139.270, ControlStyles), True)

        _ImageSize = Size.Empty
        Font = Yeni Font ("Verdana", 8S)

        MeasureBitmap = Yeni Bitmap (1, 1)
        MeasureGraphics = Graphics.FromImage (MeasureBitmap)

        DrawRadialPath = Yeni GraphicsPath

        InvalidateCustimization ()
    End Sub

    Korumalı NotOverridable Overrides Sub OnHandleCreated (EventArgs ByVal e As)
        ) (DoneCreation Sonra InitializeMessages halinde

        InvalidateCustimization ()
        ColorHook ()

        Değil _LockWidth Eğer = 0 Sonra Genişliği = _LockWidth
        Değil _LockHeight = 0 Sonra Yükseklik = _LockHeight ise
        Değil _ControlMode O MyBase.Dock = DockStyle.Fill halinde

        Şeffaf = _Transparent
        _Transparent AndAlso _BackColor sonra ArkaRenk = Color.Transparent halinde

        MyBase.OnHandleCreated (e)
    End Sub

    As Boolean Private DoneCreation
    Korumalı NotOverridable Overrides Sub OnParentChanged (EventArgs ByVal e As)
        MyBase.OnParentChanged (e)

        Ana şey Sonra İade mı varsa
        _IsParentForm = TypeOf Veli Formu mi

        Sonra Değil _ControlMode ise
            InitializeMessages ()

            Sonra _IsParentForm Eğer
                ParentForm.FormBorderStyle = _BorderStyle
                ParentForm.TransparencyKey = _TransparencyKey

                Sonra Değil DesignMode ise
                    AddHandler ParentForm.Shown, AddressOf FormShown
                End If
            End If

            Parent.BackColor = BackColor
        End If

        OnCreation ()
        DoneCreation = True
        InvalidateTimer ()
    End Sub

#end Bölge

    Private Sub DoAnimation (As Boolean ByVal i)
        OnAnimation ()
        ) (I Sonra Invalidate ise
    End Sub

    Korumalı NotOverridable Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise

        Daha sonra _Transparent AndAlso _ControlMode halinde
            PaintHook ()
            e.Graphics.DrawImage (B, 0, 0)
        Başka
            G = e.Graphics
            PaintHook ()
        End If
    End Sub

    Korumalı Overrides Sub OnHandleDestroyed (EventArgs ByVal e As)
        RemoveAnimationCallback (AddressOf DoAnimation)
        MyBase.OnHandleDestroyed (e)
    End Sub

    As Boolean Private HasShown
    Private Sub FormShown (EventArgs gibi As Object ByVal sender, ByVal e)
        _ControlMode OrElse Sonra HasShown dön eğer

        _StartPosition = FormStartPosition.CenterParent OrElse _StartPosition = FormStartPosition.CenterScreen Sonra ise
            SB zamanda Dikdörtgen = Screen.PrimaryScreen.Bounds Dim
            Dikdörtgen = ParentForm.Bounds Dim CB
            ParentForm.Location = Yeni Nokta (SB.Width \ 2 - CB.Width \ 2, SB.Height \ 2 - CB.Width \ 2)
        End If

        HasShown = True
    End Sub


#Region "Boyut Kullanma"

    Dikdörtgen olarak özel Çerçeve
    Korumalı NotOverridable Overrides Sub OnSizeChanged (EventArgs ByVal e As)
        Daha sonra _Movable AndAlso değil _ControlMode halinde
            Kare = Yeni Dikdörtgen (7, 7, Genişlik - 14 _Header - 7)
        End If

        InvalidateBitmap ()
        () Geçersiz

        MyBase.OnSizeChanged (e)
    End Sub

    Korumalı Overrides Sub SetBoundsCore (ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, BoundsSpecified olarak belirtilen Integer, ByVal olarak ByVal yüksekliği gibi)
        Değil _LockWidth Eğer = 0 Sonra width = _LockWidth
        Değil _LockHeight = 0, daha sonra yüksekliğin = _LockHeight halinde
        MyBase.SetBoundsCore (x, y, genişlik, yükseklik, belirtilen)
    End Sub

#end Bölge

#Region "Devlet Kullanma"

    MouseState olarak Korumalı Devlet
    Private Sub setstate (MouseState ByVal hafta)
        Devlet = güncel
        () Geçersiz
    End Sub

    Korumalı Overrides Sub OnMouseMove (MouseEventArgs ByVal e As)
        Yoksa (_IsParentForm AndAlso ParentForm.WindowState = FormWindowState.Maximized) Daha sonra
            Eğer _Sizable AndAlso değil _ControlMode sonra InvalidateMouse ()
        End If

        MyBase.OnMouseMove (e)
    End Sub

    Korumalı Overrides Sub OnEnabledChanged (EventArgs ByVal e As)
        Etkin ise Sonra setstate (MouseState.None) Else setstate (MouseState.Block)
        MyBase.OnEnabledChanged (e)
    End Sub

    Korumalı Overrides Sub OnMouseEnter (EventArgs ByVal e As)
        Setstate (MouseState.Over)
        MyBase.OnMouseEnter (e)
    End Sub

    Korumalı Overrides Sub OnMouseUp (MouseEventArgs ByVal e As)
        Setstate (MouseState.Over)
        MyBase.OnMouseUp (e)
    End Sub

    Korumalı Overrides Sub OnMouseLeave (EventArgs ByVal e As)
        Setstate (MouseState.None)

        GetChildAtPoint (PointToClient (MousePosition)) Sonra Hiçbir Şey IsNot ise
            Daha sonra _Sizable AndAlso değil _ControlMode halinde
                = Cursors.Default İmleç
                Önceki = 0
            End If
        End If

        MyBase.OnMouseLeave (e)
    End Sub

    Korumalı Overrides Sub OnMouseDown (MouseEventArgs ByVal e As)
        E.Button = Windows.Forms.MouseButtons.Left Sonra setstate (MouseState.Down) ise

        Yoksa (_IsParentForm AndAlso ParentForm.WindowState = FormWindowState.Maximized OrElse _ControlMode) Daha sonra
            Eğer _Movable AndAlso Frame.Contains (e.Location) Daha sonra
                Yakalama = False
                WM_LMBUTTONDOWN = True
                DefWndProc (Mesajlar (0))
            ElseIf _Sizable AndAlso Önceki Değil Sonra = 0
                Yakalama = False
                WM_LMBUTTONDOWN = True
                DefWndProc (Mesajlar (Önceki))
            End If
        End If

        MyBase.OnMouseDown (e)
    End Sub

    As Boolean Private WM_LMBUTTONDOWN
    Korumalı Overrides Sub WndProc (Message gibi ByRef m)
        MyBase.WndProc (m)

        Sonra WM_LMBUTTONDOWN AndAlso m.Msg ise = 513
            WM_LMBUTTONDOWN = False

            Setstate (MouseState.Over)
            Sonra Değil _SmartBounds İade durumunda

            Sonra IsParentMdi Eğer
                CorrectBounds (Yeni Dikdörtgen (Point.Empty, Parent.Parent.Size))
            Başka
                CorrectBounds (Screen.FromControl (Parent) .WorkingArea)
            End If
        End If
    End Sub

    Nokta gibi özel GetIndexPoint
    Özel B1, B2, B3, As Boolean B4
    As Integer Private Function GetIndex ()
        GetIndexPoint = PointToClient (MousePosition)
        B 1 = GetIndexPoint.X <7
        B2 = GetIndexPoint.X> Genişlik - 7
        B3 = GetIndexPoint.Y <7
        B4 = GetIndexPoint.Y> Yükseklik - 7

        B1 AndAlso B3 varsa Sonra 4 Dönüş
        B1 AndAlso B4 ise Sonra 7 Dönüş
        B2 AndAlso B3 ise Sonra 5 Dönüş
        B2 AndAlso B4 ise Sonra 8 Dönüş
        B1 Sonra 1 Dönüş ise
        B2 Sonra 2 Dönüş ise
        B3 Sonra 3 Dönüş ise
        B4 Sonra 6 dön eğer
        0 Dönüş
    End Function

    Özel Cari Önceki As Integer
    Private Sub InvalidateMouse ()
        Mevcut = GetIndex ()
        Güncel = Önceki Sonra Dönüşü ise

        Önceki = Güncel
        Vaka Önceki seçin
            Case 0
                = Cursors.Default İmleç
            Olgu 1, 2
                = Cursors.SizeWE İmleç
            Olgu 3, 6
                = Cursors.SizeNS İmleç
            Olgu 4, 8
                = Cursors.SizeNWSE İmleç
            Olgu 5, 7
                = Cursors.SizeNESW İmleç
        End Select
    End Sub

    Mesaj olarak Özel Mesajlar (8)
    Private Sub InitializeMessages ()
        Mesajları (0) = Message.Create (Parent.Handle, 161, yeni ıntptr (2), IntPtr.Zero)
        Ben As Integer = 1 8 için için
            Mesajları (I) '= Message.Create (Parent.Handle, 161, yeni ıntptr (I + 9), IntPtr.Zero)
        Sonraki
    End Sub

    Private Sub CorrectBounds (Dikdörtgen ByVal sınırları)
        Parent.Width> bounds.Width sonra Parent.Width = bounds.Width halinde
        Parent.Height> bounds.Height sonra Parent.Height = bounds.Height halinde

        Tamsayı = Parent.Location.X zamanda X Dim
        Integer = Parent.Location.Y olarak Y Dim

        X <bounds.X X = bounds.X halinde
        Y, <bounds.Y O zaman, Y = bounds.Y halinde

        Genişliği Dim As Integer = bounds.X + bounds.Width
        As Integer Dim Yükseklik = bounds.Y + bounds.Height

        Parent.Width - X + Parent.Width> Genişliği Sonra X = Genişliği ise
        Parent.Height - Y + Parent.Height> Boy Sonra Y = Yükseklik ise

        Parent.Location = Yeni noktası (X, Y)
    End Sub

#end Bölge


#Region "Baz Özellikleri"

    Overrides Mülkiyet dock gibi DockStyle
        Almak
            Dönüş MyBase.Dock
        Get End
        Set (DockStyle ByVal değeri)
            Değil Sonra _ControlMode dön eğer
            MyBase.Dock = değer
        Bitiş Seti
    End Property

    As Boolean Private _BackColor
    <Kategori ("Çeşitli")> _
    Renk olarak Overrides Mülkiyet ArkaRenk ()
        Almak
            Dönüş MyBase.BackColor
        Get End
        Set (Color ByVal değeri)
            Sonra değeri = MyBase.BackColor İade durumunda

            Daha sonra değil IsHandleCreated AndAlso _ControlMode AndAlso değeri = Color.Transparent halinde
                _BackColor = True
                Dönüş
            End If

            MyBase.BackColor = değer
            Ana Sonra hiçbir şey IsNot ise
                Eğer Değil _ControlMode Sonra Parent.BackColor = değer
                ColorHook ()
            End If
        Bitiş Seti
    End Property

    Overrides Emlak MinimumSize olarak Boyutu
        Almak
            Dönüş MyBase.MinimumSize
        Get End
        Set (Boyut olarak ByVal değeri)
            MyBase.MinimumSize = value
            Veli Hiçbir şey IsNot varsa Sonra Parent.MinimumSize = değer
        Bitiş Seti
    End Property

    Overrides Emlak MaximumSize olarak Boyutu
        Almak
            Dönüş MyBase.MaximumSize
        Get End
        Set (Boyut olarak ByVal değeri)
            MyBase.MaximumSize = değer
            Veli Hiçbir şey IsNot varsa Sonra Parent.MaximumSize = değer
        Bitiş Seti
    End Property

    As String Overrides Mülkiyet Metin ()
        Almak
            Dönüş MyBase.Text
        Get End
        Set (As String ByVal değeri)
            MyBase.Text = değer
            () Geçersiz
        Bitiş Seti
    End Property

    Yazı şöyle Overrides Mülkiyet Font ()
        Almak
            Dönüş MyBase.Font
        Get End
        Set (Yazı ByVal değeri)
            MyBase.Font = değer
            () Geçersiz
        Bitiş Seti
    End Property

    <Browsable (Yanlış), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)> _
    Renk olarak Overrides Mülkiyet ForeColor ()
        Almak
            Dönüş Color.Empty
        Get End
        Set (Color ByVal değeri)
        Bitiş Seti
    End Property
    <Browsable (Yanlış), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)> _
    Görüntü olarak Overrides Mülkiyet Backgroundımage ()
        Almak
            Hiçbir şey Dönüş
        Get End
        Set (As Image ByVal değeri)
        Bitiş Seti
    End Property
    <Browsable (Yanlış), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)> _
    ImageLayout gibi Overrides Mülkiyet BackgroundImageLayout ()
        Almak
            Dönüş ImageLayout.None
        Get End
        Set (ImageLayout ByVal değeri)
        Bitiş Seti
    End Property

#end Bölge

#Region "Genel Özellikler"

    Özel _SmartBounds Boole = true olarak
    Mülkiyet SmartBounds () As Boolean
        Almak
            Dönüş _SmartBounds
        Get End
        Set (As Boolean ByVal değeri)
            _SmartBounds = Değer
        Bitiş Seti
    End Property

    As Boolean Private _Movable = true
    As Boolean Property Taşınır ()
        Almak
            Dönüş _Movable
        Get End
        Set (As Boolean ByVal değeri)
            _Movable = Değer
        Bitiş Seti
    End Property

    As Boolean Private _Sizable = true
    As Boolean oldukça büyük bir Property ()
        Almak
            Dönüş _Sizable
        Get End
        Set (As Boolean ByVal değeri)
            _Sizable = Değer
        Bitiş Seti
    End Property

    Renk olarak özel _TransparencyKey
    Renk olarak Property TransparencyKey ()
        Almak
            _IsParentForm AndAlso değil _ControlMode Else Sonra İade ParentForm.TransparencyKey dön _TransparencyKey ise
        Get End
        Set (Color ByVal değeri)
            Sonra değeri = _TransparencyKey İade durumunda
            _TransparencyKey = Değer

            Daha sonra _IsParentForm AndAlso değil _ControlMode halinde
                ParentForm.TransparencyKey = değer
                ColorHook ()
            End If
        Bitiş Seti
    End Property

    FormBorderStyle gibi özel _BorderStyle
    FormBorderStyle gibi Property BorderStyle ()
        Almak
            _IsParentForm AndAlso değil _ControlMode Else Sonra İade ParentForm.FormBorderStyle dön _BorderStyle ise
        Get End
        Set (FormBorderStyle ByVal değeri)
            _BorderStyle = Değer

            Daha sonra _IsParentForm AndAlso değil _ControlMode halinde
                ParentForm.FormBorderStyle = değer

                Sonra Değil değeri = FormBorderStyle.None ise
                    Yanlış = Hareketli
                    Büyükçe = False
                End If
            End If
        Bitiş Seti
    End Property

    FormStartPosition gibi özel _StartPosition
    Mülkiyet StartPosition olarak FormStartPosition
        Almak
            _IsParentForm AndAlso değil _ControlMode Else Sonra İade ParentForm.StartPosition dön _StartPosition ise
        Get End
        Set (FormStartPosition ByVal değeri)
            _StartPosition = Değer

            Daha sonra _IsParentForm AndAlso değil _ControlMode halinde
                ParentForm.StartPosition = değer
            End If
        Bitiş Seti
    End Property

    As Boolean Private _NoRounding
    As Boolean Property NoRounding ()
        Almak
            Dönüş _NoRounding
        Get End
        Set (As Boolean ByVal v)
            _NoRounding = H
            () Geçersiz
        Bitiş Seti
    End Property

    Özel _Image gibi Görüntü
    Mülkiyet Görüntü () As Image
        Almak
            Dönüş _Image
        Get End
        Set (As Image ByVal değeri)
            Değeri bir şey var mı varsa Sonra _ImageSize = Size.Empty Else _ImageSize = value.Size

            _Image = Değer
            () Geçersiz
        Bitiş Seti
    End Property

    (Dize, Color Of) Yeni Dictionary gibi özel ürünler
    Mülkiyet Renkler () Bloom gibi ()
        Almak
            Yeni Liste Olarak Dim T (Bloom Of)
            (String, Renk) Sözlük Dim E .Enumerator = Items.GetEnumerator

            E.MoveNext iken
                T.Add (Yeni Bloom (E.Current.Key, E.Current.Value))
            End While

            Dönüş T.ToArray
        Get End
        Set (Bloom gibi ByVal değeri ())
            Bloom yılında değer olarak her B
                Items.ContainsKey (B.Name) Sonra Öğeler (B.Name) = B.Value ise
            Sonraki

            InvalidateCustimization ()
            ColorHook ()
            () Geçersiz
        Bitiş Seti
    End Property

    As String Private _Customization
    As String Mülkiyet Özelleştirme ()
        Almak
            Dönüş _Customization
        Get End
        Set (As String ByVal değeri)
            Değeri = _Customization Sonra Dönüşü ise

            As Byte Dim veri ()
            Dim Öğeler Bloom () Renkler = gibi

            Denemek
                Veri = Convert.FromBase64String (değer)
                Ben As Integer = 0 Items.Length için için - 1
                    Öğeler (I) .Value = Color.FromArgb (BitConverter.ToInt32 (Data, * 4))
                Sonraki
            Yakalamak
                Dönüş
            End Try

            _Customization = Değer

            Renkler = Öğeler
            ColorHook ()
            () Geçersiz
        Bitiş Seti
    End Property

    As Boolean Private _Transparent
    As Boolean Şeffaf Property ()
        Almak
            Dönüş _Transparent
        Get End
        Set (As Boolean ByVal değeri)
            _Transparent = Değer
            Değil (IsHandleCreated OrElse _ControlMode) Sonra Dönüşü ise

            Sonra AndAlso değil BackColor.A = 255 değer değil ise
                ("Şeffaf ArkaRenk kullanımda iken false değerini değiştirmek için açılamıyor.") Yeni İstisna atmak
            End If

            SetStyle (ControlStyles.Opaque Değil, değer)
            SetStyle (ControlStyles.SupportsTransparentBackColor, değer)

            InvalidateBitmap ()
            () Geçersiz
        Bitiş Seti
    End Property

#end Bölge

#Region "Özel Özellikler"

    Boyutu itibariyle özel _ImageSize
    Boyutu itibariyle Korumalı ReadOnly özelliği ImageSize ()
        Almak
            Dönüş _ImageSize
        Get End
    End Property

    As Boolean Private _IsParentForm
    ReadOnly özelliği IsParentForm As Boolean Korumalı
        Almak
            Dönüş _IsParentForm
        Get End
    End Property

    ReadOnly özelliği IsParentMdi As Boolean Korumalı
        Almak
            Veli ise, hiçbir Sonra Yanlış Dönüş
            Parent.Parent IsNot Hiçbir şey Dönüş
        Get End
    End Property

    As Integer Private _LockWidth
    Mülkiyet LockWidth () As Integer Korumalı
        Almak
            Dönüş _LockWidth
        Get End
        Set (As Integer ByVal değeri)
            _LockWidth = Değer
            Değil LockWidth = 0 AndAlso IsHandleCreated sonra genişlik = LockWidth halinde
        Bitiş Seti
    End Property

    As Integer Private _LockHeight
    Mülkiyet LockHeight () As Integer Korumalı
        Almak
            Dönüş _LockHeight
        Get End
        Set (As Integer ByVal değeri)
            _LockHeight = Değer
            Değil LockHeight = 0 AndAlso IsHandleCreated sonra Yükseklik = LockHeight halinde
        Bitiş Seti
    End Property

    Integer = 24 gibi özel _Header
    Mülkiyet başlığı () As Integer Korumalı
        Almak
            Dönüş _Header
        Get End
        Set (As Integer ByVal v)
            _Header = H

            Sonra Değil _ControlMode ise
                Kare = Yeni Dikdörtgen (7, 7, Genişlik - 14 v - 7)
                () Geçersiz
            End If
        Bitiş Seti
    End Property

    As Boolean Private _ControlMode
    As Boolean Korumalı Mülkiyet ControlMode ()
        Almak
            Dönüş _ControlMode
        Get End
        Set (As Boolean ByVal v)
            V = _ControlMode

            Şeffaf = _Transparent
            _Transparent AndAlso _BackColor sonra ArkaRenk = Color.Transparent halinde

            InvalidateBitmap ()
            () Geçersiz
        Bitiş Seti
    End Property

    As Boolean Private _IsAnimated
    As Boolean Korumalı Mülkiyet IsAnimated ()
        Almak
            Dönüş _IsAnimated
        Get End
        Set (As Boolean ByVal değeri)
            _IsAnimated Değeri =
            InvalidateTimer ()
        Bitiş Seti
    End Property

#end Bölge


#Region "Mülkiyet Yardımcılar"

    Kalem gibi Korumalı Fonksiyon GetPen (As String ByVal name)
        Dönüş Yeni Kalem (Öğeler (isim))
    End Function
    Kalem gibi Korumalı Fonksiyon GetPen (dize, As Single ByVal genişliği gibi ByVal name)
        Dönüş Yeni Kalem (Öğeler (isim), genişlik)
    End Function

    SolidBrush gibi Korumalı Fonksiyon GetBrush (As String ByVal name)
        Dönüş Yeni SolidBrush (Öğeler (isim))
    End Function

    Renk olarak Korumalı Fonksiyon GetColor (As String ByVal name)
        Dönüş Öğeler (isim)
    End Function

    Korumalı Alt SetColor (As String ByVal isim, Renk olarak ByVal değeri)
        Eğer Items.ContainsKey (isim) Sonra Öğeler (isim) = değer Else resi (ad, değer)
    End Sub
    Korumalı Alt SetColor (As String ByVal isim, As Byte ByVal r, As Byte ByVal g As Byte, ByVal b)
        SetColor (ad, Color.FromArgb (R, G, B))
    End Sub
    Korumalı Alt SetColor (String ByVal bir olarak Byte, Byte olarak ByVal r, ByVal isim ByVal g Byte, Byte olarak ByVal b gibi)
        SetColor (ad, Color.FromArgb (A, R, G, B))
    End Sub
    Korumalı Alt SetColor (String ByVal olarak ByVal adı olarak Byte, Renk olarak ByVal değeri)
        SetColor (isim, Color.FromArgb (a, değer))
    End Sub

    Private Sub InvalidateBitmap ()
        Daha sonra _Transparent AndAlso _ControlMode halinde
            Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise
            B = Yeni Bitmap (Genişlik, Yükseklik, PixelFormat.Format32bppPArgb)
            G = Graphics.FromImage (B)
        Başka
            G Hiçbir şey =
            B = Nothing
        End If
    End Sub

    Private Sub InvalidateCustimization ()
        Yeni MemoryStream gibi M Dim (Items.Count * 4)

        Renkler Bloom gibi Her B
            M.Write (BitConverter.GetBytes (B.Value.ToArgb), 0, 4)
        Sonraki

        M.Close ()
        _Customization = Convert.ToBase64String (M.ToArray)
    End Sub

    Private Sub InvalidateTimer ()
        DesignMode OrElse değil Sonra DoneCreation dön eğer

        Sonra _IsAnimated Eğer
            AddAnimationCallback (AddressOf DoAnimation)
        Başka
            RemoveAnimationCallback (AddressOf DoAnimation)
        End If
    End Sub

#end Bölge


#Region "Kullanıcı Hooks"

    Korumalı MustOverride Alt ColorHook ()
    Korumalı MustOverride Alt PaintHook ()

    Korumalı Overridable Sub OnCreation ()
    End Sub

    Korumalı Overridable Sub OnAnimation ()
    End Sub

#end Bölge


#Region "Ofset"

    Özel OffsetReturnRectangle gibi Dikdörtgen
    Ofset Korumalı Fonksiyon Dikdörtgen gibi (Dikdörtgen olarak ByVal r As Integer, ByVal tutar)
        OffsetReturnRectangle = Yeni Dikdörtgen (rX + miktarı, rY + miktarı, r.Width - (miktar * 2), r.Height - (miktar * 2))
        Dönüş OffsetReturnRectangle
    End Function

    Boyutu itibariyle özel OffsetReturnSize
    Korumalı Fonksiyon Ofset (ByVal s As Boyut As Integer, ByVal tutar) Boyutu gibi
        OffsetReturnSize = Yeni Boyut (s.Width + miktarı, s.Height + miktar)
        Dönüş OffsetReturnSize
    End Function

    Nokta gibi özel OffsetReturnPoint
    Korumalı Fonksiyon Ofset (Noktaya ByVal p As Integer, ByVal tutar) Noktası olarak
        OffsetReturnPoint = Yeni Noktası (pX + miktarı, pY + miktar)
        Dönüş OffsetReturnPoint
    End Function

#end Bölge

#Region "Merkezi"

    Özel CenterReturn gibi Noktası

    Noktası olarak Korumalı Fonksiyonu Merkezi (Dikdörtgen olarak ByVal p, Dikdörtgen olarak ByVal c)
        CenterReturn = Yeni Noktası ((p.Width \ 2 - c.Width \ 2) + pX + cX, (p.Height \ 2 - c.Height \ 2) + pY + cY)
        Dönüş CenterReturn
    End Function
    Noktası olarak Korumalı Fonksiyonu Merkezi (Dikdörtgen olarak ByVal p, Boyut olarak ByVal c)
        CenterReturn = Yeni Noktası ((p.Width \ 2 - c.Width \ 2) + pX, (p.Height \ 2 - c.Height \ 2) + pY)
        Dönüş CenterReturn
    End Function

    Noktası olarak Korumalı Fonksiyonu Merkezi (Dikdörtgen ByVal çocuk)
        Dönüş Merkezi (Genişlik, Yükseklik, child.Width, child.Height)
    End Function
    Noktası olarak Korumalı Fonksiyonu Merkezi (Boyut olarak ByVal çocuk)
        Dönüş Merkezi (Genişlik, Yükseklik, child.Width, child.Height)
    End Function
    Korumalı Fonksiyon Center Point gibi (As Integer ByVal childWidth As Integer, ByVal childHeight)
        Dönüş Merkezi (Genişlik, Yükseklik, childWidth, childHeight)
    End Function

    Noktası olarak Korumalı Fonksiyonu Merkezi (Boyut olarak ByVal p, Boyut olarak ByVal c)
        Dönüş Merkezi (p.Width, p.Height, c.Width, c.Height)
    End Function

    Noktası olarak Korumalı Fonksiyonu Merkezi (As Integer ByVal pWidth As Integer, ByVal pHeight As Integer, ByVal cWidth As Integer, ByVal cHeight)
        CenterReturn = Yeni Nokta (pWidth \ 2 - cWidth \ 2, pHeight \ 2 - cHeight \ 2)
        Dönüş CenterReturn
    End Function

#end Bölge

#Region "Tedbir"

    Bitmap Olarak Özel MeasureBitmap
    Grafik olarak özel MeasureGraphics

    Boyutu itibariyle Korumalı Fonksiyon Ölçümü ()
        SyncLock MeasureGraphics
            Dönüş MeasureGraphics.MeasureString (Metin, Yazı, Genişlik) .ToSize
        Bitiş SyncLock
    End Function
    Korumalı Fonksiyon Ölçümü Boyutu gibi (As String ByVal metin)
        SyncLock MeasureGraphics
            Dönüş MeasureGraphics.MeasureString (metin, yazı tipi, Genişlik) .ToSize
        Bitiş SyncLock
    End Function

#end Bölge


#Region "DrawPixel"

    SolidBrush gibi özel DrawPixelBrush

    Korumalı Alt DrawPixel (Color ByVal c1, ByVal x As Integer, ByVal y As Integer)
        Sonra _Transparent Eğer
            B.SetPixel (x, y, C1)
        Başka
            DrawPixelBrush = Yeni SolidBrush (C1)
            G.FillRectangle (DrawPixelBrush, x, y, 1, 1)
        End If
    End Sub

#end Bölge

#Region "DrawCorners"

    SolidBrush gibi özel DrawCornersBrush

    Korumalı Alt DrawCorners (Color ByVal c1, ByVal As Integer ofset)
        DrawCorners (c1, 0, 0, Genişlik, Yükseklik, ofset)
    End Sub
    Korumalı Alt DrawCorners (Color, ByVal r1 gibi Dikdörtgen, ByVal olarak ByVal c1 As Integer ofset)
        DrawCorners (c1, r1.X, r1.Y, r1.Width, r1.Height, ofset)
    End Sub
    (X tamsayı, tamsayı, Integer, Integer olarak ByVal yüksekliği gibi ByVal genişliği arttıkça ByVal y gibi, ByVal As Integer ofset ByVal Renk olarak ByVal c1) Korumalı Alt DrawCorners
        DrawCorners (C1, burada x + y, ofset + ofset, genişlik - (ofset * 2), yüksekliği - (ofset * 2))
    End Sub

    Korumalı Alt DrawCorners (Color ByVal c1)
        DrawCorners (c1, 0, 0, Genişlik, Yükseklik)
    End Sub
    Korumalı Alt DrawCorners (Color ByVal c1, ByVal r1 gibi Dikdörtgen)
        DrawCorners (C1, r1.X, r1.Y, r1.Width, r1.Height)
    End Sub
    Korumalı Alt DrawCorners (Color ByVal c1, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        Sonra Return _NoRounding ise

        Sonra _Transparent Eğer
            B.SetPixel (x, y, C1)
            B.SetPixel burada (x + (genişlik - 1), Y, C1)
            B.SetPixel (x, y + (yükseklik - 1), C1)
            B.SetPixel burada (x + (genişlik - 1), y + (yükseklik - 1), C1)
        Başka
            DrawCornersBrush = Yeni SolidBrush (C1)
            G.FillRectangle (DrawCornersBrush, x, y, 1, 1)
            G.FillRectangle (DrawCornersBrush, x + (genişlik - 1), y, 1, 1)
            G.FillRectangle (DrawCornersBrush x, y + (yükseklik - 1), 1, 1)
            G.FillRectangle (DrawCornersBrush, x + (genişlik - 1), y + (yükseklik - 1), 1, 1)
        End If
    End Sub

#end Bölge

#Region "DrawBorders"

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal As Integer ofset)
        DrawBorders (p1, 0, 0, Genişlik, Yükseklik, ofset)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Kalem, Dikdörtgen olarak ByVal r gibi, ByVal As Integer ofset)
        DrawBorders (P1, R x, Ry, r.Width, r.Height, ofset)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal x Integer, Integer, Integer, Integer olarak ByVal yüksekliği gibi ByVal genişliği arttıkça ByVal y gibi, ByVal As Integer ofset)
        DrawBorders (P1, burada x + y, ofset + ofset, genişlik - (ofset * 2), yüksekliği - (ofset * 2))
    End Sub

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi)
        DrawBorders (p1, 0, 0, Genişlik, Yükseklik)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, Dikdörtgen olarak ByVal r)
        DrawBorders (P1, R x, Ry, r.Width, r.Height)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        G.DrawRectangle (P1, x, y, genişlik - 1, yükseklik - 1)
    End Sub

#end Bölge

#Region "DrawText"

    Nokta gibi özel DrawTextPoint
    Boyutu itibariyle özel DrawTextSize

    Korumalı Alt DrawText (Fırça, ByVal olarak ByVal b1 HorizontalAlignment olarak, ByVal x Integer, Integer olarak ByVal y gibi)
        DrawText (B1, metin, A, X, y)
    End Sub
    Korumalı Alt DrawText (Fırça, As String ByVal metin, ByVal olarak ByVal b1 HorizontalAlignment olarak, ByVal x Integer, Integer olarak ByVal y gibi)
        Text.Length = 0 Sonra Dönüşü ise

        DrawTextSize = Tedbir (metin)
        DrawTextPoint = Yeni Nokta (Genişlik \ 2 - DrawTextSize.Width \ 2, kafa vuruşu \ 2 - DrawTextSize.Height \ 2)

        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawString (metin, yazı tipi, b1, x DrawTextPoint.Y + y)
            Neredeyse HorizontalAlignment.Center
                G.DrawString (metin, yazı tipi, b1, DrawTextPoint.X + x, DrawTextPoint.Y + y)
            Vaka HorizontalAlignment.Right
                G.DrawString (metin, yazı tipi, b1, Genişlik - DrawTextSize.Width - x, DrawTextPoint.Y + y)
        End Select
    End Sub

    Korumalı Alt DrawText (Fırça gibi ByVal b1, ByVal p1 noktası olarak)
        Text.Length = 0 Sonra Dönüşü ise
        G.DrawString (Metin, Yazı, b1, p1)
    End Sub
    Korumalı Alt DrawText (Fırça gibi ByVal b1, ByVal x Integer, Integer olarak ByVal y gibi)
        Text.Length = 0 Sonra Dönüşü ise
        G.DrawString (Metin, Yazı, b1, x, y)
    End Sub

#end Bölge

#Region "DrawImage"

    Nokta gibi özel DrawImagePoint

    Alt DrawImage Korumalı (As a HorizontalAlignment ByVal, ByVal x Integer, Integer olarak ByVal y gibi)
        DrawImage (_Image, a, x, y)
    End Sub
    Korumalı Alt DrawImage (As Image ByVal görüntü HorizontalAlignment ByVal bir, ByVal x Integer, Integer olarak ByVal y gibi)
        Görüntü Hiçbir Sonra İade mı varsa
        DrawImagePoint = Yeni Nokta (Genişlik \ 2 - image.Width \ 2, kafa vuruşu \ 2 - image.Height \ 2)

        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawImage (görüntü, x DrawImagePoint.Y + y image.Width, image.Height)
            Neredeyse HorizontalAlignment.Center
                G.DrawImage (resim, DrawImagePoint.X + x, DrawImagePoint.Y + y, image.Width, image.Height)
            Vaka HorizontalAlignment.Right
                G.DrawImage (resim, Genişlik - image.Width - x, DrawImagePoint.Y + y, image.Width, image.Height)
        End Select
    End Sub

    Korumalı Alt DrawImage (ByVal p1 noktası olarak)
        DrawImage (_Image, p1.X, p1.y)
    End Sub
    Alt DrawImage Korumalı (ByVal Integer, Integer olarak ByVal y gibi x)
        DrawImage (_Image, x, y)
    End Sub

    Korumalı Alt DrawImage (As Image ByVal görüntü, ByVal p1 noktası olarak)
        DrawImage (resim, p1.X, p1.y)
    End Sub
    Korumalı Alt DrawImage (As Image ByVal görüntü, ByVal x Integer, Integer olarak ByVal y gibi)
        Görüntü Hiçbir Sonra İade mı varsa
        G.DrawImage (resim, x, y, image.Width, image.Height)
    End Sub

#end Bölge

#Region "DrawGradient"

    LinearGradientBrush gibi özel DrawGradientBrush
    Özel DrawGradientRectangle gibi Dikdörtgen

    Alt DrawGradient Korumalı (ColorBlend gibi harman ByVal, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (harmanı DrawGradientRectangle)
    End Sub
    Alt DrawGradient Korumalı (ColorBlend gibi harman ByVal, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (harman DrawGradientRectangle, açı)
    End Sub

    Alt DrawGradient Korumalı (ColorBlend, Dikdörtgen olarak ByVal r gibi harman ByVal)
        DrawGradientBrush = Yeni LinearGradientBrush (R, Color.Empty, Color.Empty, 90.0F)
        DrawGradientBrush.InterpolationColors = harman
        G.FillRectangle (DrawGradientBrush, R)
    End Sub
    Alt DrawGradient Korumalı (ColorBlend, Dikdörtgen olarak ByVal r, As Single ByVal açısı olarak harman ByVal)
        DrawGradientBrush = Yeni LinearGradientBrush (r, Color.Empty, Color.Empty, açı)
        DrawGradientBrush.InterpolationColors = harman
        G.FillRectangle (DrawGradientBrush, R)
    End Sub


    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (C1, C2, DrawGradientRectangle)
    End Sub
    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (C1, C2, DrawGradientRectangle, açı)
    End Sub

    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r)
        DrawGradientBrush = Yeni LinearGradientBrush (R, C1, C2, 90.0F)
        G.FillRectangle (DrawGradientBrush, R)
    End Sub
    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r, As Single ByVal açısı)
        DrawGradientBrush = Yeni LinearGradientBrush (R, C1, C2, açı)
        G.FillRectangle (DrawGradientBrush, R)
    End Sub

#end Bölge

#Region "DrawRadial"

    GraphicsPath gibi özel DrawRadialPath
    PathGradientBrush gibi özel DrawRadialBrush1
    Özel DrawRadialBrush2 olarak LinearGradientBrush
    Özel DrawRadialRectangle gibi Dikdörtgen

    Alt DrawRadial (ColorBlend ByVal harman, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (harmanı, DrawRadialRectangle, \ 2 genişlik, Yükseklik \ 2)
    End Sub
    Alt DrawRadial (ColorBlend ByVal harman, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi, ByVal merkezi gibi Noktası)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (harman DrawRadialRectangle, center.X, center.Y)
    End Sub
    Alt DrawRadial (ColorBlend ByVal harman, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, ByVal cx Integer, Integer olarak ByVal cy As)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (harman DrawRadialRectangle Cx, CY)
    End Sub

    Alt DrawRadial (ColorBlend ByVal karışımı, bir dikdörtgen olarak ByVal r)
        DrawRadial (karışım, r r.Width \ 2, r.Height \ 2)
    End Sub
    Alt DrawRadial (ColorBlend, Dikdörtgen, ByVal merkezi olarak Noktaya ByVal r gibi ByVal harman)
        DrawRadial (karışım, r center.X, center.Y)
    End Sub
    Alt DrawRadial (ColorBlend ByVal harman, Dikdörtgen olarak ByVal r As Integer, ByVal cx As Integer, ByVal cy)
        DrawRadialPath.Reset ()
        DrawRadialPath.AddEllipse (Rx, Ry r.Width - 1, r.Height - 1)

        DrawRadialBrush1 = Yeni PathGradientBrush (DrawRadialPath)
        DrawRadialBrush1.CenterPoint = Yeni Noktası (rX + cx, rY + cy)
        DrawRadialBrush1.InterpolationColors = harman

        G.SmoothingMode Sonra SmoothingMode.AntiAlias ​​= Eğer
            G.FillEllipse (1 + çok DrawRadialBrush1, Rx + 1, r.Width - 3, r.Height - 3)
        Başka
            G.FillEllipse (DrawRadialBrush1, R)
        End If
    End Sub


    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (C1, C2, DrawGradientRectangle)
    End Sub
    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (C1, C2, DrawGradientRectangle, açı)
    End Sub

    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r)
        DrawRadialBrush2 = Yeni LinearGradientBrush (R, C1, C2, 90.0F)
        G.FillRectangle (DrawGradientBrush, R)
    End Sub
    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r, As Single ByVal açısı)
        DrawRadialBrush2 = Yeni LinearGradientBrush (R, C1, C2, açı)
        G.FillEllipse (DrawGradientBrush, R)
    End Sub

#end Bölge

#Region "CreateRound"

    GraphicsPath gibi özel CreateRoundPath
    Özel CreateRoundRectangle gibi Dikdörtgen

    Fonksiyon CreateRound (ByVal Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Integer ByVal eğimin gibi x) GraphicsPath gibi
        CreateRoundRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        Dönüş CreateRound (CreateRoundRectangle, eğim)
    End Function

    Fonksiyon CreateRound GraphicsPath gibi (Dikdörtgen olarak ByVal r As Integer, ByVal eğim)
        CreateRoundPath = Yeni GraphicsPath (FillMode.Winding)
        CreateRoundPath.AddArc (rX, rY, eğim, eğim, 180.0F, 90.0F)
        CreateRoundPath.AddArc (r.Right - eğim, rY, eğim, eğim, 270.0F, 90.0F)
        CreateRoundPath.AddArc (r.Right - eğim, r.Bottom - eğim, eğim, eğim, 0.0F, 90.0F)
        CreateRoundPath.AddArc (rX, r.Bottom - eğim, eğim, eğim, 90.0F, 90.0F)
        CreateRoundPath.CloseFigure ()
        Dönüş CreateRoundPath
    End Function

#end Bölge

End Class

MustInherit Sınıf ThemeControl154
    Inherits Kontrol


#Region "Başlatma"

    Grafik, Bitmap Olarak B olarak G Korumalı

    Sub New ()
        SetStyle (DirectCast (139.270, ControlStyles), True)

        _ImageSize = Size.Empty
        Font = Yeni Font ("Verdana", 8S)

        MeasureBitmap = Yeni Bitmap (1, 1)
        MeasureGraphics = Graphics.FromImage (MeasureBitmap)

        DrawRadialPath = Yeni GraphicsPath

        InvalidateCustimization () 'kaldırılsın mı?
    End Sub

    Korumalı NotOverridable Overrides Sub OnHandleCreated (EventArgs ByVal e As)
        InvalidateCustimization ()
        ColorHook ()

        Değil _LockWidth Eğer = 0 Sonra Genişliği = _LockWidth
        Değil _LockHeight = 0 Sonra Yükseklik = _LockHeight ise

        Şeffaf = _Transparent
        _Transparent AndAlso _BackColor sonra ArkaRenk = Color.Transparent halinde

        MyBase.OnHandleCreated (e)
    End Sub

    As Boolean Private DoneCreation
    Korumalı NotOverridable Overrides Sub OnParentChanged (EventArgs ByVal e As)
        Ana Sonra hiçbir şey IsNot ise
            OnCreation ()
            DoneCreation = True
            InvalidateTimer ()
        End If

        MyBase.OnParentChanged (e)
    End Sub

#end Bölge

    Private Sub DoAnimation (As Boolean ByVal i)
        OnAnimation ()
        ) (I Sonra Invalidate ise
    End Sub

    Korumalı NotOverridable Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise

        Sonra _Transparent Eğer
            PaintHook ()
            e.Graphics.DrawImage (B, 0, 0)
        Başka
            G = e.Graphics
            PaintHook ()
        End If
    End Sub

    Korumalı Overrides Sub OnHandleDestroyed (EventArgs ByVal e As)
        RemoveAnimationCallback (AddressOf DoAnimation)
        MyBase.OnHandleDestroyed (e)
    End Sub

#Region "Boyut Kullanma"

    Korumalı NotOverridable Overrides Sub OnSizeChanged (EventArgs ByVal e As)
        Sonra _Transparent Eğer
            InvalidateBitmap ()
        End If

        () Geçersiz
        MyBase.OnSizeChanged (e)
    End Sub

    Korumalı Overrides Sub SetBoundsCore (ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, BoundsSpecified olarak belirtilen Integer, ByVal olarak ByVal yüksekliği gibi)
        Değil _LockWidth Eğer = 0 Sonra width = _LockWidth
        Değil _LockHeight = 0, daha sonra yüksekliğin = _LockHeight halinde
        MyBase.SetBoundsCore (x, y, genişlik, yükseklik, belirtilen)
    End Sub

#end Bölge

#Region "Devlet Kullanma"

    As Boolean Private InPosition
    Korumalı Overrides Sub OnMouseEnter (EventArgs ByVal e As)
        InPosition = True
        Setstate (MouseState.Over)
        MyBase.OnMouseEnter (e)
    End Sub

    Korumalı Overrides Sub OnMouseUp (MouseEventArgs ByVal e As)
        InPosition Sonra setstate (MouseState.Over) ise
        MyBase.OnMouseUp (e)
    End Sub

    Korumalı Overrides Sub OnMouseDown (MouseEventArgs ByVal e As)
        E.Button = Windows.Forms.MouseButtons.Left Sonra setstate (MouseState.Down) ise
        MyBase.OnMouseDown (e)
    End Sub

    Korumalı Overrides Sub OnMouseLeave (EventArgs ByVal e As)
        InPosition = False
        Setstate (MouseState.None)
        MyBase.OnMouseLeave (e)
    End Sub

    Korumalı Overrides Sub OnEnabledChanged (EventArgs ByVal e As)
        Etkin ise Sonra setstate (MouseState.None) Else setstate (MouseState.Block)
        MyBase.OnEnabledChanged (e)
    End Sub

    MouseState olarak Korumalı Devlet
    Private Sub setstate (MouseState ByVal hafta)
        Devlet = güncel
        () Geçersiz
    End Sub

#end Bölge


#Region "Baz Özellikleri"

    <Browsable (Yanlış), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)> _
    Renk olarak Overrides Mülkiyet ForeColor ()
        Almak
            Dönüş Color.Empty
        Get End
        Set (Color ByVal değeri)
        Bitiş Seti
    End Property
    <Browsable (Yanlış), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)> _
    Görüntü olarak Overrides Mülkiyet Backgroundımage ()
        Almak
            Hiçbir şey Dönüş
        Get End
        Set (As Image ByVal değeri)
        Bitiş Seti
    End Property
    <Browsable (Yanlış), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)> _
    ImageLayout gibi Overrides Mülkiyet BackgroundImageLayout ()
        Almak
            Dönüş ImageLayout.None
        Get End
        Set (ImageLayout ByVal değeri)
        Bitiş Seti
    End Property

    As String Overrides Mülkiyet Metin ()
        Almak
            Dönüş MyBase.Text
        Get End
        Set (As String ByVal değeri)
            MyBase.Text = değer
            () Geçersiz
        Bitiş Seti
    End Property
    Yazı şöyle Overrides Mülkiyet Font ()
        Almak
            Dönüş MyBase.Font
        Get End
        Set (Yazı ByVal değeri)
            MyBase.Font = değer
            () Geçersiz
        Bitiş Seti
    End Property

    As Boolean Private _BackColor
    <Kategori ("Çeşitli")> _
    Renk olarak Overrides Mülkiyet ArkaRenk ()
        Almak
            Dönüş MyBase.BackColor
        Get End
        Set (Color ByVal değeri)
            Sonra AndAlso değeri = Color.Transparent IsHandleCreated değil ise
                _BackColor = True
                Dönüş
            End If

            MyBase.BackColor = değer
            Veli Hiçbir şey IsNot varsa Sonra ColorHook ()
        Bitiş Seti
    End Property

#end Bölge

#Region "Genel Özellikler"

    As Boolean Private _NoRounding
    As Boolean Property NoRounding ()
        Almak
            Dönüş _NoRounding
        Get End
        Set (As Boolean ByVal v)
            _NoRounding = H
            () Geçersiz
        Bitiş Seti
    End Property

    Özel _Image gibi Görüntü
    Mülkiyet Görüntü () As Image
        Almak
            Dönüş _Image
        Get End
        Set (As Image ByVal değeri)
            Değeri bir şey Sonra mı varsa
                _ImageSize = Size.Empty
            Başka
                _ImageSize = value.Size
            End If

            _Image = Değer
            () Geçersiz
        Bitiş Seti
    End Property

    As Boolean Private _Transparent
    As Boolean Şeffaf Property ()
        Almak
            Dönüş _Transparent
        Get End
        Set (As Boolean ByVal değeri)
            _Transparent = Değer
            İade Sonra IsHandleCreated değil ise

            Sonra AndAlso değil BackColor.A = 255 değer değil ise
                ("Şeffaf ArkaRenk kullanımda iken false değerini değiştirmek için açılamıyor.") Yeni İstisna atmak
            End If

            SetStyle (ControlStyles.Opaque Değil, değer)
            SetStyle (ControlStyles.SupportsTransparentBackColor, değer)

            Değeri Sonra InvalidateBitmap () Else B = Hiçbir şey varsa
            () Geçersiz
        Bitiş Seti
    End Property

    (Dize, Color Of) Yeni Dictionary gibi özel ürünler
    Mülkiyet Renkler () Bloom gibi ()
        Almak
            Yeni Liste Olarak Dim T (Bloom Of)
            (String, Renk) Sözlük Dim E .Enumerator = Items.GetEnumerator

            E.MoveNext iken
                T.Add (Yeni Bloom (E.Current.Key, E.Current.Value))
            End While

            Dönüş T.ToArray
        Get End
        Set (Bloom gibi ByVal değeri ())
            Bloom yılında değer olarak her B
                Items.ContainsKey (B.Name) Sonra Öğeler (B.Name) = B.Value ise
            Sonraki

            InvalidateCustimization ()
            ColorHook ()
            () Geçersiz
        Bitiş Seti
    End Property

    As String Private _Customization
    As String Mülkiyet Özelleştirme ()
        Almak
            Dönüş _Customization
        Get End
        Set (As String ByVal değeri)
            Değeri = _Customization Sonra Dönüşü ise

            As Byte Dim veri ()
            Dim Öğeler Bloom () Renkler = gibi

            Denemek
                Veri = Convert.FromBase64String (değer)
                Ben As Integer = 0 Items.Length için için - 1
                    Öğeler (I) .Value = Color.FromArgb (BitConverter.ToInt32 (Data, * 4))
                Sonraki
            Yakalamak
                Dönüş
            End Try

            _Customization = Değer

            Renkler = Öğeler
            ColorHook ()
            () Geçersiz
        Bitiş Seti
    End Property

#end Bölge

#Region "Özel Özellikler"

    Boyutu itibariyle özel _ImageSize
    Boyutu itibariyle Korumalı ReadOnly özelliği ImageSize ()
        Almak
            Dönüş _ImageSize
        Get End
    End Property

    As Integer Private _LockWidth
    Mülkiyet LockWidth () As Integer Korumalı
        Almak
            Dönüş _LockWidth
        Get End
        Set (As Integer ByVal değeri)
            _LockWidth = Değer
            Değil LockWidth = 0 AndAlso IsHandleCreated sonra genişlik = LockWidth halinde
        Bitiş Seti
    End Property

    As Integer Private _LockHeight
    Mülkiyet LockHeight () As Integer Korumalı
        Almak
            Dönüş _LockHeight
        Get End
        Set (As Integer ByVal değeri)
            _LockHeight = Değer
            Değil LockHeight = 0 AndAlso IsHandleCreated sonra Yükseklik = LockHeight halinde
        Bitiş Seti
    End Property

    As Boolean Private _IsAnimated
    As Boolean Korumalı Mülkiyet IsAnimated ()
        Almak
            Dönüş _IsAnimated
        Get End
        Set (As Boolean ByVal değeri)
            _IsAnimated Değeri =
            InvalidateTimer ()
        Bitiş Seti
    End Property

#end Bölge


#Region "Mülkiyet Yardımcılar"

    Kalem gibi Korumalı Fonksiyon GetPen (As String ByVal name)
        Dönüş Yeni Kalem (Öğeler (isim))
    End Function
    Kalem gibi Korumalı Fonksiyon GetPen (dize, As Single ByVal genişliği gibi ByVal name)
        Dönüş Yeni Kalem (Öğeler (isim), genişlik)
    End Function

    SolidBrush gibi Korumalı Fonksiyon GetBrush (As String ByVal name)
        Dönüş Yeni SolidBrush (Öğeler (isim))
    End Function

    Renk olarak Korumalı Fonksiyon GetColor (As String ByVal name)
        Dönüş Öğeler (isim)
    End Function

    Korumalı Alt SetColor (As String ByVal isim, Renk olarak ByVal değeri)
        Eğer Items.ContainsKey (isim) Sonra Öğeler (isim) = değer Else resi (ad, değer)
    End Sub
    Korumalı Alt SetColor (As String ByVal isim, As Byte ByVal r, As Byte ByVal g As Byte, ByVal b)
        SetColor (ad, Color.FromArgb (R, G, B))
    End Sub
    Korumalı Alt SetColor (String ByVal bir olarak Byte, Byte olarak ByVal r, ByVal isim ByVal g Byte, Byte olarak ByVal b gibi)
        SetColor (ad, Color.FromArgb (A, R, G, B))
    End Sub
    Korumalı Alt SetColor (String ByVal olarak ByVal adı olarak Byte, Renk olarak ByVal değeri)
        SetColor (isim, Color.FromArgb (a, değer))
    End Sub

    Private Sub InvalidateBitmap ()
        Genişliği = 0 OrElse Yükseklik = 0 Sonra Dönüşü ise
        B = Yeni Bitmap (Genişlik, Yükseklik, PixelFormat.Format32bppPArgb)
        G = Graphics.FromImage (B)
    End Sub

    Private Sub InvalidateCustimization ()
        Yeni MemoryStream gibi M Dim (Items.Count * 4)

        Renkler Bloom gibi Her B
            M.Write (BitConverter.GetBytes (B.Value.ToArgb), 0, 4)
        Sonraki

        M.Close ()
        _Customization = Convert.ToBase64String (M.ToArray)
    End Sub

    Private Sub InvalidateTimer ()
        DesignMode OrElse değil Sonra DoneCreation dön eğer

        Sonra _IsAnimated Eğer
            AddAnimationCallback (AddressOf DoAnimation)
        Başka
            RemoveAnimationCallback (AddressOf DoAnimation)
        End If
    End Sub
#end Bölge


#Region "Kullanıcı Hooks"

    Korumalı MustOverride Alt ColorHook ()
    Korumalı MustOverride Alt PaintHook ()

    Korumalı Overridable Sub OnCreation ()
    End Sub

    Korumalı Overridable Sub OnAnimation ()
    End Sub

#end Bölge


#Region "Ofset"

    Özel OffsetReturnRectangle gibi Dikdörtgen
    Ofset Korumalı Fonksiyon Dikdörtgen gibi (Dikdörtgen olarak ByVal r As Integer, ByVal tutar)
        OffsetReturnRectangle = Yeni Dikdörtgen (rX + miktarı, rY + miktarı, r.Width - (miktar * 2), r.Height - (miktar * 2))
        Dönüş OffsetReturnRectangle
    End Function

    Boyutu itibariyle özel OffsetReturnSize
    Korumalı Fonksiyon Ofset (ByVal s As Boyut As Integer, ByVal tutar) Boyutu gibi
        OffsetReturnSize = Yeni Boyut (s.Width + miktarı, s.Height + miktar)
        Dönüş OffsetReturnSize
    End Function

    Nokta gibi özel OffsetReturnPoint
    Korumalı Fonksiyon Ofset (Noktaya ByVal p As Integer, ByVal tutar) Noktası olarak
        OffsetReturnPoint = Yeni Noktası (pX + miktarı, pY + miktar)
        Dönüş OffsetReturnPoint
    End Function

#end Bölge

#Region "Merkezi"

    Özel CenterReturn gibi Noktası

    Noktası olarak Korumalı Fonksiyonu Merkezi (Dikdörtgen olarak ByVal p, Dikdörtgen olarak ByVal c)
        CenterReturn = Yeni Noktası ((p.Width \ 2 - c.Width \ 2) + pX + cX, (p.Height \ 2 - c.Height \ 2) + pY + cY)
        Dönüş CenterReturn
    End Function
    Noktası olarak Korumalı Fonksiyonu Merkezi (Dikdörtgen olarak ByVal p, Boyut olarak ByVal c)
        CenterReturn = Yeni Noktası ((p.Width \ 2 - c.Width \ 2) + pX, (p.Height \ 2 - c.Height \ 2) + pY)
        Dönüş CenterReturn
    End Function

    Noktası olarak Korumalı Fonksiyonu Merkezi (Dikdörtgen ByVal çocuk)
        Dönüş Merkezi (Genişlik, Yükseklik, child.Width, child.Height)
    End Function
    Noktası olarak Korumalı Fonksiyonu Merkezi (Boyut olarak ByVal çocuk)
        Dönüş Merkezi (Genişlik, Yükseklik, child.Width, child.Height)
    End Function
    Korumalı Fonksiyon Center Point gibi (As Integer ByVal childWidth As Integer, ByVal childHeight)
        Dönüş Merkezi (Genişlik, Yükseklik, childWidth, childHeight)
    End Function

    Noktası olarak Korumalı Fonksiyonu Merkezi (Boyut olarak ByVal p, Boyut olarak ByVal c)
        Dönüş Merkezi (p.Width, p.Height, c.Width, c.Height)
    End Function

    Noktası olarak Korumalı Fonksiyonu Merkezi (As Integer ByVal pWidth As Integer, ByVal pHeight As Integer, ByVal cWidth As Integer, ByVal cHeight)
        CenterReturn = Yeni Nokta (pWidth \ 2 - cWidth \ 2, pHeight \ 2 - cHeight \ 2)
        Dönüş CenterReturn
    End Function

#end Bölge

#Region "Tedbir"

    Bitmap Olarak Özel MeasureBitmap
    Graphics 'TODO gibi özel MeasureGraphics: multi-threading sırasında Olası sorunları.

    Boyutu itibariyle Korumalı Fonksiyon Ölçümü ()
        Dönüş MeasureGraphics.MeasureString (Metin, Yazı, Genişlik) .ToSize
    End Function
    Korumalı Fonksiyon Ölçümü Boyutu gibi (As String ByVal metin)
        Dönüş MeasureGraphics.MeasureString (metin, yazı tipi, Genişlik) .ToSize
    End Function

#end Bölge


#Region "DrawPixel"

    SolidBrush gibi özel DrawPixelBrush

    Korumalı Alt DrawPixel (Color ByVal c1, ByVal x As Integer, ByVal y As Integer)
        Sonra _Transparent Eğer
            B.SetPixel (x, y, C1)
        Başka
            DrawPixelBrush = Yeni SolidBrush (C1)
            G.FillRectangle (DrawPixelBrush, x, y, 1, 1)
        End If
    End Sub

#end Bölge

#Region "DrawCorners"

    SolidBrush gibi özel DrawCornersBrush

    Korumalı Alt DrawCorners (Color ByVal c1, ByVal As Integer ofset)
        DrawCorners (c1, 0, 0, Genişlik, Yükseklik, ofset)
    End Sub
    Korumalı Alt DrawCorners (Color, ByVal r1 gibi Dikdörtgen, ByVal olarak ByVal c1 As Integer ofset)
        DrawCorners (c1, r1.X, r1.Y, r1.Width, r1.Height, ofset)
    End Sub
    (X tamsayı, tamsayı, Integer, Integer olarak ByVal yüksekliği gibi ByVal genişliği arttıkça ByVal y gibi, ByVal As Integer ofset ByVal Renk olarak ByVal c1) Korumalı Alt DrawCorners
        DrawCorners (C1, burada x + y, ofset + ofset, genişlik - (ofset * 2), yüksekliği - (ofset * 2))
    End Sub

    Korumalı Alt DrawCorners (Color ByVal c1)
        DrawCorners (c1, 0, 0, Genişlik, Yükseklik)
    End Sub
    Korumalı Alt DrawCorners (Color ByVal c1, ByVal r1 gibi Dikdörtgen)
        DrawCorners (C1, r1.X, r1.Y, r1.Width, r1.Height)
    End Sub
    Korumalı Alt DrawCorners (Color ByVal c1, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        Sonra Return _NoRounding ise

        Sonra _Transparent Eğer
            B.SetPixel (x, y, C1)
            B.SetPixel burada (x + (genişlik - 1), Y, C1)
            B.SetPixel (x, y + (yükseklik - 1), C1)
            B.SetPixel burada (x + (genişlik - 1), y + (yükseklik - 1), C1)
        Başka
            DrawCornersBrush = Yeni SolidBrush (C1)
            G.FillRectangle (DrawCornersBrush, x, y, 1, 1)
            G.FillRectangle (DrawCornersBrush, x + (genişlik - 1), y, 1, 1)
            G.FillRectangle (DrawCornersBrush x, y + (yükseklik - 1), 1, 1)
            G.FillRectangle (DrawCornersBrush, x + (genişlik - 1), y + (yükseklik - 1), 1, 1)
        End If
    End Sub

#end Bölge

#Region "DrawBorders"

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal As Integer ofset)
        DrawBorders (p1, 0, 0, Genişlik, Yükseklik, ofset)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Kalem, Dikdörtgen olarak ByVal r gibi, ByVal As Integer ofset)
        DrawBorders (P1, R x, Ry, r.Width, r.Height, ofset)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal x Integer, Integer, Integer, Integer olarak ByVal yüksekliği gibi ByVal genişliği arttıkça ByVal y gibi, ByVal As Integer ofset)
        DrawBorders (P1, burada x + y, ofset + ofset, genişlik - (ofset * 2), yüksekliği - (ofset * 2))
    End Sub

    Korumalı Alt DrawBorders (ByVal p1 Pen gibi)
        DrawBorders (p1, 0, 0, Genişlik, Yükseklik)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, Dikdörtgen olarak ByVal r)
        DrawBorders (P1, R x, Ry, r.Width, r.Height)
    End Sub
    Korumalı Alt DrawBorders (ByVal p1 Pen gibi, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        G.DrawRectangle (P1, x, y, genişlik - 1, yükseklik - 1)
    End Sub

#end Bölge

#Region "DrawText"

    Nokta gibi özel DrawTextPoint
    Boyutu itibariyle özel DrawTextSize

    Korumalı Alt DrawText (Fırça, ByVal olarak ByVal b1 HorizontalAlignment olarak, ByVal x Integer, Integer olarak ByVal y gibi)
        DrawText (B1, metin, A, X, y)
    End Sub
    Korumalı Alt DrawText (Fırça, As String ByVal metin, ByVal olarak ByVal b1 HorizontalAlignment olarak, ByVal x Integer, Integer olarak ByVal y gibi)
        Text.Length = 0 Sonra Dönüşü ise

        DrawTextSize = Tedbir (metin)
        DrawTextPoint = Merkezi (DrawTextSize)

        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawString (metin, yazı tipi, b1, x DrawTextPoint.Y + y)
            Neredeyse HorizontalAlignment.Center
                G.DrawString (metin, yazı tipi, b1, DrawTextPoint.X + x, DrawTextPoint.Y + y)
            Vaka HorizontalAlignment.Right
                G.DrawString (metin, yazı tipi, b1, Genişlik - DrawTextSize.Width - x, DrawTextPoint.Y + y)
        End Select
    End Sub

    Korumalı Alt DrawText (Fırça gibi ByVal b1, ByVal p1 noktası olarak)
        Text.Length = 0 Sonra Dönüşü ise
        G.DrawString (Metin, Yazı, b1, p1)
    End Sub
    Korumalı Alt DrawText (Fırça gibi ByVal b1, ByVal x Integer, Integer olarak ByVal y gibi)
        Text.Length = 0 Sonra Dönüşü ise
        G.DrawString (Metin, Yazı, b1, x, y)
    End Sub

#end Bölge

#Region "DrawImage"

    Nokta gibi özel DrawImagePoint

    Alt DrawImage Korumalı (As a HorizontalAlignment ByVal, ByVal x Integer, Integer olarak ByVal y gibi)
        DrawImage (_Image, a, x, y)
    End Sub
    Korumalı Alt DrawImage (As Image ByVal görüntü HorizontalAlignment ByVal bir, ByVal x Integer, Integer olarak ByVal y gibi)
        Görüntü Hiçbir Sonra İade mı varsa
        DrawImagePoint = Merkezi (image.Size)

        Select Case a
            Vaka HorizontalAlignment.Left
                G.DrawImage (görüntü, x DrawImagePoint.Y + y image.Width, image.Height)
            Neredeyse HorizontalAlignment.Center
                G.DrawImage (resim, DrawImagePoint.X + x, DrawImagePoint.Y + y, image.Width, image.Height)
            Vaka HorizontalAlignment.Right
                G.DrawImage (resim, Genişlik - image.Width - x, DrawImagePoint.Y + y, image.Width, image.Height)
        End Select
    End Sub

    Korumalı Alt DrawImage (ByVal p1 noktası olarak)
        DrawImage (_Image, p1.X, p1.y)
    End Sub
    Alt DrawImage Korumalı (ByVal Integer, Integer olarak ByVal y gibi x)
        DrawImage (_Image, x, y)
    End Sub

    Korumalı Alt DrawImage (As Image ByVal görüntü, ByVal p1 noktası olarak)
        DrawImage (resim, p1.X, p1.y)
    End Sub
    Korumalı Alt DrawImage (As Image ByVal görüntü, ByVal x Integer, Integer olarak ByVal y gibi)
        Görüntü Hiçbir Sonra İade mı varsa
        G.DrawImage (resim, x, y, image.Width, image.Height)
    End Sub

#end Bölge

#Region "DrawGradient"

    LinearGradientBrush gibi özel DrawGradientBrush
    Özel DrawGradientRectangle gibi Dikdörtgen

    Alt DrawGradient Korumalı (ColorBlend gibi harman ByVal, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (harmanı DrawGradientRectangle)
    End Sub
    Alt DrawGradient Korumalı (ColorBlend gibi harman ByVal, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (harman DrawGradientRectangle, açı)
    End Sub

    Alt DrawGradient Korumalı (ColorBlend, Dikdörtgen olarak ByVal r gibi harman ByVal)
        DrawGradientBrush = Yeni LinearGradientBrush (R, Color.Empty, Color.Empty, 90.0F)
        DrawGradientBrush.InterpolationColors = harman
        G.FillRectangle (DrawGradientBrush, R)
    End Sub
    Alt DrawGradient Korumalı (ColorBlend, Dikdörtgen olarak ByVal r, As Single ByVal açısı olarak harman ByVal)
        DrawGradientBrush = Yeni LinearGradientBrush (r, Color.Empty, Color.Empty, açı)
        DrawGradientBrush.InterpolationColors = harman
        G.FillRectangle (DrawGradientBrush, R)
    End Sub


    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (C1, C2, DrawGradientRectangle)
    End Sub
    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        DrawGradientRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawGradient (C1, C2, DrawGradientRectangle, açı)
    End Sub

    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r)
        DrawGradientBrush = Yeni LinearGradientBrush (R, C1, C2, 90.0F)
        G.FillRectangle (DrawGradientBrush, R)
    End Sub
    Korumalı Alt DrawGradient (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r, As Single ByVal açısı)
        DrawGradientBrush = Yeni LinearGradientBrush (R, C1, C2, açı)
        G.FillRectangle (DrawGradientBrush, R)
    End Sub

#end Bölge

#Region "DrawRadial"

    GraphicsPath gibi özel DrawRadialPath
    PathGradientBrush gibi özel DrawRadialBrush1
    Özel DrawRadialBrush2 olarak LinearGradientBrush
    Özel DrawRadialRectangle gibi Dikdörtgen

    Alt DrawRadial (ColorBlend ByVal harman, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (harmanı, DrawRadialRectangle, \ 2 genişlik, Yükseklik \ 2)
    End Sub
    Alt DrawRadial (ColorBlend ByVal harman, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi, ByVal merkezi gibi Noktası)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (harman DrawRadialRectangle, center.X, center.Y)
    End Sub
    Alt DrawRadial (ColorBlend ByVal harman, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, ByVal cx Integer, Integer olarak ByVal cy As)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (harman DrawRadialRectangle Cx, CY)
    End Sub

    Alt DrawRadial (ColorBlend ByVal karışımı, bir dikdörtgen olarak ByVal r)
        DrawRadial (karışım, r r.Width \ 2, r.Height \ 2)
    End Sub
    Alt DrawRadial (ColorBlend, Dikdörtgen, ByVal merkezi olarak Noktaya ByVal r gibi ByVal harman)
        DrawRadial (karışım, r center.X, center.Y)
    End Sub
    Alt DrawRadial (ColorBlend ByVal harman, Dikdörtgen olarak ByVal r As Integer, ByVal cx As Integer, ByVal cy)
        DrawRadialPath.Reset ()
        DrawRadialPath.AddEllipse (Rx, Ry r.Width - 1, r.Height - 1)

        DrawRadialBrush1 = Yeni PathGradientBrush (DrawRadialPath)
        DrawRadialBrush1.CenterPoint = Yeni Noktası (rX + cx, rY + cy)
        DrawRadialBrush1.InterpolationColors = harman

        G.SmoothingMode Sonra SmoothingMode.AntiAlias ​​= Eğer
            G.FillEllipse (1 + çok DrawRadialBrush1, Rx + 1, r.Width - 3, r.Height - 3)
        Başka
            G.FillEllipse (DrawRadialBrush1, R)
        End If
    End Sub


    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği gibi)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (C1, C2, DrawRadialRectangle)
    End Sub
    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, ByVal x Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Single ByVal açısı gibi)
        DrawRadialRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        DrawRadial (C1, C2, DrawRadialRectangle, açı)
    End Sub

    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r)
        DrawRadialBrush2 = Yeni LinearGradientBrush (R, C1, C2, 90.0F)
        G.FillEllipse (DrawRadialBrush2, R)
    End Sub
    Korumalı Alt DrawRadial (Color ByVal c1, Renk olarak ByVal c2, Dikdörtgen olarak ByVal r, As Single ByVal açısı)
        DrawRadialBrush2 = Yeni LinearGradientBrush (R, C1, C2, açı)
        G.FillEllipse (DrawRadialBrush2, R)
    End Sub

#end Bölge

#Region "CreateRound"

    GraphicsPath gibi özel CreateRoundPath
    Özel CreateRoundRectangle gibi Dikdörtgen

    Fonksiyon CreateRound (ByVal Integer, Integer olarak ByVal y As Integer, ByVal genişliği, As Integer ByVal yüksekliği, As Integer ByVal eğimin gibi x) GraphicsPath gibi
        CreateRoundRectangle = Yeni Dikdörtgen (x, y, genişlik, yükseklik)
        Dönüş CreateRound (CreateRoundRectangle, eğim)
    End Function

    Fonksiyon CreateRound GraphicsPath gibi (Dikdörtgen olarak ByVal r As Integer, ByVal eğim)
        CreateRoundPath = Yeni GraphicsPath (FillMode.Winding)
        CreateRoundPath.AddArc (rX, rY, eğim, eğim, 180.0F, 90.0F)
        CreateRoundPath.AddArc (r.Right - eğim, rY, eğim, eğim, 270.0F, 90.0F)
        CreateRoundPath.AddArc (r.Right - eğim, r.Bottom - eğim, eğim, eğim, 0.0F, 90.0F)
        CreateRoundPath.AddArc (rX, r.Bottom - eğim, eğim, eğim, 90.0F, 90.0F)
        CreateRoundPath.CloseFigure ()
        Dönüş CreateRoundPath
    End Function

#end Bölge

End Class

Modül ThemeShare

#Region "Animasyon"

    As Integer özel çerçeveler
    As Boolean Private Invalidate'yi
    Yeni PrecisionTimer olarak Kamu ThemeTimer

    Tamsayı = 20 'gibi kamu FPS 1000-1050 = 20 FPS
    Integer = 15 olarak Kamu Puan

    Kamu Delege Sub AnimationDelegate (ByVal As Boolean geçersiz)

    Yeni Liste Olarak Özel Callbacks (AnimationDelegate Of)

    Private Sub HandleCallbacks (IntPtr, As Boolean ByVal rezerv olarak ByVal devlet)
        Geçersiz = (Çerçeveler> = FPS)
        Geçersiz ise Sonra Çerçeveler = 0

        SyncLock Callbacks
            1 - As Integer = 0 Callbacks.Count için I
                Geri aramalar (I) '.Invoke (Invalidate'yi)
            Sonraki
        Bitiş SyncLock

        Çerçeveler + = Oranı
    End Sub

    Private Sub InvalidateThemeTimer ()
        Callbacks.Count Sonra 0 = eğer
            ThemeTimer.Delete ()
        Başka
            ThemeTimer.Create (0, Rate, AddressOf HandleCallbacks)
        End If
    End Sub

    Alt AddAnimationCallback (AnimationDelegate ByVal callback)
        SyncLock Callbacks
            Callbacks.Contains (callback) Sonra Dönüşü ise

            Callbacks.Add (callback)
            InvalidateThemeTimer ()
        Bitiş SyncLock
    End Sub

    Alt RemoveAnimationCallback (AnimationDelegate ByVal callback)
        SyncLock Callbacks
            Değil Callbacks.Contains (callback) Sonra Dönüşü ise

            Callbacks.Remove (callback)
            InvalidateThemeTimer ()
        Bitiş SyncLock
    End Sub

#end Bölge

End Module

Enum MouseState olarak Bayt
    Yok = 0
    Aşırı = 1
    Down = 2
    Blok = 3
End Enum

Yapı Bloom

    Kamu _name As String
    As String ReadOnly Property Name ()
        Almak
            Dönüş _name
        Get End
    End Property

    Özel _Value gibi Renk
    Renk olarak Özellik Değer ()
        Almak
            Dönüş _Value
        Get End
        Set (Color ByVal değeri)
            _Value = Değer
        Bitiş Seti
    End Property

    As String Property ValueHex ()
        Almak
            String.Concat (Return "#", _
            _ ("X2", Nothing) _Value.R.ToString
            _ ("X2", Nothing) _Value.G.ToString
            _Value.B.ToString ("X2", Nothing))
        Get End
        Set (As String ByVal değeri)
            Denemek
                _Value = ColorTranslator.FromHtml (değer)
            Yakalamak
                Dönüş
            End Try
        Bitiş Seti
    End Property


    Sub New (As String ByVal isim, Renk olarak ByVal değeri)
        _name = Isim
        _Value = Değer
    End Sub
Bitiş Yapısı

'------------------
'Oluşturan: aeonhack
'Site: elitevs.net
'Oluşturuldu: 2011/11/30
'Değişti: 2011/11/30
'Sürüm: 1.0.0
'------------------
Sınıf PrecisionTimer
    Idisposable uygular

    As Boolean Private _Enabled
    ReadOnly özelliği As Boolean) (Etkin
        Almak
            Dönüş _Enabled
        Get End
    End Property

    As IntPtr Özel Kolu
    TimerDelegate gibi özel TimerCallback

    <Dllımport ("kernel32.dll", EntryPoint: = "CreateTimerQueueTimer")> _
    Özel Shared Function CreateTimerQueueTimer (_
    As IntPtr işlemek ByRef, _
    IntPtr olarak, KUYRUK ByVal _
    ByVal TimerDelegate olarak geri arama, _
    ByVal As IntPtr devlet, _
    DueTime ise UInteger ByVal _
    UInteger ByVal süre ise, _
    As Boolean UInteger ByVal bayrakları)
    End Function

    <Dllımport ("kernel32.dll", EntryPoint: = "DeleteTimerQueueTimer")> _
    Özel Shared Function DeleteTimerQueueTimer (_
    IntPtr olarak, KUYRUK ByVal _
    As IntPtr işlemek ByVal _
    As Boolean IntPtr ByVal callback)
    End Function

    Alt TimerDelegate yetki verme (ByVal R1 ile ıntptr, ByVal R2, Boole)

    Alt oluşturun (ByVal dueTime UInteger, UInteger ByVal dönemde, TimerDelegate ByVal geri arama gibi)
        İade Sonra _Enabled ise

        TimerCallback = geri arama
        As Boolean Başarı Dim = CreateTimerQueueTimer (Kulp, IntPtr.Zero, TimerCallback, IntPtr.Zero, dueTime, dönem, 0)

        Eğer Değil Başarı Sonra ThrowNewException ("CreateTimerQueueTimer")
        _Enabled = Başarı
    End Sub

    Sub Sil ()
        İade Sonra _Enabled değil ise
        As Boolean Başarı Dim = DeleteTimerQueueTimer (IntPtr.Zero, Kulp IntPtr.Zero)

        Sonra Değil Başarı AndAlso değil Marshal.GetLastWin32Error ise = 997
            'ThrowNewException ("DeleteTimerQueueTimer")
        End If

        _Enabled = Değil Başarı
    End Sub

    Private Sub ThrowNewException (As String ByVal name)
        Yeni İstisna atmak (string.Format ("{0} başarısız Win32Error: {1}.", Ad, Marshal.GetLastWin32Error))
    End Sub

    Public Sub Dispose () IDisposable.Dispose uygular
        () Sil
    End Sub
End Class
#end Bölge

Sınıf GhostTheme
    Inherits ThemeContainer154

    Korumalı Overrides Sub ColorHook ()

    End Sub

    Korumalı Overrides Sub PaintHook ()
        G.Clear (Color.DimGray)
        Yeni ColorBlend Dim kapak (2)
        DrawBorders (Pens.Gray, 1)
        hatch.Colors (0) = Color.DimGray
        hatch.Colors (1) = Color.FromArgb (60, 60, 60),
        hatch.Positions (0) = 0
        hatch.Positions (1) = 1
        DrawGradient (ambar, Yeni Dikdörtgen (0, 0, Genişlik, 24))
        hatch.Colors (0) = Color.FromArgb (100, 100, 100),
        hatch.Colors (1) = Color.DimGray
        DrawGradient (ambar, Yeni Dikdörtgen (0, 0, Genişlik, 12))
        HatchBrush Dim asdf
        asdf = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (15, Color.Black), Color.FromArgb (0, Color.Gray))
        hatch.Colors (0) = Color.FromArgb (120, Color.Black)
        hatch.Colors (1) = Color.FromArgb (0, Color.Black)
        DrawGradient (ambar, Yeni Dikdörtgen (0, 0, Genişlik, 30))
        G.FillRectangle (asdf, 0, 0, Genişlik, 24)
        G.DrawLine (Pens.Black, 6, 24, Genişlik - 7, 24)
        G.DrawLine (Pens.Black, 6, 24, 6, yüksekliği - 7)
        G.DrawLine (Pens.Black, 6, Yükseklik - 7, Genişlik - 7, Yükseklik - 7)
        G.DrawLine (Pens.Black, Genişlik - 7, 24, Genişlik - 7, Yükseklik - 7)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), yeni bir dikdörtgen (1, 24, 5, yüksekliği - 6-24))
        G.FillRectangle (asdf, 1, 24, 5, Yükseklik - 6-24)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), Yeni Dikdörtgen (Genişlik - 6, 24, Genişlik - 1, Yükseklik - 6-24))
        G.FillRectangle (asdf, Genişlik - 6, 24, Genişlik - 2, Yükseklik - 6-24)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), Yeni Dikdörtgen (1, Yükseklik - 6, Genişlik - 2, Yükseklik - 1))
        G.FillRectangle (asdf, 1, Yükseklik - 6, Genişlik - 2, Yükseklik - 1)
        DrawBorders (Pens.Black)
        asdf = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray)
        G.FillRectangle (asdf, 7, 25, Genişlik - 14 Yükseklik - 24 - 8)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), 7, 25, Genişlik - 14 Yükseklik - 24-8)
        DrawCorners (Color.Fuchsia)
        DrawCorners (Color.Fuchsia, 0, 1, 1, 1)
        DrawCorners (Color.Fuchsia, 1, 0, 1, 1)
        DrawPixel (Color.Black, 1, 1)

        DrawCorners (Color.Fuchsia, 0, yüksekliği - 2, 1, 1)
        DrawCorners (Color.Fuchsia, 1, yüksekliği - 1, 1, 1)
        DrawPixel (Color.Black, Genişlik - 2, 1)

        DrawCorners (Color.Fuchsia, Genişlik - 1, 1, 1, 1)
        DrawCorners (Color.Fuchsia, Genişlik - 2, 0, 1, 1)
        DrawPixel (Color.Black, 1, Yükseklik - 2)

        DrawCorners (Color.Fuchsia, Genişlik - 1, Yükseklik - 2, 1, 1)
        DrawCorners (Color.Fuchsia, Genişlik - 2, Yükseklik - 1, 1, 1)
        DrawPixel (Color.Black, Genişlik - 2, Yükseklik - 2)

        Yeni ColorBlend gibi cblend Dim (2)
        cblend.Colors (0) = Color.FromArgb (35, Color.Black)
        cblend.Colors (1) = Color.FromArgb (0, 0, 0, 0)
        cblend.Positions (0) = 0
        cblend.Positions (1) = 1
        DrawGradient (cblend, 7, 25, 15, yüksekliği - 6-24, 0)
        cblend.Colors (0) = Color.FromArgb (0, 0, 0, 0)
        cblend.Colors (1) = Color.FromArgb (35, Color.Black)
        DrawGradient (cblend, Genişlik - 24, 25, 17, yüksekliği - 6-24, 0)
        cblend.Colors (1) = Color.FromArgb (0, 0, 0, 0)
        cblend.Colors (0) = Color.FromArgb (35, Color.Black)
        DrawGradient (cblend, 7, 25, Me.Width - 14, 17, 90)
        cblend.Colors (0) = Color.FromArgb (0, 0, 0, 0)
        cblend.Colors (1) = Color.FromArgb (35, Color.Black)
        DrawGradient (cblend, 8, Me.Height - 24, Me.Width - 14, 17, 90)
        G.DrawString (Metin, Yazı, Brushes.White New Point (6, 6))
    End Sub

    Public Sub New ()
        TransparencyKey = Color.Fuchsia
    End Sub
End Class

Sınıf GhostButton
    Inherits ThemeControl154
    As Boolean Özel Cam = true

    Korumalı Overrides Sub ColorHook ()

    End Sub

    As Boolean Public Property EnableGlass
        Almak
            Dönüş Cam
        Get End
        Set (As Boolean ByVal değeri)
            Cam = değer
        Bitiş Seti
    End Property


    Korumalı Overrides Sub OnTextChanged (System.EventArgs ByVal e As)
        MyBase.OnTextChanged (e)
        Grafik = Me.CreateGraphics Dim gg
        SizeF = Me.CreateGraphics.MeasureString gibi TEXTSIZE Dim (Metin, yazı tipi)
        gg.DrawString (Metin, Yazı, Brushes.White, Yeni RectangleF (0, 0, Me.Width, Me.Height))
    End Sub

    Korumalı Overrides Sub PaintHook ()
        G.Clear (Color.FromArgb (0, 40, 40, 40))
        Sonra Devlet = MouseState.Over ise
            Yeni ColorBlend gibi cblend Dim (2)
            cblend.Colors (0) = Color.FromArgb (60, 60, 60),
            cblend.Colors (1) = Color.FromArgb (80, 80, 80)
            cblend.Positions (0) = 0
            cblend.Positions (1) = 1
            DrawGradient (cblend, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
            Eğer Cam Sonra DrawGradient (cblend, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik / 5 * 2))
        ElseIf Devlet = MouseState.None Sonra
            Yeni ColorBlend gibi cblend Dim (2)
            cblend.Colors (0) = Color.FromArgb (50, 50, 50)
            cblend.Colors (1) = Color.FromArgb (70, 70, 70)
            cblend.Positions (0) = 0
            cblend.Positions (1) = 1
            DrawGradient (cblend, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
            cblend.Colors (1) = Color.FromArgb (80, 80, 80)
            Eğer Cam Sonra DrawGradient (cblend, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik / 5 * 2))
        Başka
            Yeni ColorBlend gibi cblend Dim (2)
            cblend.Colors (0) = Color.FromArgb (30, 30, 30)
            cblend.Colors (1) = Color.FromArgb (50, 50, 50)
            cblend.Positions (0) = 0
            cblend.Positions (1) = 1
            DrawGradient (cblend, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
            Eğer Cam Sonra DrawGradient (cblend, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik / 5 * 2))

        End If
        HatchBrush Dim ambar
        ambar = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (25, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (ambar, 0, 0, Genişlik, Yükseklik)
        SizeF = Me.CreateGraphics.MeasureString gibi TEXTSIZE Dim (Metin, Yazı, Genişlik - 4)
        Yeni StringFormat olarak sf Dim
        sf.LineAlignment = StringAlignment.Center
        sf.Alignment = StringAlignment.Center
        G.DrawString (Metin, Yazı, Brushes.White, Yeni RectangleF (2, 2, Me.Width - 5, Me.Height - 4), sf)
        DrawBorders (Pens.Black)
        DrawBorders (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1)
    End Sub

End Class

Sınıf GhostProgressbar
    Inherits ThemeControl154
    As Integer Private _Maximum = 100
    Özel _Value As Integer
    As Single Özel GlowPosition = -0.7
    Özel İlerleme As Integer
    Korumalı Overrides Sub ColorHook ()

    End Sub

    Public Property Maksimum As Integer
        Almak
            Dönüş _Maximum
        Get End
        Set (As Integer ByVal V)
            Sonra V <1 V = 1
            V <_Value Sonra _Value = V ise
            _Maximum = V
            () Geçersiz
        Bitiş Seti
    End Property
    Kamu Özellik Değer As Integer
        Almak
            Dönüş _Value
        Get End
        Set (As Integer ByVal V)
            V> _Maximum Sonra V = Maximum ise
            _Value = V
            () Geçersiz
        Bitiş Seti
    End Property
    As Boolean Public Property Animasyonlu
        Almak
            Dönüş IsAnimated
        Get End
        Set (As Boolean ByVal V)
            IsAnimated = V
            () Geçersiz
            GlowPosition = -0.7
        Bitiş Seti
    End Property

    Korumalı Overrides Sub OnAnimation ()
        GlowPosition + = 0,015
        GlowPosition> = 1 Sonra GlowPosition = -2 ise
    End Sub

    Korumalı Overrides Sub PaintHook ()
        Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (60, Color.Black)) Dim ambar
        G.Clear (Color.FromArgb (0, 30, 30, 30))
        Yeni ColorBlend gibi cblend Dim (2)
        cblend.Colors (0) = Color.FromArgb (50, 50, 50)
        cblend.Colors (1) = Color.FromArgb (70, 70, 70)
        cblend.Positions (0) = 0
        cblend.Positions (1) = 1
        DrawGradient (cblend, Yeni Dikdörtgen (0, 0, CInt (((Genişlik / _Maximum) * _Value) - 2), Yükseklik - 2))
        cblend.Colors (1) = Color.FromArgb (80, 80, 80)
        DrawGradient (cblend, Yeni Dikdörtgen (0, 0, CInt (((Genişlik / _Maximum) * _Value) - 2), Yükseklik / 5 * 2))
        ambar = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (25, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (ambar, 0, 0, CInt (((Genişlik / _Maximum) * _Value) - 2), Yükseklik - 2)
        DrawBorders (Pens.Black)
        DrawBorders (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1)
        DrawCorners (Color.Black)
        G.DrawLine (Yeni Kalem (Color.FromArgb (200, 90, 90, 90)), CInt (((Genişlik / _Maximum) * _Value) - 2), 1, CInt (((Genişlik / _Maximum) * _Value) - 2), Yükseklik - 2)
        G.DrawLine (Pens.Black, CInt (((En / _Maximum) * _Value) - 2) +, 1, 2, CInt (((En / _Maximum) * _Value) - 2) + 1, yüksekliği - 3)
        İlerleme = CInt (((Genişlik / _Maximum) * _Value))
        Yeni ColorBlend gibi cblend2 Dim (3)
        cblend2.Colors (0) = Color.FromArgb (0, Color.Gray)
        cblend2.Colors (1) = Color.FromArgb (80, Color.DimGray)
        cblend2.Colors (2) = Color.FromArgb (0, Color.Gray)
        cblend2.Positions = {0, 0.5, 1}
        DrawGradient (cblend2 (GlowPosition * İlerleme), 2, 100, Yükseklik - 4, 0.0F)
        1, 2, Genişlik - - CInt (((Genişlik / _Maximum Değer> 0 Then G.FillRectangle (Yeni SolidBrush (Color.FromArgb (5, 5, 5)), CInt (((Genişlik / _Maximum) * _Value)) Eğer ) * _Value)) - 1, Yükseklik - 4)
    End Sub

    Public Sub New ()
        _Maximum = 100
        = True IsAnimated
    End Sub
End Class

Sınıf GhostCheckbox
    Inherits ThemeControl154
    As Boolean Private _Checked

    Public Property As Boolean Kontrol
        Almak
            Dönüş _Checked
        Get End
        Set (As Boolean ByVal V)
            _Checked = V
            () Geçersiz
        Bitiş Seti
    End Property

    Korumalı Overrides Sub ColorHook ()

    End Sub

    Korumalı Overrides Sub OnTextChanged (System.EventArgs ByVal e As)
        MyBase.OnTextChanged (e)
        TEXTSIZE olarak Integer Dim
        TEXTSIZE = Me.CreateGraphics.MeasureString (Metin, Font) .Width
        Me.Width = + 20 yazı boyutu
    End Sub

    Korumalı Overrides Sub OnClick (System.EventArgs ByVal e As)
        MyBase.OnClick (e)
        _Checked = True Then _Checked = False Else _Checked = true ise
    End Sub

    Korumalı Overrides Sub PaintHook ()
        G.Clear (Color.FromArgb (60, 60, 60))
        HatchBrush Dim asdf
        asdf = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (35, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
        asdf = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray)
        G.FillRectangle (asdf, 0, 0, Genişlik, Yükseklik)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), 0, 0, Genişlik, Yükseklik)

        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (10, 10, 10)), 3, 3, 10, 10)
        Sonra _Checked Eğer
            Yeni ColorBlend gibi cblend Dim (2)
            cblend.Colors (0) = Color.FromArgb (60, 60, 60),
            cblend.Colors (1) = Color.FromArgb (80, 80, 80)
            cblend.Positions (0) = 0
            cblend.Positions (1) = 1
            DrawGradient (cblend, yeni bir dikdörtgen (3, 3, 10, 10))
            cblend.Colors (0) = Color.FromArgb (70, 70, 70)
            cblend.Colors (1) = Color.FromArgb (100, 100, 100),
            DrawGradient (cblend, yeni bir dikdörtgen (3, 3, 10, 4))
            HatchBrush Dim ambar
            ambar = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.FromArgb (60, Color.Black), Color.FromArgb (0, Color.Gray))
            G.FillRectangle (kapısı, 3, 3, 10, 10)
        Başka
            HatchBrush Dim ambar
            ambar = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.FromArgb (20, Color.White), Color.FromArgb (0, Color.Gray))
            G.FillRectangle (kapısı, 3, 3, 10, 10)
        End If

        Sonra Devlet = MouseState.Over ise
            G.FillRectangle (Yeni SolidBrush (Color.FromArgb (30 Color.Gray)), yeni bir dikdörtgen (3, 3, 10, 10))
        ElseIf Devlet = MouseState.Down Sonra
            G.FillRectangle (Yeni SolidBrush (Color.FromArgb (30 Color.Black)), yeni bir dikdörtgen (3, 3, 10, 10))
        End If

        G.DrawRectangle (Pens.Black, 0, 0, 15, 15)
        G.DrawRectangle (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, 1, 13, 13)
        G.DrawString (Metin, Yazı, Brushes.White, 17, 1)

    End Sub

    Public Sub New ()
        Me.Size = Yeni Noktası (16, 50)
    End Sub
End Class

Sınıf GhostRadiobutton
    Inherits ThemeControl154

    As Boolean Private _Checked
    Public Property As Boolean Kontrol
        Almak
            Dönüş _Checked
        Get End
        Set (As Boolean ByVal V)
            _Checked = V
            () Geçersiz
        Bitiş Seti
    End Property

    Korumalı Overrides Sub OnClick (System.EventArgs ByVal e As)
        MyBase.OnClick (e)
        Parent.Controls Her Bir C gibi Kontrolü için
            Eğer C.GetType.ToString = My.Application.Info.ProductName & Sonra ".GhostRadiobutton"
                GhostRadiobutton Dim CC
                CC = C
                = False CC.Checked
            End If
        Sonraki
        = True _Checked
    End Sub
    'Www.kodyuvasi.com
    Korumalı Overrides Sub ColorHook ()

    End Sub

    Korumalı Overrides Sub OnTextChanged (System.EventArgs ByVal e As)
        MyBase.OnTextChanged (e)
        TEXTSIZE olarak Integer Dim
        TEXTSIZE = Me.CreateGraphics.MeasureString (Metin, Font) .Width
        Me.Width = + 20 yazı boyutu
    End Sub

    Korumalı Overrides Sub PaintHook ()
        G.Clear (Color.FromArgb (60, 60, 60))
        HatchBrush Dim asdf
        asdf = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (35, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
        asdf = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray)
        G.FillRectangle (asdf, 0, 0, Genişlik, Yükseklik)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), 0, 0, Genişlik, Yükseklik)

        G.SmoothingMode = SmoothingMode.AntiAlias
        G.FillEllipse (Yeni SolidBrush (Color.Black), 2, 2, 11, 11)
        G.DrawEllipse (Pens.Black, 0, 0, 13, 13)
        G.DrawEllipse (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, 1, 11, 11)

        _Checked Eğer = False Then
            HatchBrush Dim ambar
            ambar = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.FromArgb (20, Color.White), Color.FromArgb (0, Color.Gray))
            G.FillEllipse (ambar, 2, 2, 10, 10)
        Başka
            G.FillEllipse (Yeni SolidBrush (Color.FromArgb (80, 80, 80)), 3, 3, 7, 7)
            HatchBrush Dim ambar
            ambar = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.FromArgb (60, Color.Black), Color.FromArgb (0, Color.Gray))
            G.FillRectangle (kapısı, 3, 3, 7, 7)
        End If

        G.DrawString (Metin, Yazı, Brushes.White, 16, 0)
    End Sub

    Public Sub New ()
        Me.Size = Yeni noktası (50, 14)
    End Sub
End Class

Sınıf GhostTabControl
    Inherits TabControl
    As Integer özel XStart (9999)
    As Integer özel Xstop (9999)
    'Www.kodyuvasi.com
    Sub New ()
        SetStyle (ControlStyles.AllPaintingInWmPaint Veya ControlStyles.ResizeRedraw Veya ControlStyles.UserPaint Yoksa ControlStyles.DoubleBuffer, True)
        DoubleBuffered = True
        TabPage'ler yılında TabPage gibi her p
            p.BackColor = Color.White
            Application.DoEvents ()
            p.BackColor = Color.Transparent
        Sonraki
    End Sub
    Korumalı Overrides Sub CreateHandle ()
        MyBase.CreateHandle ()
        Hizalama = TabAlignment.Top
    End Sub
    'Www.kodyuvasi.com
    Korumalı Overrides Sub OnMouseClick (ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick (e)
        Integer = 0 Dim indeksi
        Integer = Me.CreateGraphics.MeasureString Dim yüksekliği ("Mava Başar" Font) .Height + 8
        Tamsayı olarak XStart olarak her a için
            Eğer eX> Bir And Then eX <Xstop (indeks) Ve eY <height Ve e.Button = Windows.Forms.MouseButtons.Left
                Selectedındex = indeks
                () Geçersiz
            Başka
            End If
            index + = 1
        Sonraki
    End Sub
    'Www.kodyuvasi.com
    Korumalı Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Yeni Bitmap Olarak B Dim (Genişlik, Yükseklik)
        Grafik = Graphics.FromImage gibi G (B) Dim
        G.Clear (Color.FromArgb (60, 60, 60))
        HatchBrush Dim asdf
        asdf = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (35, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
        asdf = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray)
        G.FillRectangle (asdf, 0, 0, Genişlik, Yükseklik)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), 0, 0, Genişlik, Yükseklik)

        G.FillRectangle (Brushes.Black, 0, 0, Genişlik, Me.CreateGraphics.MeasureString ("Mava Başar", Font) .Height + 8)
        G.FillRectangle (- 2, Yükseklik - Yeni SolidBrush (Color.FromArgb (20, Color.Black)), 2, Me.CreateGraphics.MeasureString (, Genişlik Font) .Height + 7 "Mava Başar" 2)

        = 0 As Integer totallength Dim
        Integer = 0 Dim indeksi
        TabPage'ler yılında TabPage gibi her sekme için
            Sonra Selectedındex = endeksi ise
                G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), totallength, 1, Me.CreateGraphics.MeasureString (tab.Text, yazı tipi) .Width + 15, Me.CreateGraphics.MeasureString ("Mava müthiş "Font) + 10 .Height)
                asdf = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (35, Color.Black), Color.FromArgb (0, Color.Gray))
                G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), totallength, 1, Me.CreateGraphics.MeasureString (tab.Text, yazı tipi) .Width + 15, Me.CreateGraphics.MeasureString ("Mava müthiş "Font) + 10 .Height)
                asdf = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray)
                G.FillRectangle (asdf, totallength, 1, Me.CreateGraphics.MeasureString (tab.Text, Font) .Width + 15, Me.CreateGraphics.MeasureString ("Mava Başar", Font) .Height + 10)
                G.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), totallength, 1, Me.CreateGraphics.MeasureString (tab.Text, yazı tipi) .Width + 15, Me.CreateGraphics.MeasureString ("Mava "Başar, Font) .Height + 10)

                Yeni LinearGradientBrush (New Point Dim gradyan (totallength, 1) New Point (totallength, Me.CreateGraphics.MeasureString (Color.FromArgb (15, Color.White), Font) .Height + 8) "Mava Başar", Color.Transparent)
                G.FillRectangle (gradyan, totallength, 1, Me.CreateGraphics.MeasureString (tab.Text, Font) .Width + 15, Me.CreateGraphics.MeasureString ("Mava Başar", Font) .Height + 5)

                G.DrawLine (Yeni Kalem (Color.FromArgb (60, 60, 60)), totallength + Me.CreateGraphics.MeasureString (tab.Text, Font) .Width + 15, 2, totallength + Me.CreateGraphics.MeasureString (sekme. Metin, yazı tipi) .Width + 15, Me.CreateGraphics.MeasureString ("Mava Başar", Font) .Height + 8)
                G.DrawLine (Yeni Kalem (Color.FromArgb (60, 60, 60)), totallength, 2, totallength, Me.CreateGraphics.MeasureString ("Mava Başar" Font) .Height + 8)

                G.DrawLine (Yeni Kalem (Color.FromArgb (60, 60, 60)), totallength + Me.CreateGraphics.MeasureString (tab.Text, Font) .Width + 15, Me.CreateGraphics.MeasureString ("Mava Başar", Yazı) .Height + 8, Genişlik - 1, Me.CreateGraphics.MeasureString ("Mava Başar", Font) .Height + 8)
                G.DrawLine (Yeni Kalem (Color.FromArgb (60, 60, 60)), 1, Me.CreateGraphics.MeasureString (Font) .Height + 8, totallength, Me.CreateGraphics.MeasureString ("Mava" Mava Başar " "Başar, Font) .Height + 8)

            End If
            Xstart (endeks) = totallength
            Xstop (indeks) = totallength + Me.CreateGraphics.MeasureString (tab.Text, Font) .Width + 15
            G.DrawString (tab.Text, Yazı, Brushes.White, totallength + 8, 5)
            totallength + = Me.CreateGraphics.MeasureString (tab.Text, Font) .Width + 15
            index + = 1
        Sonraki

        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, 1, Genişlik - 2, 1 ') Boven
        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, yüksekliği - 2, Genişlik - 2, Yükseklik - 2) 'Onder
        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, 1, 1, yüksekliği - 2) 'bağlantılar
        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), Genişlik - 2, 1, Genişlik - 2, Yükseklik - 2) 'rechts

        G.DrawLine (Pens.Black, 0, 0, Genişlik - 1, 0) 'Boven
        G.DrawLine (Pens.Black, 0, Yükseklik - 1, Genişlik, Yükseklik - 1) 'onder
        G.DrawLine (Pens.Black, 0, 0, 0, Yükseklik - 1) 'bağlantılar
        G.DrawLine (Pens.Black, Genişlik - 1, 0, Genişlik - 1, Yükseklik - 1) 'rechts

        e.Graphics.DrawImage (B.Clone, 0, 0)
        G.Dispose (): B.Dispose ()
    End Sub

    'Www.kodyuvasi.com
    Korumalı Overrides Sub OnSelectedIndexChanged (System.EventArgs ByVal e As)
        MyBase.OnSelectedIndexChanged (e)
        () Geçersiz
    End Sub
End Class

Sınıf GhostListbox
    Inherits ListBox

    Public Sub New ()
        DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
        SetStyle (ControlStyles.DoubleBuffer, True)
        DoubleBuffered = True
        BorderStyle = Windows.Forms.BorderStyle.None
        ItemHeight = 20
        ForeColor = Color.White
    End Sub

    Korumalı Overrides Sub OnDrawItem (System.Windows.Forms.DrawItemEventArgs ByVal e As)
        MyBase.OnDrawItem (e)
        E.State = 785 Sonra ise
            HatchBrush = Yeni HatchBrush Dim asdf (HatchStyle.LightDownwardDiagonal, Color.FromArgb (78, 78, 78))
            e.Graphics.FillRectangle (asdf, e.Bounds)
            e.Graphics.FillRectangle (Yeni SolidBrush (Color.FromArgb (220, 70, 70, 70)), e.Bounds)

        Başka
            HatchBrush = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray) Dim asdf
            e.Graphics.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), e.Bounds)
            e.Graphics.FillRectangle (asdf, e.Bounds)
            e.Graphics.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), e.Bounds)
        End If
        Denemek
            CreateGraphics.DrawString ("" & Öğeler (e.Index) .ToString (), Yazı, Yeni SolidBrush (ForeColor), e.Bounds.X, e.Bounds.Y + 3)
        Yakala: End deneyin
        e.Graphics.DrawRectangle (Pens.Black, 0, 0, Genişlik, Yükseklik)
        e.Graphics.DrawRectangle (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, 1, Genişlik - 2, Yükseklik - 2)
    End Sub

End Class

Sınıf GhostComboBox
    Inherits ComboBox
    Sub New ()
        MyBase.New ()
        SetStyle (ControlStyles.AllPaintingInWmPaint Veya ControlStyles.ResizeRedraw Veya ControlStyles.UserPaint Yoksa ControlStyles.DoubleBuffer, True)
        DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
        ItemHeight = 16
        BackColor'ı = Color.FromArgb (30, 30, 30)
        DropDownStyle = ComboBoxStyle.DropDownList
    End Sub

    Korumalı Overrides Sub OnPaint (PaintEventArgs ByVal e As)
        Değil DropDownStyle = ComboBoxStyle.DropDownList sonra DropDownStyle = ComboBoxStyle.DropDownList halinde
        Yeni Bitmap Olarak B Dim (Genişlik, Yükseklik)
        Grafik = Graphics.FromImage gibi G (B) Dim

        G.Clear (Color.FromArgb (50, 50, 50))
        LinearGradientBrush = Yeni LinearGradientBrush (Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik / 5 * 2), Color.FromArgb (20, 0, 0, 0), Color.FromArgb (15, Color.White), 90.0F olarak GradientBrush Dim )
        G.FillRectangle (GradientBrush, Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik / 5 * 2))
        HatchBrush Dim ambar
        ambar = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (20, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (ambar, 0, 0, Genişlik, Yükseklik)

        Tamsayı = G.MeasureString ("...", Font) .Height olarak S1 Dim
        > Selectedındex <ise -1 Sonra
            G.DrawString (Öğeler (Selectedındex), Yazı, Yeni SolidBrush (Color.White), 4, Yükseklik \ 2 - S1 \ 2)
        Başka
            Değil Ürünleri Sonra Hiçbirşey Ve Items.Count> 0 mı varsa
                G.DrawString (Öğeler (0), Yazı, Yeni SolidBrush (Color.White), 4, Yükseklik \ 2 - S1 \ 2)
            Başka
                G.DrawString ("...", Yazı, Yeni SolidBrush (Color.White), 4, Yükseklik \ 2 - S1 \ 2)
            End If
        End If

        G.DrawRectangle (Pens.Black, 0, 0, Genişlik - 1, Yükseklik - 1)
        G.DrawRectangle (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, 1, Genişlik - 3, Yükseklik - 3)
        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), Genişlik - 25, 1, Genişlik - 25, Yükseklik - 3)
        G.DrawLine (Pens.Black, Genişlik - 24, 0, Genişlik - 24, Yükseklik)
        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), Genişlik - 23, 1, Genişlik - 23, Yükseklik - 3)

        G.FillPolygon (Brushes.Black, Üçgen (Yeni Nokta (Genişlik - 14, Yükseklik \ 2), Yeni Boyut (5, 3)))
        G.FillPolygon (Brushes.White, Üçgen (Yeni Nokta (Genişlik - 15, Yükseklik \ 2-1), Yeni Boyut (5, 3)))

        e.Graphics.DrawImage (B.Clone, 0, 0)
        G.Dispose (): B.Dispose ()
    End Sub

    Korumalı Overrides Sub OnDrawItem (DrawItemEventArgs ByVal e As)
        E.Index <0 Then Exit Sub
        ) (Yeni Dikdörtgen olarak rect Dim
        rect.X = e.Bounds.X
        rect.Y = e.Bounds.Y
        rect.Width = e.Bounds.Width - 1
        rect.Height = e.Bounds.Height - 1

        e.DrawBackground ()
        Daha sonra e.State = 785 ya da e.State = 17 ise
            e.Graphics.FillRectangle (Yeni SolidBrush (Color.FromArgb (50, 50, 50)), e.Bounds)
            HatchBrush Dim ambar
            ambar = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (45, Color.Black), Color.FromArgb (0, Color.Gray))
            e.Graphics.FillRectangle (ambar, e.Bounds)
            e.Graphics.DrawString (Me.Items (e.Index) .ToString (), e.Font, Brushes.White, e.Bounds.X + 1 e.Bounds.Y)
        Başka
            e.Graphics.FillRectangle (Yeni SolidBrush (BackColor'ı), e.Bounds)
            e.Graphics.DrawString (Me.Items (e.Index) .ToString (), e.Font, Brushes.White, e.Bounds.X + 1 e.Bounds.Y)
        End If
        MyBase.OnDrawItem (e)
    End Sub

    Public Function Üçgen Noktası olarak (Point, Boyut olarak ByVal Boyutu ByVal Mevkii) ()
        Nokta Dim ReturnPoints (0 3 için)
        ReturnPoints (0) = Yer
        ReturnPoints (1) = Yeni Noktası (Location.X + Size.Width, Location.Y)
        ReturnPoints (2) = Yeni Noktası (Location.X + Size.Width 2 \, Location.Y + Size.Height)
        ReturnPoints (3) = Yer

        Dönüş ReturnPoints
    End Function

    Private Sub GhostComboBox_DropDown (As Object ByVal sender, System.EventArgs ByVal e As) Me.DropDown Kolları

    End Sub

    Private Sub GhostComboBox_DropDownClosed (As Object ByVal sender, System.EventArgs ByVal e As) Me.DropDownClosed Kolları
        DropDownStyle = ComboBoxStyle.Simple
        Application.DoEvents ()
        DropDownStyle = ComboBoxStyle.DropDownList
    End Sub

    Private Sub GhostCombo_TextChanged (As Object ByVal sender, System.EventArgs ByVal e As) Me.TextChanged Kolları
        () Geçersiz
    End Sub
End Class

<Tasarımcı ("System.Windows.Forms.Design.ParentControlDesigner, System.Design" gettype (IDesigner))> _
Sınıf GhostGroupBox
    Inherits ThemeControl154

    Sub New ()
        MyBase.New ()
        SetStyle (ControlStyles.ResizeRedraw, True)
        SetStyle (ControlStyles.ContainerControl, True)
        DoubleBuffered = True
        BackColor = Color.Transparent
    End Sub

    Korumalı Overrides Sub ColorHook ()

    End Sub

    Korumalı Overrides Sub PaintHook ()
        G.Clear (Color.FromArgb (60, 60, 60))
        HatchBrush Dim asdf
        asdf = Yeni HatchBrush (HatchStyle.DarkDownwardDiagonal, Color.FromArgb (35, Color.Black), Color.FromArgb (0, Color.Gray))
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (60, 60, 60)), Yeni Dikdörtgen (0, 0, Genişlik, Yükseklik))
        asdf = Yeni HatchBrush (HatchStyle.LightDownwardDiagonal, Color.DimGray)
        G.FillRectangle (asdf, 0, 0, Genişlik, Yükseklik)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (230, 20, 20, 20)), 0, 0, Genişlik, Yükseklik)
        G.FillRectangle (Yeni SolidBrush (Color.FromArgb (70, Color.Black)), 1, 1, Genişlik - 2, Me.CreateGraphics.MeasureString (Metin, Font) .Height + 8)

        G.DrawLine (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1, Me.CreateGraphics.MeasureString (Metin, Font) .Height + 8, Genişlik - 2, Me.CreateGraphics.MeasureString (Metin, yazı tipi) .Height + 8)

        DrawBorders (Pens.Black)
        DrawBorders (Yeni Kalem (Color.FromArgb (90, 90, 90)), 1)
        G.DrawString (Metin, Yazı, Brushes.White, 5, 5)
    End Sub
End Class

Kamu Sınıf GhostTextbox
    Inherits TextBox
    Function GetWindowDC Lib "-User32" Declare (ByVal hwnd As IntPtr) IntPtr
    As Integer Function ReleaseDC Lib "user32.dll" (As IntPtr ByVal HWnd, IntPtr ByVal hDC) beyan

    Korumalı Overrides Sub WndProc (System.Windows.Forms.Message olarak ByRef m)
        MyBase.WndProc (m)
        M.Msg = & HF Sonra ise
            Yeni Dikdörtgen (0, 0, MyBase.Width, MyBase.Height) Dim ru
            Intptr = GetWindowDC gibi hDC Dim (Me.Handle)
            Grafik = Graphics.FromHdc (hDC) Dim g
            g.DrawRectangle (Pens.Black, Yeni Dikdörtgen (1, 1, Genişlik - 3, Yükseklik - 3))
            g.DrawRectangle (Yeni Kalem (Color.FromArgb (90, 90, 90)), Yeni Dikdörtgen (0, 0, Genişlik - 1, Yükseklik - 1))
            ReleaseDC (Me.Handle, hDC)
            g.Dispose ()
        End If
    End Sub

    Sub New ()
        BackColor = Color.Black
        ForeColor = Color.White
        Text = Name.ToString
        SetStyle (ControlStyles.DoubleBuffer, True)
        DoubleBuffered = True
    End Sub


End Class



VİSUAL BASİC.NET TEMALARI İNDİR :

http://1drv.ms/1GWJW7x