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: