Misafir Board  
| Reklam Alanı |

Üyelerimiz görüşlerini önceden onay olmadan anında yazabilmektedir, bu yazılardan dolayı doğabilecek her türlü sorumluluk yazan kullanıcılara aittir, (Bütün kullanıcıların IP adresleri tutulmaktadır) misafir.net yöneticileri itina ile icerik kontrolleri yapmaktadır, yine de misafir.net'te yasalara aykırı unsurlar bulursanız MSN: Private@misafir.net adresinden bizlere ulaşabilirsiniz, gereği yapılacaktır.

MODERATÖR BAŞVURU FORMU


PROGRAM & DONANIM & İŞLETİM SİSTEMLERİ

Visual Basic Ile Ilgili Herseyi Bulabilirsiniz

Katagorisinde ve  Programlama Forumunda Bulunan  Visual Basic Ile Ilgili Herseyi Bulabilirsiniz Konusunu Görüntülemektesiniz.=>üye fonksiyonu kullanılabilir. Çok sayıda benzer yazıtipi oluşturulursa LOGFONT yapısı kullanılabilir. CFont Sınıfını Kullanarak Yazıtipi Oluşturmak CFont sınıfından ilk kez nesne oluşturulacağında nesnenin çok fazla parametre alması sizi ürkütmüş olabilir. ...

Geri git   Misafir Board >
PROGRAM & DONANIM & İŞLETİM SİSTEMLERİ
> Programlama
Anasayfa Kimler Online Bugünki Mesajlar Bütün Forumları okunmuş kabul et

Programlama C,C++,Visual C, Flash vb. programlama ile ilgili herşey..

Tags
basic, bulabilirsiniz, herseyi, ile, ilgili, visual


Konu Bilgileri
Konu Başlığı
Visual Basic Ile Ilgili Herseyi Bulabilirsiniz
Konudaki Cevap Sayısı
29
Şuan Bu Konuyu Görüntüleyenler
 
Görüntülenme Sayısı
2495

Cevapla
 
LinkBack Seçenekler
Alt 05-02-2006, 08:14   #26 (permalink)
aLkoLSüZ!!!
 
Privacy - ait Kullanıcı Resmi (Avatar)
 
Privacy
Kullanıcı No: 5
Konu Sayısı: 4711
Mesaj Sayısı: 17,386
Üyelik tarihi: Apr 2005
Nerden: FENERBAHCE CUMHURİYETİ
Teşekkür & Tepki Teşekkür: 4
Tepki:0
Karizma
REP Gücü : 100
REP Puanı : 704162779
REP Seviyesi : Privacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond repute
İletişim
Reklam Alanı
Standart




üye fonksiyonu kullanılabilir. Çok sayıda benzer yazıtipi oluşturulursa LOGFONT yapısı kullanılabilir.

CFont Sınıfını Kullanarak Yazıtipi Oluşturmak

CFont sınıfından ilk kez nesne oluşturulacağında nesnenin çok fazla parametre alması sizi ürkütmüş olabilir. Aslında bu parametrelerin çoğu varsayılan değerlerinde veya sı¬fır olarak bırakılabilir ve Windows yazıtipi eşleştiricisi sizin için bir yazıtipi seçebilir.

Kod 6.11 CFont sınıfını ve CreateFont fonksiyonunu kullanarak kolaylıkla bir Arial yazıtipi oluşturulabilineceğini göstermektedir. Arial olarak belirlenen yazıtipi ismi dı¬şında bütün parametreler sıfır yapılmıştır. Bu kod, yazıtipi eşleştiricisinin uygun bir yazıtipi seçmesini ister ve yalnızca yazıtipinin isminin Arial olacağım belirtir.

Kod 6.11. Bir CFONT Nesneyi Oluşturup Kullanmanın Kolay Bir Yolu

void CMyView::OnDraw(CDC* pDC)
{
CFont fntArial;
fntArial.CreateFont( 0, 0, 0, 0,0,0,0,0,0, 0, 0, 0, 0, “Arial”);
CString szMsg = “Hello! I’m an Arial Font”);
CFont* pOldFont = pDC->SelectObject( &fntArial );
pDC->TextOut( 0, 50, szMsg );
// Eski GDI nesnelerini getir.
pDC->SelectObject( pOldFont );
}

Tüm GDI nesnelerinde olduğu gibi, bir cihaz ortamına yeni bir yazıtipi se¬çildiğinde döndürülen orijinal yazıtipini kaydetmeniz gerekir. Cihaz orta¬mıyla işiniz bittiğinde cihaz ortamına orijinal yazıtipini seçmede başarısız olursanız kaynak sızıntısına yol açarsınız.

Stok Yazıtipi Nesnelerini Kullanmak

Windows altı adet stok yazıtipi sunar:

• ANSI_FIXED_FONT: Sabit genişlikli bir sistem yazıtipi.

• ANSI_VAR_FONT: Değişken genişlikli bir sistem yazıtipi.

• DEVICE_DEFAULT_FONT: Cihazdan bağımsız bir yazıtipi. Bu stok nesne¬si yalnızca Windows NT’de kullanılabilir.

• DEFAULT_GUI_FONT: Menü ve iletişim kutusu gibi kullanıcı arabirimleri için varsayılan yazıtipi.

• OEM_FIXED_FONT: OEM’den bağımsız sabit genişlikli yazıtipi.

• SYSTEM_FONT: Sistem yazıtipi.

Diğer stok nesneleri gibi bu yazıtipleri de Selectstockobject fonksiyonu çağrılarak ve stok nesnesini parametre olarak aktararak bir CDC nesnesi aracılığıyla kullanılır:

CPen* pOldFont = pDC->SelectstockObject(SYSTEM_FONT );

Bir Pencere için Yazıtipi Belirlemek

CWnd::SetFont fonksiyonunu çağırarak bir kontrolün veya herhangi bir pencere¬nin kullandığı yazıtipini değiştirebilirsiniz. SetFont fonksiyonu parametre olarak bir CFont nesnesine işaretçi alır:

pCtrl -> SetFont(fntWingDings);

Bir pencerenin yazıtipini değiştirirseniz, parametre olarak aktarılan yazıtipini pen¬cere var olduğu sürece geçerli tutmanız gerekir.

Common Font İletişim Kutusunu Kullanmak

Diğer ortak iletişim kutuları gibi Common Font iletişim kutusu da bir programcı olarak size yaygın olarak kullanılan bir iletişim kutusunu Windows programları¬nızda kolaylıkla kullanmanıza olanak sağlar. Kullanıcı açısından bakıldığında Common Font iletişim kutusu son derece esnektir; kullanıcı tek bir iletişim kutu¬su içinde yazıtipinin rengini, stilini ve büyüklüğünü değiştirebilir. Görünüm penceresinde kullanılacak bir yazıtipi seçmek için Common Font iletişim kutusunu kullanırsınız.

Yazıtiplerini Programda Kullanmak

MFC CFont sınıfının uygulamalarınızda nasıl kullanılabileceğini gösteren bir örnek olarak DCTest projesini değiştirebilirsiniz.




Common Font İletişim Kutusu İçin Destek Eklemek

Bu bölümde kullanıcının yazıtipini kontrol edebilmesi için DCTest projesini değiştireceksiniz. Kullanıcı Common Font iletişim kutusu kullanarak yazıtipini seçebile¬cektir ve DCTest programı yazı görüntülerken o yazıtipini kullanacaktır. Yazıtipi CDCTestview sınıfının bir üyesi olan bir LOGFONT değişkeniyle temsil edilmekte¬dir. Common Font iletişim kutusunda yeni bir yazıtipi seçildikten sonra LOGFONT değişkeni güncellenir ve görünüm yeniden çizilir.

Common Font iletişim kutusunu eklemek için beş adım gereklidir:

1. CDCTestView sınıfına yeni bir LOGFONT değişkeni ekleyin.

2. CDCTestView yapılandırıcısını değiştirin.

3. Yazıtipini değiştirmek için yeni bir menü maddesi oluşturun.

4. CDCTestView sınıfında yeni menü maddesini yönetecek bir fonksiyon oluşturun.

5. Bir yazıtipi oluştururken yeni LOGFONT değişkeninin kullanılabilmesi için CDCTestView::OnDraw üye fonksiyonunu değiştirin.

CDCTestView Sınıfına Bir LOGFONT Değişkeni Eklemek

İlk adım CDCTestView sınıfına bir LOGFONT değişkeni eklemektir. OnDraw üye fonksiyonunun her çağrılışında yazıtipi oluşturulup yok edilmesine rağmen, LOGFONT değişkeni görünüm için seçilmiş olan yazıtipinin o anki özelliklerini saklar. CDCTestView sınıfının yapılandırıcısı bu değişkene bilinen bir ilk değer vermelidir. Kod 6.12 CDCTestview yapılandırıcısının yeni halini içermektedir. Önceki versi¬yondan beri yalnızca son iki satır eklenmiştir.

Kod 6.12. m_LOGFONT Değişkenine İlk Değer Veren Kaynak Kod

CDCTestView: :CDCTestView( )
{
m_nMapMode = MM_TEXT;
m_map.SetAt( MM_ANISOTROPIC,“MM_ANISOTROPIC ”);
m_map.SetAt(MM_HIENGLISH,“MM_H IENCLISH”);
m_map.SetAt(MM_HIMETRIC,“MM_HI METRIC”);
m_map.SetAt(MM_ISOTROPIC,“MM_I SOTROPIC”);
m_map.SetAt(MM_LOENGLISH, “MM_ LOENGLISH”);
m_map.SetAt(MM_LOMETRIC,“MM_LO METRIC”);
m_map.SetAt(MM_TEXT,“MM_TEXT”) ;
m_map.SetAt(MM_TWIPS, “MM TWIPS”);
m_cxEllipse = 100;
m_cyEllipse = 200;
m_clrChoice = RGB(0,0,0);
ZeroMemory(&m_logFont,sizeof(L OGFONT));
Istrcpy( m_logFont.IfFaceName, “Ariaİ” );
}


Yeni Bir Menü Maddesi Ekleyin

Developer Studio kaynak editörünü kullanarak View menüsüne yeni bir menü maddesi ekleyin ve Tablo 6.7 ’de verilen değerleri kullanın.

Tablo 6.7. Font Menü Maddesi İçin Kullanılan Değerler

Kaynak ID Başlık ÜyeFonksiyon

ID VIEW_FONT &Font... CDCTestView::OnViewFont

Yeni menü maddesi icin CDCTestView sınıfına bir mesaj yönetimi fonksiyonu eklemek için ClassWizard’ı kullanın ve fonksiyona varsayılan OnViewFont ismini verin.

OnDraw Üye Fonksiyonunu Değiştirin

Bu örnekteki son adım, pencerede dönen bir yazı görüntülemek için seçilen yazıtipini kullanmaktır. LOGFONT yapısının IfEscapement alanı yazının açısını be¬lirtmek için kullanılır. Kod 6.13’teki kaynak kod yazıtipinin açısını bir for döngüsü içinde güncelleyerek yazının dönmesini sağlar.

Kod 6.13. Bir LOGFONT Kullanarak Dönen Bir Yazı Oluşturma

void CDCTestView::OnDraw(CDC* pDC)
{
CRect rcClient;
GetclientRect( rcClient );
pDC->DPtoLP( rcClient );
COLORREF clrOld = pDC->SetTextColor(m_clrChoice );
int nOldMode = pDC->SetBkMode( TRANSPARENT);
CString szMsg = “...Help! I ’m Spinning and 1 can’t get up!”;
CFont fntRotate;
for( int nDegrees = 0; nDegrees < 3600; nDegrees + = 200 )
{
m_LogFont . IfEscapement = nDegrees;
fntRotate.CreateFontIndirect( &m_logFont);
Cfont* pOldFont = pDC->SelectObject( &fntRotate );
pDC->TextOut( rcClient .Width( )/2,rCclient.Height( )/2, szMsg );
pDC->SelectObject( pOldFont);
fntRotate.DeleteObject( );
}
pDC->SetTextcolor( clrOld );
pDC->SetBkMode( nOldMode );
}
Yazı, pencerenin merkezi etrafında dönecektir. Common Font iletişim kutusunda yeni bir seçim yapıldığında yazıtipi ve renk güncellenecektir.

7. BÖLÜM

GENEL KONTROLLER

7.1. Spin, ilerleme Çubuğu ve ve Kaydıraç Kontrolleri

Bu bölümde ilk olarak Windows 95’te ortaya çıkan kontrolleri öğreneceksiniz. Bun¬lar:

• Yukarı-aşağı kontrolü olarak da bilinen spin kontrolü

• Kaydıraç (slider) kontrolü

• İlerleme çubuğu.

Genel Kontroller

Windows 95 piyasaya sürüldüğünde yepyeni kontroller içeriyordu. Topluca genel kontroller olarak bilinen bu kontroller Windows kullanıcı arabirimine heyecan verici özellikler kattı. İlgili MFC sınıflarıyla beraber bu kitapta ele alınan kontroller Tablo 7.1’de gösterilmektedir.

Tablo 7.1. Bazı Genel Kontroller Ve Onların Mfc Sınıfları

Kontrol Sınıf

Spin (Yukarı - Aşağı) CSpinButtonCtrl
Progress (İşlem) CProgressCtrl
Slider (Kaydırma) CSliderCtrl
Image List (Görüntü Listesi) CImageList
List (Liste) CListCtrl
Tree (Ağaç) CtreeCtrl

7.1.1. Spin Kontrolü

Çoğu zaman yukarı-aşağı kontrolü de denilen spin kontrolü, bir kaydırma çubuğunun uçlarındaki okları andıran ama onlardan daha küçük bir çift oktur. Spin kontrolleri genellikle spin kontrolüyle ilişkilendirilıniş bir başka kontrolün değerini ayarlamak için kullanılır. Bir spin kontrolü yatay olarak da durabilir. Yatay bir spin kontrolüne sol-sağ kontrolü denmez; kontrolün ismi aynı kalır. Spin kontrolüyle eşleşen kontrol arkadaş kontrol olarak bilinir. Bu normalde bir düzenleme kontrolüdür.

Varsayım olarak, yukarı oka tıklamak arkadaş kontrolün değerini azaltır, aşağı oka tıklamak da arkadaş kontrolün içerdiği değeri arttırır. Yukarı ve aşağı oklar bir kelime işleme dökümanındaki bir kaydırma çubuğu gibi çalışır, yukarı oka tıklamak sizi daha düşük numaralı bir satıra götürürken aşağı oka tıklamak sizi daha yüksek numaralı bir satıra götürür.

Bu davranış çoğu insanın kafasını karıştırır; neyse ki “Spin Kontrolünün Davranışını Değiştirmek” kısmında göreceğiniz gibi bu davranışı değiştirmek kolaydır.
Spin kontrolleri kullanıcının bir grup değeri kaydırarak görebileceği durumlarda idealdir. Kullanıcı değerleri yalnızca bir kaç birim birden ayarlayabilirse spin kontrolü mükemmeldir çünkü kullanıcının yalnızca birkaç fare tıklamasıyla yeni bir değer seçmesi mümkün olur.

Bir spin kontrolü kullanmak çok kolaydır. Spin kontrolünün varsayılan işlevini kullanmak için hiç kod yazmanız gerekmez. Spin kontrollerinin en gelişmiş kulla¬nımları bile yalnızca birkaç satırlık kod gerektirir; kodun çoğunu Classwizard yazar.

Spin Kontrolünü Kullanmak

Bu bölümdeki örnekler için Controls adında iletişim kutusu tabanlı bir proje kullana¬caksınız. Proje bir spin kontrolüyle başlayacak; daha sonra bir kaydıraç ile ilerleme çubuğu ekleyeceksiniz. Controls projesini oluşturmak üzere yeni proje çalışma alanı oluşturmak için Appwizard’ı kullanın. İletişim kutusu tabanlı bir proje seçin ve Finish düğmesine tıklayın.

İletişim Kutusuna Spin Kontrolü Eklemek

Controls iletişim kutusuna bir spin kontrolü eklemek diğer kontrolleri eklemekten farksızdır. Proje çalışma alanında ResourceView sekmesini seçip Dialog klasörü¬nü açarak iletişim kutusu editöründe ana iletişim kutusunu açın. İletişim kutusu ikonuna çift tıklayarak veya ikona farenin sağ tuşuyla tıklayıp açılan menüden Open komutunu seçerek IDD_CONTROLS_DIALOG iletişim kutusunu açın.

Spin kontrolünü yerleştirmek için kontrolü kontrol paletinden ana iletişim kutusuna sürükleyip bırakın veya araç paletinden spin kontrolünü seçip ana iletişim kutu¬sunda istediğiniz konuma tıklayın.

Spin Kontrolünün Özellikleri

Diğer kontroller gibi spin kontrolleri de Developer Studio kaynak editörünü kullanarak değiştirebileceğiniz özelliklere sahiptir. Kontrole farenin sağ tuşuyla tıkla¬yıp açılan menüden Properties komutunu seçerek özelliklere ulaşabilirsiniz. Spin kontrollerinin özellikleri şunlardır:

• ID spin kontrolünün kaynak ID’si için kullanilır. Developer Studio IDC_SPIN1 gibi varsayılan bir kaynak ID’si verir.

• Visible kontrolün başlangıçta görünür olacağını belirtir. Bu onay kutusu normalde işaretlidir.

• Disabled kontrolün başlangıçta kullanılamaz durumda olacağını belirtir. Bu onay kutusu genelde işaretli değildir.

• Groups bir gruptaki ilk kontrolü belirlemek için kullanılır. Bu onay kutusu genelde işaretli değildir.

• Tab Stop bu kontrole klavyedeki Tab tuşu ile ulaşılabileceğini gösterir. Bu onay kutusu genelde işaretsizdir; bu çoğu kontrolden farklıdır çünkü spin kontrolü tipik olarak bir başka kontrolün (arkadaş kontrolün) değerini de¬ğiştirmek için kullanılır. Normalde arkadaş kontrolün tab stop özelliği kul¬lanılabilir durumdadır.

• Help ID bu kontrol için ortama duyarlı bir yardım ID’si üretilmesi gerektiğini belirtir.

• Orientation spin kontrolünün yatay veya düşey olacağını gösterir. Bu seçe¬neğin varsayılan değeri kontrolün düşey olmasıdır.

• Alignment arkadaş kontrolü ile spin kontrolünün birbirleriyle nasıl ilişkilendirildiğini belirtir. Olası seçenekler Right, Left ve Unattached’dir. Varsayilan değer Unattached’dir fakat çoğu durumda Left veya Right’ı seçmenız gerekır.

• Auto Buddy spin kontrolünün arkadaş kontrolü olarak sekme sırasında bir önceki kontrolü kullanacağını gösterir. Bu onay kutusu normalde işaretli değildir fakat çoğu zaman işaretlenmesi gerekir. Bu onay kutusu işaretlenmezse, spin kontrolü bir arkadaş kontrol ile ilişkilendirilmeyecektir. Yi¬ne de bu ilişkiyi bir komut ile kurabilirsiniz. Bu işlem bir sonraki kısımda anlatılacak.

• Set Buddy Integer spin kontrolünün ilişkili olduğu arkadaş kontrolün değe¬rini belirlemesi gerektiğini gösterir. Bu onay kutusu başlangıçta seçili de¬ğildir ama çoğu zaman seçilmesi gerekir.

• No Thousands spin kontrolündeki 1000’den büyük değerler için bir ayırıcı sembol gösterilmeyeceğini belirtir. Bu onay kutusu normalde işaretli değil¬dir.

• Wrap spin kontrolünün maksimum veya minimum değerine ulaştıktan sonra “başa dönmesi” gerektiğini belirtir. Bu seçenek seçili değilse, spin kontrolü maksimum ya da minimum değerine ulaştıktan sonra durur. Bu onay kutusu normalde işaretli değildir.

• Arrow Keys spin kontrolünün değerini değiştirmek için klavyedeki ok tuşla¬rının kullanılabileceğini gösterir. Bu onay kutusu normalde işaretli değildir.

• Hot Track bu kontrol için duyarlı izleme yapılabileceğini gösterir.

Örnek programınızda kontrolün kaynak ID’sini IDC_SPIN olarak değiştirin. Diğer parametreleri oldukları değerde bırakın.

Bir Arkadaş Kontrol Eklemek

Bir spin kontrolüne arkadaş kontrol eklerken hiç kod yazmanız gerekmez; iletişim kutusu editörünü kullanmanız yeterlidir. Bir düzenleme kontrolünü bir spin kontrolüyle ilişkilendirmek için şu adımları izleyin:

1. İletişim kutusuna bir düzenleme kontrolü ekleyin. Çoğu kullanıcı spin kontrolünün arkadaş kontrolün karşısına yerleştirilmesini bekler; bu iki kontrol arasındaki bağlantıyı vurgular.

2. Arkadaş kontrole bir ID verin. Örneğiniz için düzenleme kontrolünün ö¬zellikler iletişim kutusunu açın ve kaynak ID’sini IDC_EDIT yapın. Diğer ö¬zellikler olduğu gibi kalsın.

3. Düzenleme kontrolünün sekme sırasını spin kontrolden hemen önce ola¬cak şekilde ayarlayın.

4. Layout menüsünden Tab Order komutunu seçerek (veya Ctrl+D tuşlarına basarak) sekme sırasını seçebilirsiniz. Her kontrol, kontrolün sekme sırasını temsil eden küçük bir etiketle birlikte görünür. Sekme sırasını değiştirmek için fareyle her kontrole yeni sekme sırasında tıklayın.

5. Spin kontrolünün Alignment özelliğini ayarlayın. Controls projesinde spin kontrolü arkadaş kontrolün sağına yerleştirilmiştir. Spin kontrolünün özel¬likler iletişim kutusunu açın ve Alignment değerini Right yapın.

6. Properties iletişim kutusunu açık tutup Auto Buddy ve Set Buddy Integer onay kutularını işaretleyin.

Şekil 7.1. Controls örnek programında spin kontrolü ve arkadaş kontrol içeren ana iletişim kutusu

Bir spin kontrolüne bir sekme sırası vermek kullanıcının kafasını karıştırabilir.Bu kontrole odaklanıldığında kullanıcıya verilen geribesleme çok hafiftir ve kolaylıkla gözden kaçabilir. Ayrıca, arkadaş kontrolü ve spin kontrolü normalde tek bir mantıksal kontrol olarak eşleştirilir. Bu nedenlerden ötürü çoğu durumda spin kontrolüne sekme sırası vermemeniz gerekir.

Düzenleme kontrolünün değerini atamak veya öğrenmek için, bir CEdit nesnesini düzenleme kontrolüyle ilişkilendirmek üzere ClassWizard’ı veya “Düzenleme Kontrollerini Kullanmak” adlı bölümde anlatılan tekniklerden birini kullanın.

CSpinButtonCtrl Sınıfını Kullanmak

Bir spin kontrolünü yönetmek için CSpinButtonCtrl MFC sınıfı kullanılabilir. Örnek programınızdaki IDC_SPIN kontrolünü CSpinButtonCtrl nesnesiyle ilişkilendirmek için ClassWizard’ı kullanın.

Spin Kontrolünün Davranışını Değiştirmek

Daha önce söz edildiği gibi, spin kontrolunun varsayılan davranışı aşağı oka tıklandığında kontrolün değerini azaltması ve yukarı oka tıklandığında kontrolün de¬ğerini arttırmasıdır. Spin kontrolünün değer aralığının yönünü ters çevirerek bu davranışı kolaylıkla değiştirebilirsiniz.

Bir spin kontrolünün değer aralığının yönünü değiştirmek için CSpinButtonCtrl sınıfının SetRange fonksiyonunu kullanın. SetRange fonksiyonunun iki parametresı vardır: ilk parametre kontrolün değer aralığının alt sınırı, ikinci parametre de üst sınırıdır.

mspin.SetRange( 0, 100 );

Spin kontrolüne yeni bir değer aralığı atamak için CControlsDlg::OnInitDialog üye fonksiyonuna Kod 7.l’deki kaynak kodu ekleyin. Bu kaynak kod // TODO satırın¬dan hemen sonra eklenmelidir.

Kod 7.1. Bir Spin Kontrolüne Değer Aralığı Atama

// TODO : Buraya ilk değerleri ekle
mspin.SetRange( 0, 100 );

Diğer CSpinButtonCtrl üye fonksiyonları Tablo 7.2’te listelenmiştir.

Tablo 7.2. CspinButtonCtrl Sınıfının Üye Fonksiyonları

Fonksiyon Tanım

SetAccel Spin konumu için değişim oranını ayarlar.

GetAccel Spin konumu için değişim oranını döndürür.

SetBase Spin konumu için başlangıcı ayarlar (10 ya da 16).
GetBase Spin konumu için başlangıcı döndürür

SetPos Mevcüt spin konumunu ayarlar.

GetPos Mevcut spin konumunu döndürür.

Controls projesini derleyip çalıştırın. Artık spin kontrolünün yukarı okuna tıklandığında düzenleme kontrolündeki değer arttırılır ve kontrolün aşağı okuna tıklandığında düzenleme kontrolünün değeri azaltılır. Birçok kullanıcının spin kontrolünden beklediği davranış budur.


Şekil 7.2. Controls projesinin kaydıraç konrolü eklendikten sonraki ana iletişim kutusu

Kaydıraç Kontrolünü Kullanmak

Kaydıraç kontrolü (slider control) iki nokta arasında hareket ettirebile¬ceğiniz bir kaydırma çubuğu içeren bir kontroldür. Windows Control Panel’deki (Denetim Masası) Display (Görüntü) kısmında bir kaydıraç kontrolü kullanıl¬maktadır. Settings (Ayarlar) sekmesi ekran çözünürlüğünü ayarlamak için bir kaydıraç kullanır.

Kullanıcı kaydıracı fareyle sürükleyerek veya kaydıraca odaklanıp klavyedeki ok tuşlarını kullanarak kaydıracı hareket ettirir. Kullanıcının kaydıraç çubuğunun ko¬numunu kolaylıkla anlayabilmesine yardımcı olacak çentik işaretleri içeren kaydıraçlar oluşturabilirsiniz.

Kaydıraç Kontrolünü Kullanma Zamanının Belirtilmesi

Kullanıcının belli bir aralık içinden bir değer seçmesi istendiğinde kaydıraçlar çok kullanışlıdır. Kaydıraç kontrolün o anki değerini ve değerin üst ve alt sınırlara ya¬kınlığını kullanıcıya gösterir. Kaydıraçlar iletişim kutusuna aynı diğer kontroller gibi eklenir; tek yapmanız ge¬reken kontrolü araç paletinden iletişim kutusuna sürükleyip bırakmaktır. Sıfırdan başlayarak da bir kaydıraç oluşturabilirsiniz ama Developer Studio iletişim kutusu editöründe hazır bir kaydıraç eklemek çok daha kolaydır.

IDD_CONTROLS_DIALOG kaynağını açın ve kontrol paletinden bir kaydıraç kont¬rolüne tıklayarak kontrolü iletişim kutusuna sürükleyip bırakın.

Kaydıraç Kontrolünün ÖzeIlikleri

Bir kaydıraç kontrolunun Properties iletişim kutusu, spin kontrollerinin sahip olduğu özelliklerden çoğunun yanı sıra yalnızca kaydıraç kontrollerine özgü olan birkaç özellik içerir. Kullanılabilecek özellikler şunlardır:

• ID kaydıraç kaynağının ID’sidir. Developer Studio IDC_.SLIDER1 gibi varsayılan bir kaynak ID’si verir.

• Visible kontrolün başlangıçta görünür olduğunu belirtir. Bu onay kutusu normalde işaretlidir.

• Disabled kontrolün başlangıçta kullanılamaz durumda olacağını belirtir. Bu onay kutusu normalde işaretli değildir.

• Group bir gruptaki ilk kontrolü belirlemek içindir. Bu onay kutusu normalde işaretli değildir.

• Tab Stop bu kontrole klavyedeki Tab tuşu ile ulaşılabileceğini gösterir. Bu onay kutusu genelde işaretlidir.

• Help ID bu kontrol için ortama duyarlı bir yardım ID’si oluşturulacağını gösterir.

• Orientation kaydıracın yatay mı, düşey mi olduğunu gösterir. Varsayılan değer kontrolün düşey olmasıdır.

• Point seçime bağlı çentik işaretlerinin konumunu belirtmek içindir. Üç se¬çenek vardır: Top/Left (üst/sol), Bottom/Right (alt/sağ) veya Both (her ikisi). varsayılan değer Bottom/Right’tır.

• Tick Marks kaydıraç için çentik işaretleri gösterileceğini belirtir. Bu onay kutusu genelde işaretli değildir.

• Auto Ticks kaydıraç kontrolü boyunca belli aralıklarda çentik işaretleri gösterileceğini belirtir. Bu onay kutusu genelde işaretli değildir.

• Enable Selection kaydıracın bir değer aralığı seçmek için kullanılabilmesini sağlar. Bu onay kutusu genelde işaretli değildir.

• Border kontrolün çevresinde bir çerçeve çizileceğini gösterir. Bu onay kutusu genelde işaretli değildir.

Bir sonraki kısımda bir ilerleme çubuğunu kontrol etmek için bir kaydıraç kulla¬nacaksınız. O örneğe hazırlanmak için kaydıraç kontrolünüzün özellikler iletişim kutusunu açın ve aşağıdaki kaydıraç özelliklerini ayarlayın:

• ID’yi IDC_SLIDER yapın.

• Tick Marks seçeneğini işaretleyin.

• Auto Ticks seçeneğini işaretleyin.

• Enable Selection seçeneğini işaretleyin.


7.1.2. İlerleme Çubuğu Kontrolünün Kullanılması

İlerleme çubuğu (progress bar) bir işlemin ilerleyişini göstermek için kullanılır ve işlem tamamlandıkça genelde soldan sağa doğru dolar. Sıcaklık, su seviyesi veya benzer ölçümleri göstermek için de ilerleme çubuklarını kullanabilir¬siniz. Aslında, çoğu Windows programının C++ dilinde yazıldığı eski günlerde bu kontrolün ilk adlarından biri “Gaz Ölçer” idi.

Developer Studio’da ilerleme çubukları bir projenin kaydedilme veya yüklenme işlemlerinin ilerleyişini göstermek için kullanılır. İlerleme çubukları Windows Explorer’da (Windows Gezgini) dosya kopyalama veya taşıma işlemi sırasında da kullanılır. İlerleme çubukları kullanıcıya bir işin durumu hakkında geribesleme ver¬menin kolay bir yoludur. Kullanıcı belirsiz bir süre bekleyeceğine bir işin ne kadarının tamamlandığını görebilir. CProgressCtrl üye fonksiyonları Tablo 7.3’te listelenmiştir.

Tablo 7.3. CprogressCtrl Sınıfının Üye Fonksiyonları

Fonksiyon Tanımı

SetRange Kontrol için izin verilen aralığı ayarlar.

SetRange32 SetRange ile aynı işi yapar ama kontolü yeniden
ayarlar.
GetRange Kontrol için izin verilen aralığı döndürür.

SetPos Mevcut ilerleme çubuğu konumunu ayarlar.

GetPos Mevcut ilerleme çubuğu konumunu döndürür.

OffsetPos Mevcut ilerleme çubuğu konumunu artırır.

SetStep İlerleme çubuğu için artım aralıklannı ayarlar.

StepIt İlerleme aralıklarının konumunu artırır.


Bir ilerleme çubuğu iletişim kutusuna daha önce anlatılan spin veya kaydıraç kontrolleri gibi eklenir. Developer Studio iletişim kutusu editörünü kullanarak Controls projesinin ana iletişim kutusuna bir ilerleme çubuğu ekleyin.

7.1.3. İlerleme Çubuğunu Güncellemek İçin Kaydıraç
Kullanılması

Bu kısımda ilerleme çubuğunun gösterdiği değeri değiştirmek için IDC_SLIDER kontrolünü kullanacaksınız. ClassWizard’ı kullanarak CcontrolsDlg sınıfına kaydıraç ve ilerleme kontrolleriyle ilişkili iki yeni üye değişken ekleyin. Yeni kont¬roller için Tablo 7.4’teki değerleri kullanın.

Tablo 7.4. Kaydıraç Ve İlerleme Çubuğu Kontrollerinin Üye
Değişkenleri İçin Değerler

Kontrol Id Değişken Adı Kategori Tip

IDC_SLIDER m_slider Control CsliderCtrl

IDC_PROGRESS m_progress Control CprogressCtrl

Kaydıraç ve İlerleme Çubuğu Kontrollerine İlk Değer Verilmesi

Kaydıraç ve ilerleme çubuğu kontrollerini kullanabilmek için önce ilk değer vermeniz gerekir. CProgressctrl ve CSliderCtrl sınıflarının her biri ilgili kontrol için minimum ve maksimum değerleri belirlemek amacıyla kullanılan bir SetRange fonksiyonuna sahiptir.

m_slider.SetRange( 0, 100 );

Kaydıracın Autoticks özelliği seçilmişse kontrol boyunca çentik işaretleri görünür. Her çentik arasındaki mesafeyi belirtmek için SetTicFreq fonksiyonunu kullanır. Her 10 konumda bir çentik işareti koymak için SetTicFreq fonksiyonuna 10 değe¬rini gönderin.

m_slider.SetTicFreq( 10 );

Kod 7.2 OnInitDialog fonksiyonunun ilk değer verme kısmı için kaynak kod i¬çermektedir. Bu kodu // TODO satırının hemen altına ekleyin.

Kod 7.2. CcontrolsDlg::OnInitDialog Fonksiyonunda Kontrollere İlk
Değer Verme

// TODO : Buraya ilk değerleri ekle
m_spin.SetRange( 0, 100 );
m_slider.SetRange( 0, 100 );
m_slider.SetTicFreq( 10 );
m_progress.SetRange( 0, 100 );

Şekil 7.3. Ekleme çubuğu eklendikten sonraki controls iletişim kutusu



Kaydıraçtan İlerleme Çubuğuna Giden Mesajları Yönetme

Bir kaydıraç hareket ettirildiğinde ebeveynine WM_SCROLL ve WM_HSCROLL me¬sajlarını gönderir. Bu örnekteki kaydıraç yatay olduğundan ana iletişim kutusuna WM_HSCROLL mesajları gönderir. ClassWizard’ı kullanarak CControlsDlg sınıfına WM_HSCROLL mesajı için bir mesaj yönetimi fonksiyonu ekleyin. OnHScroll fonksiyonunun kaynak kodu Kod 7.3’te verilmektedir.

Kod 7.3. İlerleme Çubuğunu Güncellemek İçin Kaydıracın SCROLL
Mesajlarını Kullanma

void CcontrolsDlg::OnHScroll( UINT nSBCode, UlNT nPos, CScrollBar*pScrollBar )
{
int nSliderPos = mslider.GetPos( );
m_progress.SetPos( nSliderPos );
}

Kaydıracın konumu her değiştiğinde Kod 7.3’teki kod çağrılır. O anki kaydıraç konumunu almak için CSliderCtrl::GetPos fonksiyonu kullanılır. Daha sonra CProressctrl::SetPos fonksiyonu kullanılarak ilerleme çubuğu güncellenir.

İlerleme çubuğunu kullanmanın çok yolu vardır. Çoğu zaman ilerleme çubuğunu doğrudan kontrolünüz altında olmayan olaylar olduğunda güncellemeniz gerekecek. Örneğin, çok sayıda dosya kopyalarken programınız her dosyayı kopyaladıktan sonra bir ilerleme çubuğunu güncelleyebilir.

Bir kaydıraç kontrolüne çok sayıda fonksiyon uygulayabilirsiniz. CSliderCtrl sınıfı¬nın diğer üye fonksiyonları Tablo 7.5’de verilmiştir.

Tablo 7.5. CsliderCtrl Sınıfının Üye Fonksiyonları

Fonksiyon Tanımı

SetLineSize Ok anahtarı ile değiştirilen kaydıracın artımını ayarlar.

GetLineSize Ok anahtarı ile değiştirilen kaydıracın artımını döndürür.

SetPageSize Page tip ya da Page Down anahtarı ile değiştirilen kaydıracın artımını ayarlar.

GetPageSize Page Up ya da Page Down anahtarı ile değiştirilen kaydıracın ar¬tımını döndürür.

SetRange Kontrol için izin verilen aralığı ayarlar.

SetRangeMin Kontrol için izin verilen minimum değeri ayarlar.

SetRangeMax Kontrol için izin verilen maksimum değeri ayarlar.

GetRange Kontrol için izin verilen aralığı döndürür.

GetRangeMin Kontrol için izin verilen minimum değeri döndürür.

GetRangeMax Kontrol için izin verilen maksimum değeri döndürür.

7.2. Bitmap’Ierin ve Görüntü Listelerinin kullanılması

Bitmap’ler Windows’un sunduğu en önemli GDI nesneleridir. Ağaç görünümü ve liste görünümü kontrollerinde olduğu gibi çok sayıda bitmap gerektiğinde bitmap gruplarını saklamak için görüntü listeleri kullanılabilir. Bu bölümde öğreneceğiniz konular;

• Bitmap’ler üzerinde çalışmayı kolaylaştırmak için CBitmap MFC sınıfının kullanılması,

• Görüntü listesi oluşturulması,

• Görüntü listelerine uygulanabilecek özellikler ve metodlar,

• Bir görüntü listesinin bitmap konteyneri olarak kullanılması,

• Göruntü listelerinin sunduğu ileri düzeyde çizim fonksiyonları.

Ayrıca bu bölümde bir görüntü listesi oluşturan ve bitmap görüntüleri burada saklayan bir örnek program oluşturacaksınız. Daha sonra “Liste Görünümü Kontrolleri” adlı bölümde ve “Ağaç Görünümleri” adlı bölümde kullanacağınız bir temel oluşturacaksınız.

7.2.1. Bitmap Nedir?

Bitmap, Windows için yazılan programlarda bir görüntüyü temsil et¬mek için kullanılabilecek grafiksel bir nesnedir. Bir görüntü bitmap olarak kolay¬lıkla saklanabilir, yüklenebilir ve görüntülenebilir. Bitmap’ler bir Windows programında görüntü verilerini saklamak icin esnek bir yol sunar. Bir bitmap için kullanılan veri yapısı çok açıktır ve çok çeşitli bitmap türlerinin saklanabilmesine olanak tanır. Bu bölümün ilerleyen kısımlarında ele alınan görüntü listeleri fazladan özelliklere sahiptir. Çoğu zaman basit bir bitmap kul¬lanmak ekranda bir resim göstermenin en kolay yoludur.

Visual C++ Kullanarak Bir Bitmap oluşturmak

Bir bitmap oluşturmanın en kolay yolu Visual C++’ın içerdiği görüntü editörüne benzer bir editör kullanmaktır. Bu bölümde iletişim kutusu tabanlı bir programın ana iletişim kutusunda görüntülenecek bir bitmap oluşturmak için Visual C++ görüntü editörünü kullanacaksınız.

Görüntü editörünü kullanarak bitmap’i oluşturduktan sonra CBitmap MFC sınıfını kullanarak bitmap üzerinde değişiklik yapabilirsiniz. LoadBitmap üye fonksiyonunu çağırarak bitmap’i programınıza yükleyebilirsiniz:

bmpHello.LoadBitmap( IDB_HELLO );

Bitmap yüklendikten sonra bir cihaz ortamı kullanarak bitmap’i herhangi bir çıkış cihazında görüntüleyebilirsiniz.

Projeye Bitmap Eklemek

WM_PAINT mesajını yöneten herhangi bir projede bir bitmap görüntülenebilir. Örnek olarak Bitmap adında bir SDI programı oluşturun. Projeyi oluşturduktan sonra proje çalışma alanı penceresinde ResourceView sekmesine tıklayarak kaynak dos¬yasını açın.

Kaynak ağacına farenin sağ tuşuyla tıklayıp kısayol menüsünden Insert komutunu seçerek yeni bir bitmap kaynağı ekleyin. Insert Resource iletişim kutusu görüntülenir. Buradan Bitmap’i seçin ve New düğmesine tıklayın. Projeye yeni bir bitmap eklenir ve üzerinde değişiklik yapılmak üzere yüklenir. Görüntü editöründe bitmap yüzeyini temsil eden büyük bir ızgara ile iki tant sabitlenebilir araç çubuğu vardır:

• Graphics araç çubuğu farklı şekiller ve yazılar çizmek için kullanabileceği¬niz araçlar içerir.

• Colors paleti bitmap’i çizerken kullanabileceğiniz renkleri içerir.

Bitmap’in kenarına farenin sağ tuşuyla tıklayıp kısayol menüsünden Properties komutunu seçerek bitmap kaynağının özelliklerini değiştirebilirsiniz. Bitmap’in kaynak ID’sini IDB_HEILO yapın. Bitmap’ler için IDB ile başlayan isimler kullanmak Windows programcılığında bir standarttır.

Bir Bitmap Yükleyip Görüntüleme

BitmapView.cpp kaynak dosyasını açın ve CBitmapView::OnDraw üye fonksiyonu¬nu bulun. Fonksiyon çok sayıda kod satırı içeriyor olmalıdır. Bu kodu Kod 7.4’de verilen kodla değiştirebilirsiniz.

Kod 7.4. Bir Bitmap Görüntülemek İçin Kullanılan
CBitmapView::OnDraw Fonksiyonu

void CBitmapView::OnDraw(CDC* pDC)
{
Cbitmap bmpHello;
bmpHello.LoadBitmap( IDB_HELLO );
// Bir BITMAP yapısı kullanarak bitmap boyutlarını hesapla.
BITMAP bm;
bmpHello.GetObject( sizeof(BITMAP), &bm );
/l Bir bellek DC oluştur, bellek DC içine koymak üzere bitmap seç,
CDC dcMem;
dcMem.CreateCompatibleDC( pDC );
CBitmap* pbmpOld = dcMem.SelectObject( &bmpHello );
pDC-> BitBit( 10,10, bm.bmWidth, bm.bmHeight, &dcMem, 0,0, SRCCOPY);
// Bellek DC içine koymak üzere orijinal bitmap’i yeniden seç.
DcMem SelectObject( pbmpold );
}

Kod 7.4’de bitmap görüntülenmeden önce SelectObject üye fonksiyonu kullanılarak bitmap hakkında bilgi alınır. Bu fonksiyon bir BITMAP yapısını bilgiyle doldurur. BITMAP yapısının verdiği iki yararlı bilgi bitmap’in genişliğidir.

Bir bitmap gösterirken bitmap önce bellek cihaz ortamı (memory de¬vice context) olarak bilinen özel bir cihaz ortamında seçilir. Bellek cihaz ortamı, görüntüleri ekran harici (offscreen) olarak çizmenize olanak tanıyan bir bellek a¬lanıdır. Bu özellik performansı arttırır. Görüntüyü bellek cihaz ortamından On¬Draw fonksiyonuna parametre olarak aktarılan görünümün cihaz ortamına aktarmak için BitBit fonksiyonu kullanilır. BitBit, görüntüyü bellek cihaz ortamından gerçek cihaz ortamına ak¬tarmak için kullanılan Bit-Block Transfer’in kısaltmasıdır.

Bitmap projesini derleyip çalıştırdığınızda görünüm penceresinde IDB_HELLO bitmap’i görüntülenir. Bitmap’in büyüklüğünü ve rengini değiştirmeyi ve Kod 7.4’de verilen kaynak kodu ile DrawText fonksiyonununu birleş¬tirmeyi deneyin.

Bitmap programıyla yeterince uzun süre çalışırsanız bitmap’leri kullandığınızda karşınıza çıkan bir sorunu keşfedebilirsiniz. IDW.HELLO bitmap’inin arka planı be¬yaz olmasına rağmen saydam değildir. Pencerenin arka planı gri veya başka bir renk olsaydı, bitmap yazı içeren beyaz bir kare gibi görünürdü. Bir bitmap’i saydam arka plan üzerinde göstermek mümkündür ama bunu yapmak çok fazla ileri seviyeli grafik işlemi gerektirir. Neyse ki, ilk olarak Windows 95’te ortaya çıkan görüntü listeleri saydam bir bitmap çizme yeteneğine sahiptir.

7.2.2. Görüntü Listesi Nedir?

Görüntü listesi (image list), Şekil 7.4’de gösterildiği şekilde, aslında bir görüntü dizisi olan bir makara film gibi bir bitmap dizisine benzer. Ancak bir görüntü lis¬tesi, bir makara fılmden farklı olarak, gerekirse listeye yeni görüntüler eldendikçe büyüyebilir.

+ +
+ ! !
!

Şekil 7.4. Görüntü listesi bitmap görüntüleri

Görüntü listeleri bu yeni kontrollerin dışında da kullanılabilir. Bunlar bir grup bitmap’i yönetmek için kolay bir yol sunar çünkü bu. şekilde her bitmap için ayrı nesnelerle uğraşmak yerine tek bir görüntü listesi nesne¬siyle çalışırsınız.

Programınızın çeşitli farklı bitmap görüntüleri ile çalışması gerekiyorsa, tek bir görüntü listesi kullanmak çok sayıda bitmap kullanmaktan daha kolaydır. Bir gö¬rüntü listesinden çok sayıda görüntüye ulaşıp bunları görüntülemek çok sayıda CBitmap nesnesiyle uğraşmaktan çok daha kolaydır. Windows Explorer (Windows Gezgini) Windows 3.l’de kullanılan eski File Manager’dan (Dosya Yöneticisi) çok daha zengin bir kullanıcı arabirimine sahiptir. Bu zenginliğin büyük bölümü bitmap’leri saklamak ve yönetmek için kolay bir yol sunan görüntü listelerinin kullanımıyla sağlanmıştır. Görüntü listeleri ayrıca sıradan bitmap’lerle gerçeklenmesi zor iki özelliğe sahiptir :

• Saydam görüntüler

• Üst üste binmiş görüntüler

Saydam Görüntüler

Saydam görüntü (transparent image), bitmap’in bir kısmı saydammış gibi görüntüden arka planın görünmesini sağlayan bir görüntüdür. Normal bir bitmap kullanarak saydam bir görüntü oluşturmak zordur. En basit durumlarda bile, bir bitmap’i saydam olarak çizmek için gereken kod satırı sayısı bitmap’i opak (ışık geçirmez, saydam olmayan) olarak çizmek için gereken satır sayısınm yaklaşık
iki katıdır. Görüntü listesi kullanarak saydam bir bitmap çizmek için yalnızca para¬metrelere doğru değerler verilmesi yeterlidir.

Üst Üste Binmiş Görüntüler

İki görüntüyü tek bir görüntü oluşturacak şekilde birleştirdiğinizde üst üste binmiş bir görüntü oluşturursunuz. Bir görüntü listesinde saklanan görüntü¬lerin temsil ettiği maddeler için özel özellikler göstermek için üst üste binmiş görün¬tüler çok yararlıdır. Örneğin, Explorer’da paylaşılan bir dizin gösterildiğinde dizinin Masör görüntüsü üzerinde bir” el” görünür. Bu, üst üste binmiş bir görüntüdür.

Görüntü Listesinin Kullanılması

Windows’daki diğer her şey gibi görüntü listeleri için de bir MFC sınıfı vardır. MFC tabanlı bir Windows programında görüntü listeleri oluşturmak, görüntülemek ve benzer işlemler yapmak için CImageList sınıfını kullanırsınız. Görüntü listeleri çoğunlukla liste görünümü kontrolüyle CListCtrl sınıfı, ağaç kontrolü ve CTreeCtrl sınıfı için madde görüntüleri sağlamak amacıyla kullanılır. Ancak, bu bölümde yapacağınız gibi, gö¬rüntü listesini bir bitmap grubu olarak da kullanabilirsiniz. Görüntü listelerini bu şekilde kullanmak, görüntü listelerini genel kontrollerle birlikte kullanmanın yanı sıra bunlarla yapabileeeğiniz şeyleri gösterir.

Görüntü listelerini kullanan bir örnek olarak ImageList adında bir SDI projesi oluşturun. Bu proje programın istemci alanında bir dizi bitmap göstermek için bir gö¬rüntü listesi kullanmaktadır.


Bir Görüntü Listesi Oluşturmak

Bir görüntü listesi oluşturmadaki ilk adım, her biri aynı büyüklükte olan bir grup bitmap oluşturmaktır. Görüntüler herhangi bir büyüklükte olabilecek olmasına rağmen bu kısımdaki örnek kod bitmap’lerin 32x32 piksel büyüklüğünde olduğunu varsaymaktadır.

Bir bitmap görüntüsünü bir görüntü listesinde saklamak için üç adım gereklidir:

1. Bitmap’i yükleyin.

2. Bitmap’in bir kopyasını içeren görüntü listesinde yeni bir görüntü indeksi oluşturun.

3. Bitmap nesnesini silin.
__________________
...FazLamız ERZURUM'LU oLmamız...


...Bir Yar Sevdim...
Bin Sekiz Yüz eLLi boyLu!!!
...Bir Yar Sevdim...
PALANDÖKEN huyLu!!!


Privacy Çevrimdışı
İP: 88.226.105.36  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 05-02-2006, 08:15   #27 (permalink)
aLkoLSüZ!!!
 
Privacy - ait Kullanıcı Resmi (Avatar)
 
Privacy
Kullanıcı No: 5
Konu Sayısı: 4711
Mesaj Sayısı: 17,386
Üyelik tarihi: Apr 2005
Nerden: FENERBAHCE CUMHURİYETİ
Teşekkür & Tepki Teşekkür: 4
Tepki:0
Karizma
REP Gücü : 100
REP Puanı : 704162779
REP Seviyesi : Privacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond repute
İletişim
Reklam Alanı
Standart

Bitmap nesnesi silinir çünkü görüntü listesi bitmap’in bir kopyasını alır ve görüntüyü kendi içinde saklar. Kural olarak, bir Windows GDI nesnesi oluşturulduğunda bellek sızıntılarını önlemek için nesnenin mutlaka silinmesi gerekir. Yukarıda anlatılan adımlar CImageListView sınıfına eklenen yeni bir fonksiyon olan AddBit¬mapToImageList fonksiyonunda gerçekleştirilir. Kod 7.5’de verilen fonksiyonu imageListView.cpp kaynak dosyasına ekleyin.

Kod 7.5. CImageListView::AddBitmapToIma gelist Fonksiyonu

BOOL ClmageListView::AddBitmapToIma geList( UINT nResourceID )
{
BOOL bReturn;
CBitmap bmp;
bReturn = bmp.LoadBitmap( npesourcelD );
if( bReturn != FALSE )
{
int nReturn = m_imagelist.Add( &bmp, RGB(255,255,255) );
bmp DeleteObject( );
}
return bReturn;
}

AddBitmapToImageList fonksiyonu kullanılır çünkü görüntü listesine üç bitmap kaynağı eklenir. Bitmap’leri yeni bir üye fonksiyon kullanarak eklemek, yazmanız gereken kod miktarını azaltır ve hata olasılığını azaltır çünkü her bitmap aynı fonksiyon kullanılarak eklenir.

Görüntü listesine bir görüntü eklemek için CImageList::Add üye fonksiyonu kullanılır. Kod 7.5’de verilen Add fonksiyonu iki parametre alır:

• Görüntü listesine kopyalanacak CBitmap görüntüsünün adresi

• Bitmap’in arkaplan rengini temsil eden bir COLORREF değeri

Arka plan rengi, maskelenmiş bitmap’ler kullanarak saydam görüntüler çi¬zerken kullanılır. Maskelenmiş bir görüntü listesi kullanmıyorsanız COLORREF değeri görmezden gelinir.

Üye fonksiyonu ImageListView.CPP dosyasına ekledikten sonra Kod 7.6’daki kaynak kodu ImageListView.h dosyasında bulunan CImageListView sınıfına ekleyin. Kaynak kodu // implementation kısmına yazın. // implementation satırından sonra AppWizard’ın kullanıcıların tanımladığı değişken ve fonksiyonlar için eklediği protected: etiketi vardır.

Kod 7.6. CImageListView Sınıfına Eklenecek Kaynak Kodu

Protected:
BOOL AddBitmapToImageList( UINT nResourceID );
CImageList m_imageList;

Görüntü listesini asıl oluşturma işi, görünüm oluşturulduğunda olur. Aslında görüntü listesi herhangi bir anda oluşturulabilir ama bir görüntü listesi oluşturmak hesaplama gücü bakımından masraflıdır. Görüntü listesini yapılandırıcı içinde oluşturmak liste¬yi her kullanılışında değil, bir kere oluşturmanıza imkan tanır. Kod 7.7’deki kaynak kodu CImageViewList sınıfının yapılandırıcısına ekleyin.

Kod 7.7. CImageListView Sınıfının Yapılandırılması

CImageListView::CImageListView ( )
{
m_imageList.Create( 32, 32, TRUE, 3, 1 );
AddBitmapToImageList( IDB_CROSS );
AddBitmapToImageList( IDB_CHECK );
AddBitmapToImageList( IDB_BANG );
}

Görüntü listesi CImageList::Create fonksiyonlarından biri kullanılarak oluşturur. Create fonksiyonunun bu şekli görüntü listesi bir bitmap grubu olarak kulla¬nıldığında yararlıdır. Create fonksiyonunun bu hali beş parametreye sahiptir:

• Her bitmap’in yüksekliği; bu örnekte 32 piksel

• Her bitmap’in genişliği; bu örnekte 32 piksel

• Görüntü listesinin saydamlık için maskelenip maskelenmeyeceği; bu ör¬nekte TRUE

• Görüntü listesinde başlangıçta bulunan bitmap sayısı; bu örnekte üç

• “Büyüme birimi” yani görüntü listesi genişletildiğinde eklenen bitmap sa¬yısı, bu örnekte bir.

Maskelenmiş görüntü listesi her görüntü için iki bitmap içeren bir gö¬rüntü listesidir; ikinci bitmap saydam görüntüler çizilirken kullanılan bir maskedir. Görüntünün görünür olan kısımları maskede siyahtır, saydam olan kısımları ise maskede beyazdır.

CImageListDraw Fonksiyonunu Kullanarak Bir Görüntü Listesinin Görüntülenmesi

Bir görüntü listesinde saklanan her bir madde Kod 7.8’de gösterilen CImageList:raw üye fonksiyonu kullanılarak çizilebilir.

Kod 7.8. Görüntü Listesindeki Bir Bitmap’i Görüntülemek İçin
ImageList: Draw Fonksiyonunu Kullanma

void CImageListView::OnDraw(CDC* pDC)
{
CPoint ptlmage( 0, 0 );
for( int nImage = 0; nImage < 3; nImage++ )
{
m_imageList.Draw( pDC, nImage, ptImage, ILD_NORMAL );
ptImage.x += 50;
}
}


Şekil 7.5. CımageList:raw üye fonksiyonunu kullanarak bir görüntü listesinin içeriğini gösterme

Draw fonksiyonunun dört parametresi vardır:

• Çizim yüzeyini temsil eden cihaz ortamı

• Çizilecek görüntünün görüntü listesindeki sıra numarası

• Görüntünün CPoint nesnesi ile temsil edilen yeri

• Gerçekleştirilecek çizim işleminin türü

Sekiz farklı çizim ipleri vardır:

• ILD_NORMAL görüntüyü doğrudan çizim yüzeyi üzerine çizer. Görüntü maskelenmişse, görüntü listesinin arka plan rengi CLR_NONE değerindeyse görüntü saydam olarak cizilir.

• ILD_TRANSPARENT görüntüyü saydam olarak çizer. Görüntü maskelenmemişse normal olarak çizilir.

• ILD_MASK görüntü maskesini çizer. Görüntü listesinin maskesi yoksa görüntü normal çizilir.

• ILD_BLEND25 görüntüyü çizer ve yüzde 25 sistem aydınlatma rengiyle karıştırır. Görüntü listesinin maskesi yoksa görüntü normal çizilir.

• ILD_FOCUS , ILD_BLEND25 ile özdeştir.

• ILD_BLEND50 görüntüyü çizer ve yüzde 50 sistem aydınlatma rengiyle karıştırır. Görüntü listesinin maskesi yoksa görüntü normal çizilir.

• ILD_BLEND , ILD_BLEND50 ile özdeştir.

• ILD_SELECTED ILD_BLEND50 ile özdeştir.

Görüntü listesinde saklanan her bir bitmap ExtractIcon üye fonksiyonu kullanıla¬rak ikon olarak da açılabilir:

HICON hicon = m_imageList.ExtractIcon( nImage );

ExtractIcon için gereken tek parametre görüntünün sıra numarasıdır. Bundan son¬ra ikonu herhangi bir ikon tutamacı olarak kullanabilirsiniz.

Saydam Bir Görüntünün Gösterilmesi

Bir görüntüyü saydam olarak göstermenin iki yöntemi vardır:

• Görüntü listesinde saklanan görüntüler için arka plan rengi tanımlamak

• Çizim işlemi için ILD_TRANSPARENT bayrağını kullanmak

Arka Plan Rengi Kullanmak

Saydam bir görüntü çizmek için basit bir yöntem görüntünün arka plan rengini tanımlamaktır. Görüntü listesinin arka plan rengi yüzeyin arka plan rengine uya¬cak şekilde ayarlanacak ve görüntüye saydam bir görünüm vererek çizim yüzeyinin aradan parlamasını sağlayacaktır. CImageList::OnDraw fonksiyonuna Kod 7.9’da verilen kaynak kodu girin ve ImageList programım derleyip çalıştırın.

Kod 7.9. Bir Bitmap’ı Saydam Göstermek İçin CImageList:raw
Fonksiyonunu Kullanma

void CImageListView::OnDraw(CDC* pDC)
{
m_imageList.SetBkColor( RGB(0,255,0) );
Cpoint ptImage( 0, 0 );
For( int nImage = 0; nImage < 3; ntIage++ )
{
m_imageList.Draw( pDC, nImage, ptImage ILD_NORMAL);
ptImage.x += 50;
}
}

ImageList projesini derleyip çalıştırırsanız görüntülerin arka plan renkleri yeşil yapılır. CImageList::SetBkColor fonksiyonuna aktarılan RGB COLORREF de¬ğerini değiştirerek herhangi bir arka plan rengiyle uyum sağlayabilirsiniz.

ILD_TRANSPARENT Bayrağını Kullanmak

Saydam çizim yapmak için bir başka yöntem CImageList:raw fonksiyonu çağrıldığında ILD_TRANSFARENT bayrağını kullanmaktır. Bu, görüntü listesine maske varsa görüntü maskesini bitmap ile birleştirmesini söyler. Görüntü listesi maskelenmemişse görüntü ILD_NORMAL kullanılmış gibi çizilir.

Üst Üste Binmiş Bir Görüntünün Gösterilmesi

Üst üste binmiş bir görüntü, aynı bitmap’te biri diğerine göre daha baskın iki görüntüden oluşur. Bir görüntüyü üste binmiş (overlay) görüntü olarak kullanabil¬meniz için görüntünün üste binmiş olarak tanımlanmış olması gerekir. CImageList::SetOverlayImage fonksiyonunu kullanarak bir görüntü listesinde dört tane bitmap’i üste binmiş görüntü olarak tanımlayabilirsinız:

miageList.SetOverlayImage( 0, 1);

SetOverlayImage fonksiyonu iki parametre alır:

• Üste binmiş olarak kullanılan gö¬rüntünün sıra numarası

• Üste binme işlemini tanımlamak için kullanılan üste binme sıra numarası.

Windows’da kullanılan diğer sıra numaralarının aksine üste binme (overlay) sıra numarası sıfır yerine birden başlar.

Üst üste binmiş bir görüntü kullanmak için önceki örnekte yapıldığı gibi CImageList: Draw fonksiyonu kullanılır fakat burada ILD_OVERLAYMASK bayrağı kulla¬nılır. Üste binmiş görüntünün sıra numarasının taban görüntüyle birleştirilmesini sağlamak için ILD_OVERLAYMASK bayrağı INDEXTOOVERLAYMASK makrosuyla birleştirilir. Kod 7.10 OnDraw fonksiyonunun bir görüntü listesi kullanarak üst üste binmiş bir görüntü gösteren yeni halidir.

Kod 7.10. Üst Üste Binmiş Bir Görüntü Göstermek İçin
CImageList:raw Fonksiyonunu Kullanma

void CImageListView::OnDraw(CDC* pDC)
{
m_imageList.SetBkColor( CLR_NONE );
CPoint ptOverlay( 50, 80 );
m_imageList.SetOverlayImage( 0, 1 );
m_imageList.Draw( pDC,2, ptOverlay, INDEXTOOVERLAYMASK(1) );
}

7.3. Liste Görünümü

Liste görünümleri bilginin çeşitli şekillerde gösterilmesine olanak sağlayan son derece esnek kontrollerdir. Bu bölümde öğrenecekleriniz;

• Görüntü listelerinin liste görünümü kontrolleriyle kullanılması,

• Liste görünümü kontrolünde farklı görüntüleme stilleri arasında geçiş yapma,

• Kullanıcının liste maddelerini teker teker düzenlemesine imkan tanınması.

7.3.1. Liste Görünümü Kontrolü Nedir?

Liste kontrolleri de denilen liste görünümü kontrolleri ilk olarak Windows 95 ile piyasaya sürülen kontrollerden bazılarıdır. Bir liste görünümü kontrolü, bil¬gi ve onunla ilişkilendirilmiş bir ikonu şu dört farklı formattan biriyle görüntüle¬mek için kullanılır:

• İcon görünümü, ikonları 32 x 32 piksel büyüklüğünde satırlar halinde gösterir.

• Small İcon görünümü ikonları 16 x 16 piksel büyüklüğünde satırlar halinde gösterir.

• Üst görünümü bir sütun halinde düzenlenmiş küçük ikonlar ve liste mad¬deleri görüntüler.

• Report görünümü maddeleri ve onlarla ilişkili ikonları sütunlar halinde düzenlenmiş alt maddelerle birlikte gösterir.

Bir liste görünümü kontrolü kullandığınızda kullanıcının farklı görüntüleme modları arasında geçiş yapabilmesine izin vermek için bir menü veya başka bir yöntem sunabilirsiniz.

Windows Explorer (Windows Gezgini) bir liste görünümü kontrolü kullanır ve dört görüntüleme stilinin hepsini de destekler. Şekil 7.6’da C:\ dizinini Latge Icon görünümünde gösteren Explorer görülmektedir.

Şekil 7.6. Windows Explorer bir liste görünümü kullanımı

Liste Görünümü Kontrollerinin Özellikleri

Liste görünümü kontrolünün özellikleri diğer kontrollerde olduğu gibi Properties iletişim kutusu kullanılarak ayarlanır. Liste görünümü kontrollerinin sahip olduğu özelliklerin bazıları liste kutularında da vardır. Liste görünümü kontrollerinin ö¬zellikleri şunlardır:

• ID liste görünümü kontrolünün kaynak ID’si için kullanılır. Developer Studio IDC_LIST1 gibi bir kaynak ID’si verir.

• Visable kontrolün başlangıçta görünür olduğunu belirtir. Bu onay kutusu normalde işaretlidir.

• Disabled listenin başlangıçta kullanılamaz durumda olduğunu belirtmek i¬çin kullanılır. Bu onay kutusu normalde işaretli değildir.

• Group bir gruptaki ilk kontrolü belirlemek için kullanılır. Bu onay kutusu normalde işaretli değildir.

• Tub Stop bu kontrole klavyedeki Tab tuşuna basılarak ulaşılabileceğini gösterir. Bu onay kutusu normalde işaretlidir.
• Help ID bu kontrol için ortama duyarlı bir yardım ID’si oluşturulacağını gösterir. Bu onay kutusu normalde işaretli değildir.

• View liste görünümü kontrolünün başlangıçta kullanacağı görünümü be¬lirtir. Bu özellik Icon, Small Icon, List veya Report değerlerini alabilir.

• Align maddelerin kontrolün üst tarafına mı, yoksa sol tarafına mı dayalı olacağını gösterir. Bu özellik yalnızca Icon ve Small Icon görünümlerinde geçerlidir.

• Sort maddelerin liste görünümü kontrolüne girilirken etiketlerine bağlı ola¬rak sıralanmalarını sağlar.

• Auto Arrange maddelerin Icon veya Small Icon görünümlerinde gösteril¬dikleri sırada düzenli tutulmaları gerektiğini belirtir.

• Single Selection tek bir liste görünümü maddesinin seçilebilmesine olanak tanır.

• No Label Wrap her maddenin etiketinin alt satıra geçmeden tek satır ha¬linde gösterilmesini sağlar.

• Edit Labels kullanıcının etiketleri değiştirebilmesini sağlar. Bu özellik seçilmişse, kontrolün gönderdiği düzeltme bildirim mesajlarını yönetecek fonksiyonu yazmanız gerekir.

• No Scroll kaydırma yapılmasına izin vermez.

• No Column Header genellikle rapor görünümünün içerdiği başlık kontro¬lünü kaldırır.

• No Sort Header başlık kontrolü aracılığıyla kullanılabilen sıralama işlevini ortadan kaldırır.

• Share Image List liste görünümü kontrolünün kullandığı görüntü listesinin diğer görüntü listeleriyle paylaşıldığını belirtir. Son liste görünümü kont¬rolü yok edildikten sonra görüntü listesini sizin yok etmeniz gerekir.

• Show Selection Always o anda liste görünümü kontrolüne odaklanılmamış bile olsa, seçilen maddenin üzerinin aydınlatılacağını belirtir.

• Owner Draw Fixed kontrolün çizilmesinden Windows’un değil, kontrolün sahibinin sorumlu olduğunu gösterir.

• Owner Data milyonlarca madde tutabilecek sanal bir liste görünümü kont¬rolü oluşturmak için kullanılır. Kontrolün sunduğu yerlerin saklanmasından kontrolün sahibi sorumludur.

• Border kontrolün etrafına bir çerçeve çizileceğini göstenr.



Liste Görünümü Kontrolünün Kullanılması

Liste görünümü kontrollerinin temel özelliklerinin nasıl kullanıldığını gösteren basit bir örnek olarak iletişim kutusu tabanlı bir uygulama oluşturun. Bu program üç madde içeren bir liste görünümü kontrolü kullanacaktır. Farklı görünüm stilleri a¬rasında geçiş yapmak için radyo düğmelerini kullanabilirsiniz.

ListEx adında iletişim kutusu tabanlı bir uygulama oluşturmak için AppWizard’ı kullanın. AppWizard’ın önerdiği seçeneklerden istediklerinizi kabul edebilirsiniz; bu örnek AppWizard parametrelerinin herhangi bir değeriyle çalışır.


Şekil 7.7. ListEx ana iletişim kutusu

Liste görünümü ve radyo düğmesi kontrollerinin özellikleri Tablo 7.6’da listelenmiştir. Listede olmayan diğer özellikler olduğu gibi bırakılmalıdır.

Tablo 7.6. ListEx Ana İletişim Kutusundaki Kontrollerin Özellik Değerleri

Kontrol Kaynak ID Başlık

Icon radyo düğmesi IDC_RADIO_ICON &Icon

Small radyo düğmesi IDC_RADIO_SMALL. &Small

List radyo düğmesi IDC_RADIO_LIST &List

Report radyo düğmesi IDC_RADIO_REPORT &Report

Liste görünüm kontrolü IDC_LIST Yok (None)

Tablo 7.7’deki değerleri kullanarak bir CListCtrl üye değişkenini IDC_LIST ile ilişkilendirmek için ClassWizard’ı kullanın.



Tablo 7.7. CListExDlg Sınıfındaki Yeni CListCtrl Üye Değişkeni İçin
Değerler

Kontrol ID Değişken Adı Kategori Tip

IDC_LIST m_listCtrl Kontrol ClistCtrl

Bundan sonra, radyo düğmeleri seçildiğinde çağrılan mesaj yönetimi fonksiyonlarını oluşturmak için ClassWizard’ı kullanın. Tablo 7.8’deki değerleri kullanarak CListExDlg sınıfına dört üye fonksiyon ekleyin.

Tablo 7.8. CListExDlg Sınıfındaki Yeni CListCtrl Üye Fonksiyonları
İçin Değerler

Nesne ID Sınıf Adı Mesaj Fonksiyon

IDC_RADIO_ICON CListExDlg BN_CLICKED OnRadiolcon
IDC_RADIO_SMALL CListExDlg BN_CLICKED OnRadioSmall
IDC_RADIO_LIST CListExDlg BN_CLICKED OnRadioList
IDC_RADIO_REPORT CListExDlg BN_CLICKED OnRadioReport

Görüntü Listelerininin Bir Liste Kontrolüyle İlişkilendirilmesi

Liste görünümünde her maddenin yanında görünen görüntüler liste görünümü kontrolüyle ilişkilendirilmiş görüntü listelerinde saklanır. Görüntü listeleri oluş¬turmak ve kullanmak “Bitmap ve Görüntü Liste/erini Kullanmak” adlı bölümünde an¬latılmıştı. Bir liste görünümü kontrolüne görüntü listesi SetImageList fonksiyonu ile eklenir:

m_listCtrl.SetImageList( &m_imageSmall, LVSIL_SMALL );

Liste görünümü kontrolüne iki parametre aktarılır; görüntü listesinin adresi ve görüntü listesinde saklanan görüntülerin türünü belirten bir stil parametresi. Üç tür görüntü listesi vardır:

• LVSIL_NORMAL Icon görünümünde kullanılan görüntü listesi için kullanılır,

• LVSIL_SMALL Small Icon görünümünde kullanılan görüntü listesi için kullanılır,

• LVSIL_STATE onay kutusu gibi seçime bağlı değişen görüntüler için kullanılır.

Görüntü listesi kontrolü liste görünümü kontrolüne eklendikten sonra, görüntü listesini yok etme sorumluluğunu liste görünümü kontrolü üstlenir. Görüntü listesinin Share özelliği seçilmişse, liste görünüm kontrolü görüntü listesini yok etmeyecektir. Liste görünümü yok edildikten sonra görüntü lis¬tesini sizin yok etmeniz gerekecektir. Görüntü listesini yok etmezseniz bellek sızıntısına neden olur. Gö¬rüntü listesini çok erken yok ederseniz liste görünümü kontrolü beklenme¬dik davranışlar gösterebilir.


Şekil 7.8. ListEx görüntü listeleri için kullanılan bitmap’ler

Liste Görünümü Kontrolüne Madde Eklenmesi

Liste görünümü kontrolünde bir maddeyi temsil etmek için LV_ITEM yapısı kullanılır. Liste görünümü maddeleri eklenirken, değiştirilirken veya alınırken bu yapı kullanılır. LV_ITEM yapısının veri üyeleri şunlardır:

• mask, o anki fonksiyon çağrısı için hangi üyelerin kullanılmakta olduğunu belirtir. Bu üyenin alabileceği değerler bu bölümün sonraki kısımlarında verilmiştir.

• Item, bu yapının gösterdiği maddenin List View sıra numarasını içerir. Liste görünümü kontrolündeki ilk maddenin sıra numarası sıfırdır. Sonraki maddeler birer artan sıra numarasına sahiptir.

• ISubItem, o anki alt maddenin sıra numarasını içerir. Alt madde, rapor görünümündeki sütunda bir maddenin ikonunun ve etiketinin sağında görü¬nen karakter katarıdır. İlk alt maddenin sıra numarası birdir. Burada sıfır sıra numarası asil liste görünümü maddesine aittir.

• state ve stateMask, maddenin o anki durumunu ve maddenin geçerli durumlarını içerir.

• PszText, maddenin etiketi olarak kullanılan karakter katarının adresini içerir.

• cchTextMax, maddenin özellikleri yapıya gönderiliyorsa pszText üyesin¬deki tamponun büyüklüğünü belirtir. Aksi halde bu üye kullanılmaz.

• iImage bu maddenin görüntü listesı sıra numarasını ıçerir.

LV_ITEM yapısının mask üyesi yapının hangi kısımlarının geçerli olduğunu veya doldurulması gerektiğini göstermek için kullanılır. Bu değerlerden biri veya daha fazlası olabilir:

1. LVIF_TEXT, pszText üyesinin geçerli olduğunu gösterir.

2. LVIF_IMAGE, iImage üyesinin geçerli olduğunu gösterir.

3. LVIF_PARAM, iParam üyesinin geçerli olduğunu gösterir.

4. LVIF_STATE, state üyesinin geçerli olduğunu gösterir.

Birden fazla değer gerektiğinde bunları | OR operatörünü kullanarak birleştirin:

ListItem.mask = LVIF_TEXT | LVIF_IMAGE;

Bir Liste Görünümü Maddesi Eklemek

Liste görünümü kontrolüne bir madde eklemek için InsertItem fonksiyonu kullanılır:

m_listItem.InsertItem( BdistItem );

InsertItem fonksiyonuna parametre olarak LV_ITEM yapısına bir işaretçi gönderilir. Yeni madde eklenmeden önce aşağıda gösterildiği gibi LV_ITEM veri üyeleri veriyle doldurulur:

listItem.mask = LVIF_TEXT;
listItem.iItem = 0;
listltem.pszText = szText;
m_listCtrl.InsertItem( StlistItem );

Rapor Görünümü için Sütun Bilgisi Eklemek

Diğer üç liste görünümü stilinden farklı olarak rapor görünümü listedeki her madde için ek bilgi içerir. Bu fazladan maddeler sütunlar halinde düzenlenir. Liste görünümündeki her maddenin aynı sayıda alt maddesi olmalıdır. Örneğin, Win¬dows Explorer’da alt maddeler dosya büyüklüğü, dosya tipi ve dosyanın son de¬ğiştirildiği tarih gibi dosya bilgilerini göstermek için kullanılır.

Alt maddelerin sütunları liste görünümü kontrolüne iki adımda eklenir; önce, IN_COLUMN veri yapısına ilk değer verilir ve sonra sütunlar eklenir. Liste görünümü sütunları LV_COLUMN yapıları ve InsertColumn fonksiyonu kullanılarak ek¬lenir. LV_COLUMN yapısı şu üyeleri içerir:

• mask o anki fonksiyon çağrısı için kullanılan üye değişkenleri gösterir. mask üye değişkeninin değerleri bu kısmın sonunda ele alınmaktadır.

• fmt sütun için kullanılan hizalama tipini belirtir. Üç tip hizalama olabilir: LVCFMT_LEFT (sol), LVCFMT_RIGHT (sağ) ve LVCFMT_CENTER (orta). ilk sütun LVCFMT_LEFT değerini kullanmalıdır.

• cx sütunun genişliğini piksel cinsinden belirtir.

• pszText sütun metnini içeren bir karakter katarına işaret eder. Yapı bilgi almak için kullanılırsa, bu üye sütun başlığı yazısını içeren tamponun adre¬sini saklar.

• cchTextMax, pszText üyesinin işaret ettiği tamponun büyüklüğünü saklar. Bu üye yalnızca veri alırken kullanılır.

• ISubitem sütun numarasını belirtir.

mask üye değişkeni hangi üye değerlerinin geçerli olduğunu belirtir. Olası değerler şunlardır:

1. LVCF_FMT fmt üyesinin geçerli olduğunu gösterir.

2. LVCF_SUBITEM, SubItem üyesinin geçerli olduğunu gösterir.

3. LVCF_TEXT, pszText üyesinin geçerli olduğunu gösterir.

4. LVCF_WIDTH, cx üyesinın geçerli olduğunu gösterir.

Bir LV_COLUMN yapısını veriyle doldurduktan sonra InsertColumn fonksiyonu kullanılarak sütun liste görünümü kontrolüne eklenir:

m_IistCtrl.InsertColumn( nColumn, BdistColumn );

Hangi Maddelerin Seçildiğinin Belirlenmesi

Bir liste kutusu kontrolünden farklı olarak bir liste görünümü kontrolünde hangi maddelerin seçildiğini belirlemek için tek bir mesaj veya fonksiyon yoktur. Onun yerine, aşağıdaki örnekte olduğu gibi CListCtrl::GetNextItem fonksiyonunu kullanılması gerekir:

int nSeI = m_listCtrl.GetNextItem( -1, LVNI_SELECTED );

Bu kod liste görünümü kontrolündeki seçili ilk maddenin sıra numarasını döndü¬rür. GetNextItem fonksiyonunun iki parametresi vardır: başlama maddesi ve ara¬ma bayrağı. Başlama maddesi –1 ise arama ilk maddeden başlar. Bayrak değişkeni bir geometrik değer ve bir durum değeri içerebilir. Geometrik değerler şunlardır:

• LVNI_ABOVE: Başlama maddesinin yukarısında bir madde arar.

• LVNI_ALL: Bir sonraki numaraya sahip maddeyi arar.

• LVNI_BELOW: Başlama maddesinin altında bir madde arar.

• LVNI_TOLEFT: Başlama maddesinin solunda bir madde arar.

• LVNI_TORIGHT: Başlama maddesinin sağında bir madde arar.

• LVNI_DROPHILITED: LVIS_DROPHILITED durum bayrağı çekilmiş bir maddeyi arar.

• LVNI_FOCUSED: LVIS_FOCUSED durum bayrağı çekilmiş bir maddeyi arar.

• LVNI_HIDDEN: LVIS_HIDDEN durum bayrağı çekilmiş bir maddeyi arar.

• LVNI_MARKED: LVIS_MARKED durum bayrağı çekilmiş bir maddeyi arar.

• LVNI_SELECTED: LVIS_SELECTED durum bayrağı çekilmiş bir maddeyi arar.

Arama parametrelerine uyan bir madde bulunamazsa -1 döndürülür. Aksi halde kriterlere uyan ilk liste maddesinin sıra numarası döndürülür.

Liste Görünümü Kontrolünün Geçerli Görünümünün Değiştirilmesi

Liste görünümü kontrolünde görünümler arasında geçiş yapmak için birkaç satırlık kod yeterlidir. O anki görünüm stili bir Windows veri yapısında saklanır. Bu bilgiye GetWindowLong fonksiyonu kullanılarak ulaşılabilir:

DWORD dwOldStyle = GetWindowLong( hWndList, GWL_STYLE );

GetWindowLong fonksiyonunun iki parametresi vardır:

1. Liste görünümü kontrolüne bir pencere tutamacı

2. İstenen bilgi türünü belirten bir GWL sabiti (bu örnekte GWL_STYLE)

GetWindowLong fonksiyonunun dönüş değeri liste görünümü kontrolüyle ilgili tüm bilgiyi içerir. O anki görünümle ilgileniyorsanız, gereksiz bilgiler LVS_TYPEMASK kullanılarak maskelenmelidir.

dwOldStyle & = ~ LVS_TYPEMASK; // Gereksiz biçem bilgilerini maskele.

Maske uygulandıktan sonra stil bilgisi aşağıdaki değerlerden birisidir:

• LVS_ICON

• LVS_SMALLICON

• LVS_LIST

• LVS_REPORT

Başka bir görünüme geçmek için SetWindowLong fonksiyonunu kullanmanız gerekir. Yeni bir liste görünümü stili uygularken, liste görünümü stili ile ilişkili ol¬mayan stil bitlerine dokunulmamalıdır. Bu genellikle aşağıdaki dört adımda yapılır:

1. GetWindowLong fonksiyonunu kullanarak mevcut pencere stilinin bit bilgisini edinin.

2. Diğer stil bilgilerine dokunmadan liste görünümü stil bilgisini ayırın.

3. Yeni bir liste görünümü stilini eski stil bilgisiyle birleştirin.

4. SetWindowLong fonksiyonunu kullanarak yeni stil bilgisini uygulayın.

Bu adımlar genelde aşağıdaki şekilde birkaç satır kodda gerçekleşir:

DWORD dwNewStyle = LVS_ICON; // İkon görünümünü değiştir

DWORD dwOldStyle = GetWindowLong( hWndList, GWL_STYLE );

dwNewStyle | = ( dwOldStyLe & = ~ LVS_TYPEMASK);

SetWindowLong( hWndList, GWL_STYLE, dwNewStyle );

Görünüm Stilleri Arasında Geçiş Yapmak

Kod 7.9’da verilen kaynak kod liste görünümü stilleri arasında geçiş yapmak için kullanılır. Bir radyo düğmesi seçildiğinde düğmenin mesaj yönetimi fonksiyonu çağrılır. Her mesaj yönetimi fonksiyonu SetListView üye fonksiyonuna farklı bir liste görünümü stil parametresi gönderir. SetListView fonksiyonu liste görünümü¬nü seçilen stil olarak değiştirmek için SetWindowLong fonksiyonunu kullanır.

Kod 7.11. Kontrolün Görünüm Stilini Değiştirmek İçin Kullanılan
Fonksiyonlar

void CListExDlg::OnRadioIcon( )
{
SetListView( LVS_ICON );
}
void CListExDlg::OnRadioList( )
{
SetListView( LVS_LIST);
}
void CListExDlg::OnRadioReport( )
{
SetListView( LVS_REPORT);
}
void CListExDlg::OnRadioSmall( )
{
SetListView( LVS_SMALLICON );
}
void CListExDlg::SetListView( DWORD dwNewStyle )
{
DWORD dwOldStyle;
HWND hWndList = m_listCtrl.GetSafeHwnd( );
dwOldStyle = GetWindowLong( hWndList, GWL_STYLE );
if ( (dwOldStyle & LVS_TYPEMASK) != dwNewStyle )
{
// LVS_TYPEMASK’dan önce tilde işaretini unutma !
dwOldStyie & = ~LVS_TYPEMASK;
dwNewStyle | = dwOldstyle;
SetWindowLong( hWndList, GWL_STYLE dwNewStyle );
}
}

ListEx örnek programını derleyip çalıştırın. Liste görünümü başlangıçta içeriğini Icon görünümünde gösterir.

7.4. Ağaç Görünümleri

İlk olarak Wındows 95 ile ortaya çıkan en populer kontrollerden biri ağaç görünümü kontrolüdür. Bu bölmüde öğrenecekleriniz;

• Bir iletişim kutusunda ağaç görünümü kontrollerinin kullanılması,

• Ağaç görünümü kontrolünün bir SDI uygulamasında kullanılması,

• Ağaç görünümü kontrolünü destekleyen MFC sınıflarının kullanılması.

7.4.1. Ağaç Görünümü Kontrolü Nedir?

Ağaç görünümü kontrolleri “Liste Kutusu ve Bileşik Kutu Kontrollerini Kullanmak” adlı bölümünde anlatılan liste kutusu kontrollerine benzer. Ağaç görünümü kont¬rolleri liste kutularından farklı olarak bilgileri bir ağaç şeklinde yani hiyerarşi için¬de gösterir. Ağaç görünümü kontrolleri genellikle diskteki dizinleri veya kitap ya da diğer dokümanların içeriğini görüntülemek için kullanılır.

Bir ağaç görünümü kontrolü ebeveyn ve çocuk maddelerden oluşur. Ebeveyn maddeler ağacın kökünde yani tepe seviyesinde yer alır. Ağaç görünümü kontrolünde çocuk maddeler ebeveyn maddelerin altında yer alır.

Ağaç görünümü kontrolü oldukça popülerdir çünkü çok miktarda bilgiyi hiyerarşik olarak görüntülemenize olanak tanır. Bir liste kutusundan farklı olarak, başlangıçta kullanıcıya üst-seviyedeki az miktarda bilgi görüntülenerek kullanıcı¬nın ağacın hangi kısmını genişleteceğine karar vermesine yardımcı olunur. Ağaç görünümü kontrolü aynı zamanda kontroldeki farklı maddeler arasındaki ilişkile¬rin görülebilmesini sağlar. Örneğin Explorer’da alt dizinlerin dizin içindeki ko¬numlarını göstermek için iç içe geçmiş biçimde gösterilirler.

Ağaç görünümü kontrollerinin popüler olmasının bir başka sebebi çok fazla seçenek sunmalarıdır. “Liste Görünüm Kontrolleri’ adlı bölümde anlatılan liste görü¬nümü kontrollerinde olduğu gibi ağaç görünümü kontrollerinde de sorumluluk kullanıcıya aittir. Bu bölümün ilerleyen kısımlarındaki bir örnekte göreceğiniz gibi kullanıcının ağaç görünümü maddelerinin etiketlerini değiştirmesine olanak tanı¬mak çok kolaydır.

Çeşitli farklı stillerde ağaç görünümü kontrolleri oluşturabilirsiniz. Örneğin, çoğu a¬ğaç görünümü kontrolü her maddenin yanında bir bitmap gösterir. Ayrıca birço¬ğu her maddenin yanında bir de kontrol düğmesi gösterir. Madde genişletilebile¬cekse bu düğme artı şeklindedir. Düğmeye tıklanırsa o maddenin çocukları görü¬necek şekilde ağaç genişler. Madde genişletilince eksi işaretli bir düğme gösterilir.


Şekil 7.9. Windows Explorer ile ağaç görünümü kontrolü uygulaması

Ağaç görünümü kontrolleri genelde çok fazla bilgi içerir. Kullanıcı, ağacın maddelerini genişleterek veya küçülterek gösterilen bilgi miktarını değiştirebilir. Daha fazla yatay veya düşey alan gerektiğinde ağaç görünümü kontrolü otomatik olarak kaydırma çubukları görüntüler.

7.4.2. Ağaç Görünümü Kontrolleri İçin MFC Desteği

MFC tabanlı programlarınızda ağaç görünümü kontrolleri kullanmanın iki yolu vardır. Ağaç görünümü kontrolü bir iletişim kutusunda kullanıldığında kontrol i¬letişim kutusuna herhangi bir düğme, liste kutusu veya diğer kontroller gibi eklenir. Ağaç görünümü kontrolleriyle etkileşim için cTreeCtrl MFC smıfı kullanılır ve ClassWizard kullanılarak bir ağaç görünümü kontrolüyle ilişkilendirilir.

Ağaç görünümü kontrolleri bir görünümde de kullanılabilir. CTreeView sınıfıi tek bir ağaç görünümü kontrolünden oluşan özelleşmiş bir görünümdür. CTreeView sınıfı, kendisi de CView sınıfından türetilen CCtrlView sınıfından türetilmiştir.

CTreeView sınıfı CView sınıfından türetildiğinden aynı CView sınıfı gibi kullanılır. Bu bölümdeki ilk örnek için MFC tabanlı bir uygulamada ana görünüm olarak CTreeView sınıfını kullanacaksınız.

Bir Ağaç Görünümü Kontrolünü Görünüm Olarak Kullanmak

Bir ağaç görünümü kontrolunu anlamanın en iyi yolu bir örneğe bakmaktır. Bu örnek için AppWizard’ı kullanarak TreeEx adında bir SDI projesi oluşturun. AppWizard’ın 6. adımında uygulama için üretilen sınıfları içeren bir liste kutusu ile birlikte bir bayrak görünür. Uygulamanın ana görünümü olarak bir ağaç görünü¬mü kullanmak için şu adımları izleyin:

1. Sınıf liste kutusundan görünüm sınıfını, bu örnekte CTreeExView sınıfını seçin.

2. Base Class bileşik kutusundan CTreeView sınıfinı seçin.

3. AppWizard’ın işlemini sonlandırmak için Finish düğmesine tıklayın ve New Project Information iletişim kutusunu görüntüleyin.

4. TreeEx projesi için kod üretmek üzere OK düğmesine tıklayın.

TreeEx uygulamasını derleyip çalıştırabilirsiniz; ancak ağaç görünümü kontrolüne henüz hiçbir madde eklenmemiştir. Bir sonraki kısımda bir ağaç görünümüne madde eklemeyi göreceksiniz.

Bir Ağaç Görünümüne Maddeler Eklenmesi

Daha önce söz edildiği gibi, CTreeView sınıfı CView sınıfından türetilmiştir ve tüm görünüm yüzeyini kaplayan bir ağaç görünümü içerir. Ağaç görünümü kontrolüne erişmek için GetTreeControl fonksiyonunu kullanacaksınız:

CtreeCtrl& tree = GetTreeCtrl( );

GetTreeCtrl fonksiyonunun döndürdüğü değerin bir CTreeCtrl nesnesine referans olduğuna dikkat edin. Bu demektir ki döndürülen değer bir CTreeCtrl referans de¬ğişkenine atanmalıdır. Ağaç görünümü kontrolüne eriştikten sonra kontrole çeşitli biçimlerde maddeler ekleyebilirsiniz. Ağaç görünümüne bitmap görüntüsü olmayan basit yazı maddele¬ri eklenirken en basit yöntemler kullanılır. Bir ağaç görünümü kontrolüne basit maddeler eklerken yalnızca maddenin etiketi verilmelidir:

HTREEITEM hItem = tree.Inserttem( “Foo” );

Bu satır ağaç görünümü kontrolüne birinci yani kök seviyesinde bir madde ekler, Madde başarıyla eklenmişse InsertItem fonksiyonunun döndürdüğü değer yeni bir maddeye bir atanır. Madde eklenememişse NULL döndürülür. Bir maddeyi çocuk seviyede eklemek için ebeveynin tutamacını parametre olarak gönderin.

tree.InsertItem( “Bar”, hItem );

Kod 7.12‘de verilen kaynak kod CTreeExView::OnInitialUpdate fonksiyonunda sekiz madde eklemek için önceden söz edilen fonksiyonları kullanır.

Kod 7.12. CTreeView Nesnesinin Madde Ekleme

void CTreeFxView::OnInitialUpdate( )
{
CTreeView::OnInitialUpdate( );
CtreeCtrl&i tree = GetTreeCtrl( );
HTREEITEM hChapter = tree.InsertItem( “Chapter 1”);
tree.InsertItem( “What”, hChapter);
tree.InsertItem( “Why”, hChapter );
tree.InsertItem( “How”, hChapter );
hChapter = tree.InsertItem( “Chapter 2”);
tree.InsertItem( “What”, hChapter );
tree.InsertItem( “Why”, hChapter );
tree.InsertItem( “How”, hChapter );
}

Kod 7.12’deki kaynak kodu ekledikten sonra TreeEx projesini derleyip çalıştırın.

Şekil 7.10. TreeEx örneğinin ana görünümü

Ağaç Görünümü Kontrollerinde Stillerin Uygulanması

Mevcut diğer görünüm ve pencere stillerine ek olarak bir ağaç görünümü kontrolüne dört ayrı stil uygulanır.

• TVS_HASLINES ebeveyn ve çocuk maddeler arasına birleştirici çizgiler ekler.

• TVS_LINESATROOT ağaç görünümü kontrolünde kök seviyesindeki maddeler için çizgi ekler. TVS_HASLINES seçilmemişse bu özellik göz ardı edilir.

• TVS_HASBUTTONS genişletilebilecek maddelere artı ve eksi işaretlerini ekler.

• TVS_EDITLABELS kullanıcının ağaç görünümündeki bir etiketi değiştirebilmesine olanak tanır.

Çoğu zaman normal bir görünüm için stil tanımlama işiyle uğraşmazsınız; varsayılan ayarlar yüzde 99 yeterince iyidir. Ancak bir ağaç görünümünde CTreeExView::PreCreateWindow fonksiyonunda değişiklik yaparak seçime bağlı stillerden bir veya daha fazlasını seçmek isteyebilirsiniz. Kod 7.13’deki kaynak kod TVS_EDITLABELS dışında tüm stilleri uygulamaktadır.

Kod 7.13. PreCreateWindow Fonksiyonunda Ağaç Görünümü
Stilini Değiştirme

BOOL CTreeExView::PreCreateWindow(C REATESTRUCT& cs)
{
cs.style | = (TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS );
return CTreeView::PreCreateWindow(cs) ;
}

TreeEx örneğini derleyip çalıştırın. İlk bakışta liste görünümü ve ağaç görünümü kontrollerinin neredeyse öz¬deş olduğunu düşünebilirsiniz. Liste görünümü ve ağaç görünümü kontrolleri arasındaki en büyük fark her bir maddeye ulaşılma şeklidir. Liste görünümü kontrolünde kontrol ile ileti¬şim kurarken maddenin sıra numarası kullanılır. Ağaç görünümü kontrolleri maddelerin genişletilip küçültülmesine izin verdiğinden mutlak bir sıra nu¬marası kavramı burada işe yaramaz. Ağaç görünümünde bir maddeye ul¬aşmak için bir madde tutamacı, HTREEITEM kullanılır.

Ayrıca, çok sayıda ufak farklılık da vardır. Örneğin, CListCtrl:Create DragImage fonksiyonu iki parametre alırken onun eşdeğeri olan CTre¬eCtrl fonksiyonu yalnızca bir parametre alır.


Şekil 7.11. Ağaç görünümü stillerini değiştirdikten sonra TreeEx örneği
Ağaç Görünümü Kontrollerinin İletişim Kutularına Eklenmesi

Bir ağaç görünümü kontrolünü bir iletişim kutusuna da ekleyebilirsiniz. Örnek olarak TreeEx About iletişim kutusuna bir tane ekleyeceksiniz. TreeEx About iletişim kutusunda kullanılan ağaç görünümü kontrolü etiketlerin değiştirilmesini destekler ve her madde için bir bitmap gösterir.

İletişim kutusuna ağaç görünümü kontrolü eklemek herhangi başka bir kontrol eklemekten farksızdır. Proje çalışma alanında ResourceView sekmesini seçin ve Dialog klasörünü açın. IDD_ABOUTBOX ikonuna çift tıklatarak veya ikona farenin sağ tuşuyla tıklayıp kısayol menüsünden Open komutunu seçerek IDD_ABOUTBOX iletişim kutusu kaynağını açın. OK düğmesi dışında IDD_ABOUTBOX iletişim kutusundaki diğer kontrolleri kaldı¬rın. Ağaç görünümü kontrolünü iletişim kutusuna sürükleyerek veya kontrolü se¬çip iletişim kutusuna tıklayarak kontrolü iletişim kutusuna ekleyin.

Ağaç Görünümü Kontrolünün Özelliklerinin Ayarlanması

Ağaç görünümü kontrolünün özellikleri Properties iletişim kutusundan değiştirilebilir. Ağaç görünümlerinin bazı özellikleri liste kutuları için de geçerlidir. Ağaç gö¬rünümü kontrolünün özellikleri şunlardır:

• ID ağaç görünümü kontrolünün ID’si için kullanılır. Visual C++ IDC_TREE1 gibi bir kaynak ID’si verir.

• Visible kontrolün başlangıçta görünür olduğunu gösterir. Bu onay kutusu normalde işaretlidir.

• Disabled listenin başlangıçta kullanılamaz durumda olduğunu gösterir. Bu onay kutusu normalde işaretli değildir.

• Group bir gruptaki ilk maddeyi belirlemek için kullanılır. Bu onay kutusu normalde işaretli değildir.

• Tab Stop bu kontrole klavyedeki Tab tuşuna basılarak ulaşılabileceğini gösterir. Bu onay kutusu normalde işaretlidir.

• Help 112 bu kontrol için ortama duyarlı bir yardım ID’si oluşturulacağını gösterir.

• Has Buttons kontrolün düğme içereceğini gösterir. Ağaç görünümü kontrolünde genişletilebilecek her maddenin solunda bir düğme olacaktır. Bu onay kutusu normalde işaretli değildir.

• Has Lines kontroldeki maddeleri birleştiren çizgiler olacağını gösterir. Bu onay kutusu normalde işaretli değildir.

• Border ağaç görünümü kontrolünün çevresine çerçeve çizileceğini göste¬rir. Bu onay kutusu normalde işaretlidir.

• Lines ot Root kontrolün “kök” yani birinci seviyesinde çizgi çizileceğini belirtir. Has Lines onay kutusu seçilmemişse bu seçenek göz ardı edilir.

• Edit Labels kullanıcının kontroldeki etiketlerin değerlerini değiştirebilmesine olanak tanır. Bu onay kutusu normalde işaretli değildir.

• Disable Drag Drop ağaç görünümü kontrolündeki maddelerde sürükle-ve-bırak işlemlerinin yapılmasını engeller. Bu onay kutusu normalde işaretli değildir.

• Show Selection Always seçilen maddeler için sistemin aydınlatma rengi kullanılacağını gösterir. Bu onay kutusu normalde işaretli değildir.

• Check Boxes ağaç görünümü kontrolündeki her maddenin yanında bir o¬nay kutusu oluşturur. Bu onay kutusu normalde işaretli değildir.

• Full Row Select bir madde seçildiğinde tüm satırın üzerinin aydınlatılaca¬ğını gösterir. Bu onay kutusu normalde işaretli değildir.

• Info Tip bu kontrolde bilgi ipuçlarının gösterilmesini sağlar. Bu onay kutu¬su normalde işaretli değildir.

• Scroll bu kontrolde kaydırma yapılabilmesini sağlar. Bu onay kutusu nor¬malde işaretlidir.

• Tool Tips bu kontroldeki maddeler için araç ipuçlarının gösterilmesini sağlar. Bu onay kutusu normalde işaretlidir.

• Non Even Height bir maddenin yüksekliğinin çift sayı yerine tek sayı yapılmasını sağlar. Bu onay kutusu normalde işaretli değildir.

• Track Select duyarlı izleme yapılmasına izin verir.

• Single Expand ağaçtaki düğümlerin seçildikleri zaman genişletileceklerini gösterir. Bu onay kutusu normalde işaretli değildir.

Ağaç görünümü kontrolünün Properties iletişim kutusunu açın ve kaynak ID’sini IDC_TREE yapın. Aşağıdaki seçenekleri işaretleyip diğer özellikleri olduğu gibi bırakın:

• Has Lines

• Lines at Root

• Has Buttons

ClassWizard’ı ve Tablo 7.10’daki değerleri kullanarak yeni ağaç görünümü kontrolüyle bir CTreeCtrl üye değişkeni ilişkilendirin.

Tablo 7.10. CAboutDlg Nesnesine Bir CTreeCtrl Üye Değişkeni
Eklemek İçin Kullanılan Değerler

Kontrol ID Değişken Adı Kategori Tip

IDC_TREE m_tree Kontrol CtreeCtrl

Bir Görüntü Listesi Kontrolünün Oluşturulması

About iletişim kutusunun içeriği ağaç görünümü her maddenin yanında iki bitmap gösterir:

• Kök seviyesindeki maddeler için bir defter ikonu

• İkinci seviyedeki maddeler için doküman sayfası ikonu

“Bitmap ve Görüntü listelerini Kullanmak” adlı bölümde anlatıldığı gibi bir görüntü listesi bir veya daha fazla parçası olan tek bir bitmap’ten oluşur.


Şekil 7.12. Ağaç görünüm kontrolünde gösterilen bitmap’ler

İletişim Kutusu Sınıfında Değişiklik Yapılması

Ağaç görünümü kontrolünü yönetmek için CAboutDlg sınıfında değişiklikler yapmanız gerekir. Ağaç görünümü kontrolündeki her maddenin yanında gösterilecek görüntüler için bir CImageList değişkeni elde etmelisiniz. Kod 7.14’te verilen kaynak kodu CAboutDlg sınıf bildiriminin // Implementation kısmına ekleyin.


Kod 7.14. CAboutDlg Sınıf Bildirimine Yapılacak Eklemeler

// Implementation
protected:
CImageList m_imageList;

CAboutDlg sınıfı WM_INITDIALOG mesajını aldığında ağaç görünümü kontrolüne ilk değerler verilmeye başlanır. ClassWizard’ı kullanarak WM_INITDIALOG için bir mesaj yönetimi fonksiyonu yazın ve önerilen OnInitdialog ismini kabul edin.

Maddelerin Silinmesi

Bir kontrole madde eklenebiliyorsa elbette ki bu maddeler aynı zamanda silinebilmelidir. Ağaç görünümü kontrolündeki maddeleri silmek için CTreeCtrl:eleteItem üye fonksiyonu kullanılır:

BOOL fResult = m_tree.DeleteItem(hTreeItem);

Ağaç görünümü kontrolünden bir madde çıkarıldığında o maddenin altında yer alan çocuk maddeler de çıkartılır. Madde başarıyla silinemediyse DeleteItem fonksiyonu FALSE veya sıfır değerini döndürür, madde silindiyse sıfırdan farklı bir değer döndürülür. Ağaç görünümü kontrolündeki maddelerin tümünü silmek için CTreeCtrl:eleteAllItems üye fonksiyonunu kullanın.

BOOL fResult=m_tree.DeleteAllItems( );

Etiketlerin Yerinde Değiştirilmesi

Liste görünümü kontrolü gibi ağaç görünümü kontrolü kontrolün içerdiği mad¬deleri değiştirmek için kullanabileceğiniz yerleşik bir düzenleme kontrolüne sa¬hiptir. Bu yetenekten yararlanabilmek için ağaç görünümü kontrolünün Edit Labels özelliği işaretlenmiş olmalıdır. Etiket değiştirmekle ilgili iki mesaj vardır:

1. TVN_BEGINLABELEDIT etiket düzeltme işlemi başlamadan hemen önce gönderilir.

2. TVN_ENDLABELEDIT düzeltme işlemi tamamlandıktan sonra veya kulla¬nıcı işlemi iptal ettiğinde gönderilir.

Bu mesajlar aynı liste görünümü kontrolünde olduğu gibi yönetilir. TVN_BEGINLABELEDİT mesajını aldığınızda *pResult işaretçisine TRUE değeri vererek bir etiketin değiştirilmesine engel olabilir ve *pResult işaretçisini FALSE yapa¬rak etiketin değiştirilmesine tekrar izin verebilirsiniz. TVN_ENDLABELEDİT mesajı LVN_ENDLABELEDIT mesajının liste görünümü kont¬rolündeki kullanımı gibi kullanılır.

7.5. ActiveX Kontrollerini Kullanmak

ActiveX kontrolleri Wındows için yazılmış yeniden kullanılabilir kontrollerdir. Bu bölümde ActiveX kontrollerini ve bunları kullanarak çok fazla iş yapmadan uygulamalarınıza ilginç özellikler katmayı öğreneceksiniz.
• ActiveX kontrollerinin OLE ve VBX kontrollerinin yerine kullanılması,

• Projenize kolaylıkla işlevsellik katmak için ActiveX kontrollerini kullanmayı

• Visual C++’ın içerdiği Microsoft Hierarcbical Flex Grid kontrolünün kullanılması.

Bu bölümün sonundaki küçük bir örnek Visual C++‘ın içerdiği ActiveX kontrolle¬rinden birini kullanmaktadır.

7.5.1. ActiveX Kontrolü Nedir?

ActiveX kontrolü, uygulamalarınızda kullanabileceğiniz yeniden kulla¬nılabilir bir kontroldür. ActiveX kontrolleri kontrol ile iletişim için Component Object Model (COM) arabirimlerini kullanır.

ActiveX kontrolleri hem 16, hem de 32 bit’lik Windows süzümleri için gelişigüzeldir. Ayrıca lisans desteği ve farklı dillere göre yerelleştirme gibi özellikleri bu kontrolleri daha da çekici hale getirir.

Çok çeşitli ActiveX kontrolleri mevcuttur. Daha sonra bu bölümde, Visual C++’ın içerdiği ve basit çizelge uygulamaları yazmanıza olanak tanıyan Microsoft Hierarc¬hical Flex Grid kontrolünü kullanmak için gereken adımları izleyebilirsiniz.

ActiveX Kontrolleri Niçin Kullanılır?

MFC tabanlı uygulamalarınızda ActiveX kontrolleri kullanmak kolaydır çünkü bunlar yeniden kullanıma uygun tasarlanmıştır. Developer Studio MFC program¬larınıza kolaylıkla ActiveX kontrolleri eklemenizi sağlayan Component and Controls Gallery adında bir araç içermektedir.

ActiveX kontrolleri, kendilerinin ve kendilerini kullanan programların anladığı iyi tanımlanmış arabirimler üzerinden iletişim kurar. Bu arabirimler kont¬rolle bilgi ve olay alışverişinde bulunmak için kullanılır. ActiveX kontrolleri belli bir programlama diline özgü olmayan standart bir arabi¬rim kullandığından çeşitli geliştirme araçları tarafından kullanılabilirler. Bugün bir Visual C++ programında kullandığınız ActiveX kontrolleri Microsoft Access, Visual FoxPro ve Visual Basic gibi diğer araçlar tarafından da kullanılabilir.

ActiveX kontrolleri Windows’un sunduğu standart kontrollerin sağlayabileceğin¬den daha fazla işlevsellik sağlar. Örneğin, Windows 95 piyasaya sürülmeden önce Visual Basic Controls (VBX’ler) üreticilerinin çoğu ağaç görünümü kontrollerine benzer kontroller sunuyordu; artık bu üreticiler standart kontroller kullanılırken mevcut olmayan daha yeni özellikler içeren ActiveX kontrolleri sunmaktadır.

Bir ActiveX Kontrolü Nasıl Kullanılır?

Bir ActiveX olayı kontrolden kontrolü içeren uygulamaya gönderilen bir mesajdır. Bir ActiveX kontrolü daima bir ActiveX kontrol konteyneri ile iletişim kurar. Kontrol konteynerleri Şekil 7.13’de gösterildiği gibi ActiveX kontrol arabirimleri¬ni anlar. Bir ActiveX kontrol konteyneri kontrolün sahibine olayları aktarabileceği ve dış dünyadan bilgi alabileceği bir ortam sunmaktan sorumludur.




Açıklanan yöntemleri çağır


Olay mesajlarını konteynere
yollar





Şekil 7.13. Bir MFC programında ActiveX kontrolüne gönderilen ve ondan alınan mesajlar

Components and Controls Gallery Aracı

Components and Controls Gallery MFC tabanlı Windows programlarınızda kullanabileceğiniz yeniden kullanılabilir bileşenleri saklamak için kullanılır. Gelecek¬teki projelerinizde yeniden kullanmak isteyeceğiniz bir sınıf geliştirirseniz, şu a¬dımları izleyerek sınıfı Gallery aracına ekleyebilirsiniz:

1. Yeniden kullanılacak sınıfı içeren projeyi açın.

2. Proje çalışma alanında ClassView görünümünü açın.

3. Sınıfın ismine farenin sağ tuşuyla tıklayın ve kısayol menüsünden Add to Gallery komutunu seçin.

Components and Controls Gallery’de saklanan en sık kullanılan bileşenler ActiveX kontrolleridir. Makinenizdeki mevcut tüm ActiveX kontrollerini görmek için ana menüden Project > Add to Project > Components and Controls komu¬tunu seçerek Components and Controls Gallery’yi açın.

Component Gallery iletişim kutusu görüntülendikten sonra liste kutusundan Registered ActiveX Controls maddesini seçin; bu mevcut bütün ActiveX kont¬rollerini gösterecektir.

İletişim Editörüne Bir ActiveX Kontrolünün Eklenmesi

Bir ActiveX kontrolünü bir iletişim kutusunda kullanmadan önce kontrolü ileti¬şim editörünün kontrol paletine eklemeniz gerekir. Bir ActiveX kontrolünü ileti¬şim editörüne eklemek için şu adımları izleyin:

1. ActiveX kontrolü ikonlarından birini seçin.

2. Components and Controls Gallery iletişim kutusundan Insert düğmesine tıklayın.

3. Bileşeni eklemek isteyip istemediğinizi soran bir mesaj kutusu görünecektir. OK düğmesine tıklayın.

4. Confirm Classes iletişim kutusunda projenize eklenecek sınıfları içeren bir liste kutusu görünür. Sınıfları projenize eklemek için OK düğmesine tıklayın.

5. Components and Controls Gallery iletişim kutusunu kapatmak için Close düğmesine tıklayın.

Seçtiğiniz ActiveX kontrolü artık iletişim editörünün kontrol paletinde gözükür. Üzerinde çalışabileceğiniz bir iletişim kutusu açın, yeni ActiveX kontrolünü içeren yeni kontrol paletini göreceksiniz.Yeni ActiveX kontrolünü herhangi bir kontrol gibi kullanabilirsiniz. Yeni kont¬rolü iletişim kutusu kaynağına eklemek için kontrolü sürükleyip iletişim kutusuna bırakın veya ActiveX kontrolünün ikonunu seçip iletişim kutusu kaynağına tıklayın.

Bir ActiveX Kontrolünün Ayarlarını Yapmak İçin ClassWizard’ın
Kullanılması

ActiveX kontrolünü kullanmadan önce kontrolü projenize katmanız gerekir. Bir iletişim kutusuna eklenen diğer kontrollerde olduğu gibi, mesaj yönetimi fonksi¬yonları eklemek ve kontrolü bir MFC nesnesiyle ilişkilendirmek için ClassWizard’ı kullanın.

Bir ActiveX kontrolüyle ilişkilendirilmiş bir üye değişkeni eklerken, ClassWizard’ı standart bir Windows kontrolü eklenmiş gibi kullanırsınız. Standart Windows kontrollerinden farklı olarak her ActiveX kontrolü değişken olarak ortaya çıkan çok sayıda özelliğe sahiptir.

7.5.2. ActiveX Kontrolü Kullanan Bir Örnek

MFC tabanlı bir projede ActiveX kontrolü kullanmaya örnek olması için iletişim kutusu tabanlı bir uygulamada Microsoft Hierarchical Flex Grid kontrolünü kullanacaksınız. Bu ızgara kontrolü ana iletişim kutusunda küçük bir çizelge oluşturmak için kullanılacak.

Örnek projeye başlamak için CustomCtrl adında iletişim kutusu tabanlı bir uygulama oluşturmak üzere AppWizard’ı kullanın. Kitaptaki diğer AppWizard örnekleri