| |||||||||
| |
Ü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.
|
| |||||||
| Programlama C,C++,Visual C, Flash vb. programlama ile ilgili herşey.. |
| Tags |
basic, bulabilirsiniz, herseyi, ile, ilgili, visual ![]() |
| ||
![]() |
| | LinkBack | Seçenekler |
| | #27 (permalink) |
| aLkoLSüZ!!! ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() REP Gücü : 100 REP Puanı : 704162779 REP Seviyesi : ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | 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östermeDraw 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 |











