seo güncelleme alanı değişimi

2 Temmuz 2013 Salı Unknown 0 yorum

Güncelleme alanının değiştirilmesi


            InvalidateRect fonksiyonuyla bir pencerenin güncelleme alanı istenilen dikdörtgensel bölge haline getirilebilir. Güncelleme alanı boş küme olmaktan çıkartılırsa kısa bir süre sonra Windows pencereye WM_PAINT mesajnı gönderir.
  
            Fonksiyonun birinci parametresi güncelleme alanının değiştirileceği handle değeridir. İkinci parametre güncelleme alanının koodinatlarını tutan yapının başlangıç adresidir. Eğer bu parametre NULL olarak girilirse güncelleme alanı çalışma alanı olarak alınır. Üçüncü parametre TRUE ya da FALSE olabilir. TRUE ise pencerenin zemini yeniden boyanır, FALSE ise boyanmaz.

Çizim Bileşenlerinin Belirlenmesi ve Kaldırılması

            Bir çizimde kullanılacak kalem, fırça gibi çizim bileşenleri için bir seçme işleminin yapılması gerekir. Bütün çizim bileşenleri diğerinden bağımsız ayrı bir çizim nesnesidir. Yani bütün çizim bileşenlerinin önce yaratılması gerekir. Örneğin bir kalem yaratmak için CreatePen, bir fırça yaratmak için CreateBrushIndirect gibi API fonksiyonları vardır. Bu fonksiyonlar çizim nesnelerine ilişkin handle değerini geri dönüş değeri olarak verirler. Örneğin:


Çizim nesnesi yaratan API fonksiyonlarının geri dönüş değerleri HPEN, HBRUSH, HBITMAP gibi olsa da bunların hepsinin gerçek türü void * biçimindedir. Bir çizim nesnesi yaratıldıktan sonra kullanılması için bir çizim handle'ı ile ilişkilendirilmesi gerekir. Bu ilişkilendirme işlemi SelectObject API fonksiyonuyla yapılır.


Fonksiyonun birinci parametresi çizim nesnesinin seçildiği DC bilgisidir. Fonksiyonun ikinci parametresi seçilecek çizim nesnesinin handle değeridir. İkinci parametre olarak HPEN, HBRUSH herhangi bir çizim nesnesine ilişkin bir handle girilebilir. Fonksiyonun geri dönüş değeri daha önce seçili olan çizim nesnesinin handle değeridir. SelectObject ile yapılan şey DC veri yapısının ilgili elemanının çizim nesnesinin handle değeriyle doldurulmasıdır. Özetle çizim işlemlerinde şunlar olmaktadır:
1. Çizim için bir DC nesnesi yaratılır. Yaratıldığında çizim nesneleri için default değerler kullanılmaktadır.
2. Çizim nesneleri CreateXXX fonksiyonlarıyla yaratılarak handle değerleri ede edilir.
3. SelectObject API fonksiyonu ile DC nesnesiyle çizim nesnesi ilişkilendirilir.


Temel Çizim Fonksiyonları


            Bir doğru çizebilmek için iki noktaya gereksinim vardır. Noktalardan ilki MoveToEx fonksiyonuyla tespit edilir, daha sonra LineTo fonkiyonuyla diğer nokta belirlenerek çizim yapılır. Windows'da pek çok çizim işleminde güncel nokta kavramı kullanılır. Güncel nokta MoveToEx fonksiyonuyla değiştirilir. Örneğin LineTo fonksiyonu güncel noktadan belirtilen noktaya kadar çizim yapar. LineTo fonksiyonu güncel noktayı doğrunun son noktası olarak günceller.



LineTo fonksiyonu çizgiyi DC nesnesiyle belirtilen kalemle çizer. Yani örneğin farklı bir renkte, farklı bir kalınlıkta, farklı bir biçimde çizebilmek için yeni bir kalem yaratmak gerekir.

Çizim Nesneleri Ne Zaman Yaratılmalı?


            Çizim nesnelerinin her defasında WM_PAINT mesajı içinde yaratılmasına gerek yoktur. Örneğin programında başında WM_CREATE mesajı içerisinde kalemler ve fırçalar yaratılabilir. Ancak çizim nesnesinin SelectObject ile seçilme işlemi DC nesnesi yaratıldıktan sonra Yani WM_PAINT mesjaı içeirisinde yapılmalıdır. Çizim nesnelerini geri bırakmak için DeleteObject API fonksiyonunu kullanmak gerekir.


            Çizim nesneleri boşaltılmazsa program bittiğinde işletim sistemi tarafından boşaltılır(WM_DESTROY mesajı içerisinde boşaltmanın önemli bir anlamı yoktur).

Önceden Tanımlanmış Çizim Nesneleri


            Windows'da bazı çizim nesneleri sistem yüklendiğinde otomatik olarak zaten sistem tarafından oluşturulur. Böylelikle klasik bazı çizimler için çizim nesnesi yaratmaya gerek kalmaz. Tabii bu çizim nesnelerinin SelctObject ile seçilmesi gerekir. Önceden tanımlanmış çizim nesnelerinin handle değerlerini alabilmek için GetStockObject API fonksiyonu kullanılır.



Fonksiyonun parametresi önceden tanımlanmış çizim nesnesini anlatan bir sayıdır. Bu sayı şunlardan biri olabilir:

BLACK_BRUSH
DKGRAY_BRUSH
GRAY_BRUSH
HOLLOW_BRUSH
LTGRAY_BRUSH
NULL_BRUSH
WHITE_BRUSH
BLACK_PEN
WHITE_PEN
NULL_PEN

Dikdörtgen Çizme


            Dikdörtgen çizmek için Rectangle API fonksiyonu kullanılır.



Bu fonksiyon sol üst ve sağ alt köşegeniyle belirtilen dikdörtgeni çizer. Dikdörtgenin çizgileri kalemle çizilir, içi fırçayla boyanır.
            Fırça yaratabilmek için CreatBrushIndirect API fonksiyonu kullanılır.

HBRUSH CreateBrushIndirect(CONST LOGBRUSH *lplb);

Fonksiyon parametre olarak LOGBRUSH türünden bir yapı değişkeninin adresini alır.

Pencere Zemininin Silinmesi


            BeginPaint fonksiyonu çizime ilişkin handle'ı almadan önce WM_ERASEBCGND mesajını SendMessage ile pencere yollar(GetWindowDC ve GetDC fonksiyonları bu mesajı yollamaz). WM_ERASEBKGND mesajı işlenmezse DefWindowProc tarafından işlenir. DefWindowProc WNDCLASS yapısının hbrBackground elemanı ile belirtilen fırça ile tüm pencere zeminini boyar. Bir pencerenin zemin rengini değiştirmek için tek yapılacak şey WNDCLASS yapısının hbrBackground elemanını başka bir fırça ile set etmektir. Bu eleman WNDCLASS register ettirilmeden önce set edilmelidir. Ya da SetClassLong ile GCL_HBRBACKGROUND parametresi kullanılarak herhangi bir yerde örneğin WM_CREATE mesajı içerisinde saet edilebilir.

WM_MOUSEMOVE Mesajı

            Mouse pencere içerisinde dolaştırıldığında Window sürekli olarak WM_MOUSEMOVE mesajını kuyruğa bırakır. Böylelikle mouse hareketinin takip edilebilmesi sağlanır. Bu mesajın parametre bilgileri şunlardır:

wParam
Tuş bilgisi
LOWORD(lParam)
x
HIWORD(lParam)
y


Sürükle ve Bırak İşlemlerinin Gerçekleştirilmesi


             En kolay yöntem WM_MOUSEMOVE mesajında mouse'un sol tuşuyna nasılı olup olmadığının tespit edilmesidir. Sürükleme işlemi şöyle anlaşılabilir:

Çizim İşleminin WM_PAINT Mesajının Dışında Başka Bir Yerde Yapılması


            Çizim işlemi kalıcı bir biçimde yapılacaksa WM_PANT mesajı içerisinde yapılacaktır. Ancak bazı durumlarda başka mesajlarda da çizimin yapılması zorunlu olabilir. Örneğin sistemin aşırı yüklenmesi sonucunda çizim işleminin InvalidateRect sonrası belirsiz bir zamanda yapılacak olması gecikmeye yol açabilir. Klavyeden basılan tuş karşısında hemen çizim yapılması gerektiği bir durum buna örnek verilebilir. WM_PAINT mesajı dışında çizimin yapıldığı diğer bir örnek ekranda hızlı bir çizim işleminin görüntülenmek istendiği durumdur. Örneğin mouse'un sürüklenmesi ile içi boyalı dikdörtgensel bir alan çizilecek olsa ikide bir WM_PAINT mesajının gelmesi ve bütün pencere çizimlerinin yeniden yapılması görüntüde titremelere yol açabilir. Çizim işlemi başka bir mesajda yapılacaksa GetDC API fonksiyonuyla handle alınır, çizim bu handle ile yapılır. Aynı çizim WM_PAINT mesajı içerisinde kalıcı bir biçimde tekrar yapılmalıdır.



Çizim Görüntülerinin WM_PAINT Mesajı için Saklanması


            Çizim işlemleri başka bir mesajla yapılıyorsa aynı işlemlerin görüntünün korunması amacıyla WM_PAINT mesajı içerisinde de yapılması gerekir. Bunun için yapılan çizim işlemlerinin bir veri yapısı içerisinde saklanması gerekebilir. Bu veri yapısı için bir yapı dizisi kullanılabilir. Tabii en iyi eknik bir bağlı liste yapısının kullanılmasıdır.

Koordinat Sistemleri



            Koordinat sistemi DC nesnesinde belirtilen "mapping mode"a bağlıdır. Koordinat sistemi genellikle ya çalışılan pencerenin çalışma alanının sol üst köşesi olur ya da desktop'ın sol üst köşesi olur. Bir grup API fonksiyonunda koordinat sistemi eğer ana pencere söz konusuysa dektop'ın sol üst köşesi, alt pencere söz konusu ise çalışma alanının sol üst köşesidir. Örneğin CreateWindow ve MoveWindow API fonksiyonları böyle çalışır. Ancak bazı grup API fonksiyonlarında koordinat sistemi her zaman desktop'ın sol üst köşesidir. Örneğin GetWindowRect fonksiyonu bu biçimde çalışır. Nihayet bir grup API fonksiyonunda da koordinat sistemi her zaman çalışma alanının sol üst köşesidir. 

0 yorum: