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 kac onemli ozellikleri var, istediğiniz yerleri cizdirmemeleri gibi...Işık hızıyla resim cizdirme
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 cok sevindirici bir bicimde API’lere neredeyse diğer programlama dilleriyle aynı hızda ulaşıp işlem yaptırabilmektedir. O yuzden onları bu kadar seviyoruz zaten, değil mi?
Eğer bir resmi API ile(belli bolumleri şeffaf olacak şekilde) ekranda gostermek istiyorsanız bunun icin kullanabileceğiniz EN KISA iki yontem 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 cizdirileceğ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.
Tum Blt fonksiyonları pixel uzunluk birimi uzerinden işlem yaptığından kullanacağınız kaynak ve hedef nesnelerin hepsinin scalemode ozelliğini pixel,Auto Redraw ozelliğ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ı cok sıcak, ondan tahammul 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
Gorduğunuz gibi kimsenin oyun grafiği hazırlarken kullanmayacağını duşunduğum “cortlak yeşil” rengini transparent yaparak resmimizi cizdirdik. Burada kaynağın en,boy ve pozisyon değerleri ile cok kullanışlı fonksiyonlar yazabilirsiniz(orneğin 10 karelik bir animasyonu tek bir resim olarak hazırlarsınız o istediğiniz kareyi bulup cizdirir)
(gorduğunuz 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 once kullandığımız TransparentBlt fonksiyonuyla onemli bir farklılık gosteriyor. Diğer her şey aynı olmasına rağmen, bu fonksiyonda şeffaf gostermek icin 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 yontemiyle. Yani eğer “Kardeşim benim elimde bir resim var ama ben bunun istediğim bir parcasını gostereceğim, ama mesela bu parca yıldız şeklinde olacak” vs vs diyorsanız, doğru yerdesiniz. Fakat bunu istiyorsanız transparentblt gibi de kullanabilirsiniz, aynı işi gorur.
Yeni değişkenimiz olan dwRop, “vbSrcCopy” “vbSrcAnd” “vbSrcPaint” değerlerini alabiliyor. Eğer vbSrcCopy değerini verirseniz resmin bir kopyası aynen cizilecektir. Bizim mask yaparken kullanacağımız And ve Paint değerleri ise resmin renk değerleriyle arka plan değerlerinin uzerinde bazı ozel işlemler yapmaktadır, fakat bunları hangi mantıkla yaptıklarını cozmeye calışmak beynimi acıtmaya başladı, birisi bulursa bana soylesin!
Şimdi ilk stretchblt kodumuzu yazalım. Biraz Paint kullanmamız gerekecek :-) ilkonce resime siyah bir top cizin ve cevresini beyaz yapın. İşte bu bizim mask’ımız. Beyaz kısımların gorunmemesini sağlayacak. Bunu picture1’e koyun. İkinci resmimiz siyah arkaplan ve istedğiniz renkte bir top yapın(bu bizim goruntulenecek olan resmimiz, o yuzden topu biraz susleyin 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 gostermek icin daha farklı yollar istiyorsanız yayınlanacağını umduğum UserControl’larda mask yapımıyla ilgili makaleme de bakabilirsiniz.
__________________
Işık hızıyla resim cizdirme-Blt fonksiyonları
Programlama0 Mesaj
●22 Görüntüleme
- ReadBull.net
- Programlama ve Yazılım
- Programlama
- Işık hızıyla resim cizdirme-Blt fonksiyonları