|
|
#1 (permalink) | |||||||||||
|
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. |
|||||||||||
|
|
|
|
#2 (permalink) | |||||||||||
|
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 SetPosMevcü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ü(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.
__________________ |
|||||||||||
|
|
|
|
#3 (permalink) | |||||||||||
|
İ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: etPos 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.
__________________ |
|||||||||||
|
|
|
|
#4 (permalink) | |||||||||||
|
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_PAINTmesajı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ğufarklı ş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
__________________ |
|||||||||||
|
|
|
|
#5 (permalink) | |||||||||||
|
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. 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::AddBitmapToImagelist Fonksiyonu BOOL ClmageListView::AddBitmapToImageList( 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.
__________________ |
|||||||||||
|
|
| Konu Araçları | |
| Mod Seç | |
|
|
|
||||
| Konu | Konuyu Başlatan | Forum | Yanıt | Son Mesaj |
| Zirveye Tırmanma Yolları.... | rojda_06 | Genel Kültür | 6 | 20-05-2007 01:30 PM |
| Lübnan'a asker gönderilmesini onaylayan tezkere Meclis Genel Kurulu'ndan 340 oyla geç | Sumaye | Sınırsız Muhabbet Burada | 8 | 03-03-2007 04:37 PM |
| Yenİ Bİr Sayfa AÇilsin... | freelyon | Genel Kültür | 5 | 13-09-2006 10:39 PM |
Bir Forum sitesi
olduğumuzdan, kullanıcılar önceden onay almadan her türlü görüşlerini yazabilmektedir.
Yazılanlardan dolayı oluşabilecek her türlü yasal sorumluluk, yazan kullanıcılara
aittir.
Yinede sitemizde yasalara aykırı herhangi bir durum
görürseniz; Lütfen,
bydigi@gmail.com'a yada
İletişim'e bildiriniz.
Mesajınız incelenip, kısa bir süre içerisinde gereken müdahale yapılacaktır.