TurkProgrammers.NeT
Ana sayfa Ana Sayfa | Ana sayfanız yapın | Sık kullanılanlara ekle | Rss/Rdf Besleme| JavaScript
Bölümler
Arşiv
paz sa ça cu cum pa
1234
567891011
12131415161718
19202122232425
262728293031

Mailinizi ekleyin
Haberlere abone olun:

anket: Web Programcılığının Geleceğini nasıl görüyorsunuz
Web Programcılığının Geleceğini nasıl görüyorsunuz?
Önü Fazlası ile açık
ilerde yapacak web sitesi kalmayacak
Hazır sistemler işleri iyice bitirecek
Bugünden daha kötü olamaz
Anket sonuçları | Eski Anketler


email Arkadaşınızın maili | print Yazıcı versionu | comment Yanıtlar (0 Gönder)

hızlı resim çizdirme

by caner kuru on Ağustos 13,2008

image
VB6'nın yavaşlığından gına geldiyse BLt API'leri emrinize amade. Hem işi hızlı ve temiz yapıyorlar hem de bir kaç önemli özellikleri var, istediğiniz yerleri çizdirmemeleri gibi...
Işık hızıyla resim çizdirme

Tek başına visual basic’i oyun yapımı konusunda kullanışsız kılan şey şaşırtıcı yavaşlığı ve kendi nesne ve fonksiyonlarının yetersizliğinden başka bir şey değildir. Ama çok sevindirici bir biçimde API’lere neredeyse diğer programlama dilleriyle aynı hızda ulaşıp işlem yaptırabilmektedir. O yüzden onları bu kadar seviyoruz zaten, değil mi?
Eğer bir resmi API ile(belli bölümleri şeffaf olacak şekilde) ekranda göstermek istiyorsanız bunun için kullanabileceğiniz EN KISA iki yöntem StretchBlt ve TransparentBlt fonksiyonlarıdır. Burada ikisini de inceleyeceğiz.

1.TransparentBlt

Aşağıdaki şekilde declare edilir:

Private Declare Function TransparentBlt Lib "msimg32" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long

Biraz karışık gibi.

Burada hdcDest “hdcDestination” yani resmin çizdirileceği hedef olan form veya picturebox’dur. hdcSrc ise “hdcSource” yani resmin alınacağı kaynaktır. Bunların değeri long’dur ve bu değerleri sadece bir hDC’ye sahip olabilen kontrollerden(Picturebox,Form,Usercontrol…) alabilirsiniz. Image nesnesinin bir hDC’si yoktur. Aynı bunlar gibi sonunda src olanlar kaynaktan resmin nasıl alınacağını, dest olanlar ise resmin nasıl basılacağını belirtir. crTransparent ise şeffaf kabul edilecek ve yok sayılacak olan renktir.
Tüm Blt fonksiyonları pixel uzunluk birimi üzerinden işlem yaptığından kullanacağınız kaynak ve hedef nesnelerin hepsinin scalemode özelliğini pixel,Auto Redraw özelliğini true yapmayı unutmayın, yoksa “hata nerde, nerede hıııagh” şeklinde kafayı yiyip en yakın ahşap materyale girişebilirsiniz(ya da burası çok sıcak, ondan tahammül edemedim ben).
Şimdi ilk TransparentBlt kodumuzu yazalım:

Private Sub Command1_Click()
TransparentBlt Me.hDC, 0, 0, 100, 100, Picture1.hDC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, RGB(0, 255, 0)
End Sub

Gördüğünüz gibi kimsenin oyun grafiği hazırlarken kullanmayacağını düşündüğüm “cortlak yeşil” rengini transparent yaparak resmimizi çizdirdik. Burada kaynağın en,boy ve pozisyon değerleri ile çok kullanışlı fonksiyonlar yazabilirsiniz(örneğin 10 karelik bir animasyonu tek bir resim olarak hazırlarsınız o istediğiniz kareyi bulup çizdirir)
(gördüğünüz gibi width ve height yerine scalewidth ve scaleheight kullanıyoruz, unutmayın)

2.StretchBlt

Bu fonksiyonumuz ise şu şekilde:

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

Stretchblt, biraz önce kullandığımız TransparentBlt fonksiyonuyla önemli bir farklılık gösteriyor. Diğer her şey aynı olmasına rağmen, bu fonksiyonda şeffaf göstermek için herhangi bir renk değişkeni yok. Peki bunu nasıl yapacağız? Flash ile uğraştıysanız aşinalığınız vardır, mask yöntemiyle. Yani eğer “Kardeşim benim elimde bir resim var ama ben bunun istediğim bir parçasını göstereceğim, ama mesela bu parça yıldız şeklinde olacak” vs vs diyorsanız, doğru yerdesiniz. Fakat bunu istiyorsanız transparentblt gibi de kullanabilirsiniz, aynı işi görür.
Yeni değişkenimiz olan dwRop, “vbSrcCopy” “vbSrcAnd” “vbSrcPaint” değerlerini alabiliyor. Eğer vbSrcCopy değerini verirseniz resmin bir kopyası aynen çizilecektir. Bizim mask yaparken kullanacağımız And ve Paint değerleri ise resmin renk değerleriyle arka plan değerlerinin üzerinde bazı özel işlemler yapmaktadır, fakat bunları hangi mantıkla yaptıklarını çözmeye çalışmak beynimi acıtmaya başladı, birisi bulursa bana söylesin!
Şimdi ilk stretchblt kodumuzu yazalım. Biraz Paint kullanmamız gerekecek :-) ilkönce resime siyah bir top çizin ve çevresini beyaz yapın. İşte bu bizim mask’ımız. Beyaz kısımların görünmemesini sağlayacak. Bunu picture1’e koyun. İkinci resmimiz siyah arkaplan ve istedğiniz renkte bir top yapın(bu bizim görüntülenecek olan resmimiz, o yüzden topu biraz süsleyin ki tam deneme olsun :-) ) Bunu da picture2’ye koyun ve aşağıdaki kodu bir deneyin:

Private Sub Command1_Click()
StretchBlt Me.hdc, 0, 0, 100, 100, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbSrcAnd
StretchBlt Me.hdc, 0, 0, 100, 100, Picture2.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbSrcPaint
End Sub

Kafa karıştırıcı, değil mi? Şimdi bunu geliştirmek size kalıyor. Umarım istediğiniz bilgiyi elde etmişsinizdir. Eğer bir resmi şeffaf göstermek için daha farklı yollar istiyorsanız yayınlanacağını umduğum UserControl’larda mask yapımıyla ilgili makaleme de bakabilirsiniz.

231 Kere okundu

Bu makaleyi beyendinizmi ?

1 2 3 4 5 Rating: 3.00Rating: 3.00Rating: 3.00 (Toplam 10 Oylar)
comment Yanıtlar (0 Gönder)
Çok okunanlar
En Çok Yorumlananlar
Yazarlar