Üye Giriş

Tavsiye Programlar

Firefox 2

Alexa Tolbar
MENÜLER PDF Yazdır E-posta
Yazar Hanzala   
Sunday, 26 December 2004

3. BÖLÜM

 

MENÜLER

 

Menüler bir çok Windows programının önemli bir kısmıdır. Bazı basit iletişim kutusu tabanlı uygulamalar dışında bütün Windows uygulamaları bir tür menü kullanır. Bu bölümde öğreneceğiniz konular şunlar;

 

·        Menülerin Windows programlarında nasıl kullanıldığı,

 

·        Menüleri desteklemek için MFC CMenu sınıfının nasıl kullanıldığı,

 

·        Menü maddelerinize klavye kısayollarının eklenmesi

 

            Bu bölümde AppWizard ile oluşturulmuş bir menü üzerinde çalışacak ve kayan bir menü oluşturacaksınız.

 

            Menü seçilebilen ve bir pencereye gönderilebilen bir komut mesajları listesidir. Kullanıcı için bir menü maddesi, uygulama tarafından gerçekleştirilebile­cek bir görevi belirten bir yazıdır.

 

            Her menü maddesi ayrıca pencere mesajları yönlendirilirken maddeyi belirlemek için kullanılan bir ID’ye sahiptir. Bu ID menü maddesinin özellikleri değiştirilirken de kullanılır.

           

            Birçok uygulama masaüstünde herhangi bir yerde görünebilecek açılan menüleri desteklemesine rağmen, menüler genellikle bir pencereye iliştirilir. Daha sonra bu bölümde “Kısayol Menüsü Oluşturmak” adlı bölümde farenin sağ tuşuna tıklandığında görünen bir açıdan menü oluşturacaksınız. Bu menüler genellikle ortama duyarlı yardım ya­ratmak için kullanılır ve menüyü yaratan pencereye bağlı olarak farklı menü seçenekleri sunar.

 

Windows programlarını kullanmayı kolaylaştırmak için çoğu program menülerinin görünümüyle ilgili olarak belli standartlara uyar. Örneğin, kullanıcının ek bilgi girmesini gerektiren bir iletişim kutusu açılmasını sağlayan menü maddelerinin sonunda genelde üç nokta (...) olur.

 

Bir başka kullanıcı arabirim standardı da her menü maddesinde altı çizili bir harf olmasıdır. Bu harfe basıldığında uygun menü maddesi seçilmiş olur. Bu harf ge­nelde menü maddesinin ilk harfidir, ancak bazı durumlarda başka bir harf kullanı­lır. Örneğin, File menüsündeki Exit menü maddesinde X harfinin altı çizilidir. Birden fazla menü maddesinde aynı harfin altı çizili olmamasına dikkat etmeniz gerekir. Çünkü eğer böyle bir şey olursa menü beklediğiniz gibi çalışmayabilir; altı çizili harfe basıldığında ilk menü maddesi işaretlenecek ama enter tuşuna basılana dek menü maddesi seçilmeyecektir. Altı çizili harfe basmaya devam edildiğinde aynı harfin altı çizili olduğu bir sonraki menü maddesi işaretlenecektir.

 

            Menüler bazen iç içe geçirilmiştir, yani bir menü maddesi aslında ek menü maddeleri içeren bir alt menüdür. Kullanıcıyı iç içe geçirilmiş alt menülere götüren menü maddelerinin yanında daha fazla seçim yapılabileceğini gösteren bir sağ ok vardır. Şekil 3.1’de gösterildiği gibi Visual C++’da kullanılan File menüsünde iç içe geçirilmiş menü yapısına bir örnek görebilirsiniz.


 

Şekil 3.1.  Visual C++’da üzerinde son çalışılan dosyaları görebilirsiniz

 

            3.1.  Komut Mesajlarını Yönlendirmek

 

            Menü yaratmayı ve değiştirmeyi öğrenmeden önce menü mesajlarının Windows programları ve özellikle MFC programları tarafından genelde nasıl yönetildiğine bir bakın.

 

            Bir menü daima belli bir pencereyle ilişkilendirilmiştir. Çoğu MFC programında aynı zamanda uygulamanın araç çubuğunu ve durum çubuğunu da içeren ana çer­çeve penceresiyle ilişkilendirilmiştir. Bir menü maddesi seçildiğinde ana çerçeve penceresine bir WM_COMMAND mesajı gönderilir; bu mesaj menü maddesinin ID’sini içerir. MFC yapısı ve uygulamanız bu mesajı “Mesajlar ve Olay-Güdümlü Programlama’ adlı bölümde açıklanacağı üzere bir fonksiyon çağrısına çevirir.

 

            Menü Seçim Mesajını Hangi Sınıf Yönetir?

 

            Bir MFC sınıfında birçok sınıf bir menü seçim mesajım alabilir. Genelde CCmdTarget sınıfından türetilmiş herhangi bir sınıf MFC yapısının mesaj döngü­süne takılıdır. Bir menü maddesi seçildiğinde mesaj aşağıdaki sırada uygulamanız­daki tüm komut hedef nesnelerine gönderilir:

           

1.      CMainFrame nesnesi

 

2.      Ana MDI çerçeve penceresi

 

3.      Bir MDI çerçeve penceresinin aktif çocuk çerçevesi

 

4.      MDI çocuk çerçevesiyle ilişkili görünüm

 

5.      Aktif görünümle ilişkili doküman nesnesi

 

6.      Döküman nesnesiyle ilişkili döküman şablonu

 

7.      CWinApp nesnesi

 

            Bu liste size çok uzun gelebilir ama aslında uygulamada o kadar karışık de­ğildir. genellikle bir menü maddesi tek bir nesne tipi tarafından yönetilir. Bir görünüm veya ana çerçeve tarafından. Menü mesajları nadir olarak doğ­rudan döküman şablonu veya çocuk çerçeve nesneleri tarafından yönetilir.

 

            3.2.     Bir Menü Oluşturmak

 

            Menüleri dinamik olarak veya programınıza eklenen statik kaynaklar olarak oluşturabilirsiniz. MFC sınıf kütüphanesi menü yönetimini kolaylaştıran ve bu bölümdeki örnekler için kullanılan bir CMenu sınıfı içerir.     

           

            AppWizard’ın oluşturduğu programlar için bir menü kaynağı üretir. Uygulamanıza faz­ladan menü maddeleri eklemek için bu menü kaynağında değişiklikler yapabilir veya uygulamanız için yeni menü kaynakları oluşturabilirsiniz.

           

                        Bu bölümde kullanılan örnekler için menü adında örnek bir SDI uygulaması oluşturun. Bu program menü kaynaklarının nasıl yaratıldığını ve değiştirildiği­ni göstermek için kullanılacaktır.

 

            Yeni Menü Maddeleri Eklemek

    

            Bir menüye yeni bir madde eklemek kolaydır Yeni bir menü maddesini kullanmak için yapmanız gereken iki şey vardır:

    

·            Yeni menü maddesini dahil etmek için menü kaynağında değişiklik yapmak

 

·            ClassWizard’ı kullanarak bir mesaj-yönetimi fonksiyonu yazmak Aşağıdaki iki kısımda bu adımlar açıklanmaktadır.

 

            Menü Kaynağını Açma

           

            O anki menü kaynaklarını görüntülemek için proje çalışma alanı penceresinde ResourceView sekmesini seçin. Kaynak ağacını o anki proje için tanımlanmış farklı kaynak tiplerini gösterecek şekilde genişletin; klasörlerden birisi menü adın­dadır. Projenin menüleri için tanımlanmış kaynakları görüntülemek için menü klasörünü açın. AppWizard tarafından yaratılan her çok-dokümanlı uygulama iki menü kaynağına sahiptir.

 

            Hiçbir görünüm aktif olmadığında MDI uygulamaları bir IDR_MAINFRAME menüsü kullanır. Ayrıca bir görünüm aktifken kullanılan ek bir menü maddesi de vardır. Bu menü kaynağının ismi uygulamanın adına bağlıdır. Yani menü kaynağı IDRxxTYPE gibi bir isme sahiptir ve burada xxx programın adını temsil eder. Örneğin, IDR_FOOTYPE Foo adında bir program için yaratılan i­kinci menü kaynağıdır.

 

            Menü örneği gibi SDI uygulamaları, AppWizard tarafından yaratılmış IDR_MAINFRAME adında tek bir menüye sahiptir. Tek-dokümanlı uygulamalar için varsayım olarak görüntülenen menü budur. Her AppWizard programı aynı menüyle başlar; uygulamanız için gereken her türlü değişikliği yapmak size kalmıştır.        

 

      Menü Kaynağını Düzenlemek

 

            Menü kaynağı ikonuna çift tıklayarak menü kaynağını açın. Menü kaynak editöründe görüntülenir. Menü editöre ilk defa yüklendiğinde yalnızca üst-seviyeli menü çubuğu görüntülenir. Herhangi bir üst-seviyeli menü maddesine tıklamak, Şekil 3.2’de gösterildiği gibi o maddeyle ilişkili açılan menüyü görüntüler.  


     

                       

Şekil 3.2.  Bir menü kaynağını düzenlemek için Developer Studio kaynak

editörünü kullanmak

 

            Her menünün son maddesi boş bir kutudur. Menü kaynağına yeni menü maddeleri eklemek için bu kutuyu kullanırsınız. Bütün menü maddeleri ilk başta menü kaynağının sonuna eklenir ve daha sonra doğru konuma taşınır. Yeni bir menü maddesi eklemek için şu adımları izleyin:

 

1.      Menu Item Properties iletişim kutusunu görüntülemek için Pile menüsündeki boş kutuya çift tıklayın.

 

2.      Yeni bir menü maddesi eklemek için o maddeye ait menü ID’sini ve başlı­ğı girin. Menü ID’leri 1D önekiyle başlar ve bunun sonuna üst-seviyeli menünün adını eklersiniz. Bu örnek için menü ID’si olarak ID_FILE_HELLO ve menü başlığı olarak &HeIIo girin.

 

3.      Seçime bağlı olarak, yeni menü maddesi seçildiğinde durum çubuğunda bir yazı görülmesini sağlayabilirsiniz.

 

4.      Editöre geri dönmek için Properties iletişim kutusunun dışında herhangi bir yere tıklayın.Yeni menü maddesini ekledikten sonra fare ile sürükleyerek menü maddesini başka bir konuma taşıyabilirsiniz. Menünün konumunu değiştirmek onun özel­liklerini etkilemez.

 

            Menü Maddelerinin Özellikleri

           

            Properties iletişim kutusundan bir menü maddesinin çeşitli özellikleri ayarlanabilir:

 

·        ID menünün kaynak ID’si olarak kullanılır. Bu ID, WM_COMMAND mesajı­nın bir parçası olarak uygulamanıza gönderilir ve menü maddesini belirle­mesi için ClassWizard tarafından kullanılır.

 

·        Caption menü maddesini tanımlamak için kullanılan isimdir. Klavyeden bir tuşa basıldığında menü maddesinin aktifleşmesi için maddenin ismindeki bir harfin önüne S karakteri eklenir.

 

·        Separator bu menü maddesinin bir ayırıcı, yani menüyü mantıksal bölüm­lere ayıran yatay bir çizgi olduğunu gösterir. Bu onay kutusu normalde işa­retli değildir.

 

·        Checked menü maddesinin seçili olduğunu belirtmek için yanında bir onay işa­reti görünmesi gerektiğini gösterir. Bu onay kutusu normalde işaretli değildir.

 

·        Pop-up, bu menü maddesinin açılan veya bir alt menünün üst seviyesi olduğunu belirtmek için kullanılır. Bu onay kutusu çoğunlukla üst-seviye menü çubuğu dışında işaretli değildir.

 

·        Grayed bu menü maddesinin kullanılamaz hale getirilmiş olarak gösterilmesini sağlar. Bu onay kutusu normalde işaretli değildir.

 

·        Inactive bu menü maddesinin aktif olmayacağını gösterir. Bu onay kutusu normalde işaretli değildir.

 

·        Help menü maddesini menü çubuğunun en sağına yerleştirir. Bu seçenek Help menüsü için bile çok nadir kullanılır.

 

·        Break menüyü bu menü maddesinde ayırmak için kullanılır. Varsayılan seçenek “none”dır ve hemen hemen bütün durumlarda kullanılır.

 

·        Prompt, menü seçildiğinde durum çubuğunda görünecek yazıyı belirtmek için kullanılır

           

            Mesaj-Yönetimi Fonksiyonu Eklemek

           

            Uygulamanın menüsüne bir menü maddesi ekledikten sonra bir sonraki adım, yeni menü maddesini yönetecek bir mesaj-yönetimi fonksiyonu eklemektir. MFC tabanlı Windows programlarında mesaj-yönetimi fonksi­yonları yaratmak için ClassWizard kullanılır. Önceki örnekte Hello menü maddesi için mesaj yönetimi fonksiyonu eklemek amacıyla şu adımları izleyin:

 

1.      Ctrl+W tuşlarına basarak veya bir kaynak kod penceresinde farenin sağ tuşuyla tıklayıp menüden ClassWizard’ı seçerek ClassWizard’ı açın.

 

2.      Message Maps sekmesini seçin ve Class Name bileşik kutusundan mesajı yönetecek sınıfı (bu örnekte CMainFrame sınıfını) seçin.

 

3.      Object ID liste kutusundan mesajı üreten nesneyi (bu örnekte ID_FILE_HELLO nesnesini) seçin. Bu ID’nin daha önce menü maddesini oluştururken girdiğiniz değer olduğunu unutmayın. Messages liste kutusunda iki mesaj-yönetimi fonksiyonu görüntülenir.

 

4.      Messages liste kutusundan COMMAND mesajını seçin ve Add Function düğmesine tıklayın. Fonksiyon ismi için ClassWizard’ın önerdiği ismi (OnFileHello ismini) kabul edin.

 

5.      ClassWizard’ı kapatmak için OK düğmesine tıklayın.

 

CMainFrame::OnFileHelIo fonksiyonunu Kod 3.1’deki gibi değiştirin.

 

            Kod 3.1.  CMainFrame::OnFileHello Mesaj-Yönetimi Fonksiyonu

 

            void CMainFrame::OnFiIeHello( )

            {

                     AfxMessageBox( “HeIlo from the File menu” );

            }

 

            Kitabın geri kalan bölümlerindeki örneklerde kullanılan tüm menü mad­delerini eklemek için bu temel adımlar kullanılır. Developer Studio araçla­rını kullanmak o kadar kolaydır ki yeni bir menü maddesi eklemek hemen çok basit bir iş haline gelecektir.

 

            Menü projesini derleyin. File menüsünden Hello komutunu seçerseniz bir mesaj kutusu görüntülenecektir.

 

            3.3 Kısayol Menüsü Oluşturmak

 

            Bir pencereye farenin sağ tuşuyla tıklayarak açılan menü veya bağlam menüsü de denilen bir kısayol menüsü görüntülersiniz. Kısayol menüleri sık kullanılan işlem­lerin bir listesini sunar. Kısayol menüsü oluşturmak mevcut bir menüde değişiklik yapmaya benzer. Tek fark, ilk adım olarak yeni bir menü kaynağının yaratılması gerektiğidir. Kısayol menıülerinin çoğu, farenin sağ tuşuna bastığınızda gönderilen WM_CONTEXTMENU mesajına karşılık olarak gösterilir.

 

           

 

            Bir Açılan-Menü için Kaynak Oluşturmak

           

            Bağlama menüsünü oluşturmak için Developer Studio kaynak editörünü kullanın. Yeni menü kaynağını yaratmak için şu tekniklerden birini kullanın:

 

·        Insert menüsünden Resource komutunu seçip Insert Resource iletişim kutusundan Menu’yü seçin.

 

·        ResourceView görünümünde menü klasörüne farenin sağ tuşuyla tıklayın ve açılan-menüden Insert Menu komutunu seçin.

 

            Bu yöntemlerin ikisi de yeni bir menü kaynağı açar. Menü çubuğundaki ilk üst seviyeli maddenin başlığı olarak tek bir boşluk ekleyin. Bu başlık menüde gözük­mez, yalnızca tanımlama amacıyla kullanılır.

 

            Menü kaynağının kenarına farenin sağ tuşuyla tıklayarak kaynağın Properties ileti­şim kutusunu açın ve kaynak ID’sini ID POPUP olarak değiştirin. Tablo 3.l’deki değerleri kullanarak boşluk etiketinin altına üç menü maddesi ekleyin.

 

            Tablo 3.1.  Id_Popup Menü Kaynağına Eklenen Menü Maddeleri

   

                        Menü ID                                            Başlık

                        ID_LIONS                                         &Lions

                        ID_TIGERS                                       &Tigers

                        ID_BEARS                                       &Bears

 

            Mesaj-Yönetimi Fonksiyonları Eklemek

 

            Uygulama içinde farenin sağ tuşuna tıklandığında yeni bağlam menüsü görüntüle­necektir. CMenuView sınıfına iki yeni değişken eklemeniz gerekir: mesajı saklayan bir CString değişkeni ve açılan menünün konumunu saklayan bir CPoint değişkeni. Kod 3..2’de verilen kaynak kodu CMenuView sınıfında //Implementation açıkla­masının altına ekleyin.

 

            Kod  3.2.   CMenuView Sınıfının Yeni Üye Değişkenleri
 
            // Implementation

            protected:

       Cpoint m_ptMsg;

       CString m_szMsg;

 

            CMenuView sınıfının yapılandırıcısı m ptMsg değişkenine ilk değer vermelidir. MenuVieW.cpp dosyasındaki yapılandırıcıyı Kod 3.3’teki gibi değiştirin.

 

 

 

            Kod 3.3.   CMenuView Sınıfının Yap1ıandırıcısı

 

            CMenuVıew: :CmenuView()

            {

                    m_ptMSg = Cpoint(0,0);

            }

 

            CMenuView::OnDraW üye fonksiyonu CMouseTestView sınıfının On­Draw üye fonksiyonuna benzer. Her iki fonksiyon da belli bir noktada bir mesaj göstermek için TextOut fonksiyonunu kullanır. CMenuView::OnDraW fonksiyonu­nu Kod 3.4’teki gibi değiştirin. AppWizard’ın eklediği birkaç kod satırını çıkar­manız gerekir.

 

            Kod  3.4.  CMenuView::OnDraw Fonksiyonu

 

            void CMenuView :OnDraw(CDC* pDC)

        {          

                    pDC >Textout( m ptMsg.x, m_ptMsg.y, m_szMsg );

            }

 

            3.4  Mesajları Yakalama

 

            Daha önce sözü edildiği gibi menü seçim mesajları bir menü maddesi seçildiğinde uy­gulamanızın içinde yönlendirilirler. Her menü maddesi için bir mesaj-yönetimi fonksi­yonu eklemeniz gerekir; menü maddesinin her seçilişinde bu fonksiyon çalıştırılacaktır. Mesaj-yönetimi fonksiyonu eklemenin en kolay yolu ClassWizard’ı kullanmaktır.

 

CMenuView sınıfına dört yeni mesaj-yönetimi fonksiyonu eklemek için ClassWi­zard’ı kullanın. Bunlardan üçü yeni menü maddeleri için, biri de farenin sağ tuşu­na basıldığını sezmek için kullanılacaktır. Mesaj-yöne fonksiyonlarını eklemek için izlenen adımlar, mevcut bir menüyü değiştirirken önceden kullanılan adımlara benzer. Tek fark bu mesajların CMenuView sınıfı tarafından yönetilmesidir.

 

1.      Ctrl+W tuşlarına basarak veya bir kaynak kod penceresinde farenin sağ tu­şuyla tıklayıp menüden ClassWizard’ı seçerek ClassWizard’ı açın.

2.      Message Maps sekmesini seçin ve Class Name bileşik kutusundan mesajı yönetecek sınıfı (bu örnekte CMenuView sınıfını) seçin.

 

3.      Object ID liste kutusundan mesajı üretecek nesneyi seçin. Bu örnekte Tablo 3.2’deki değerlerden birini kullanın.

 

4.      Messages liste kutusundan bir mesaj seçin ve Add Function düğmesine tıklayın. Fonksiyon ismi için ClassWizard’ın önerdiği ismi kabul edin.

 

5.      Bu işlemleri Tablo 3.2’deki tüm maddeler için tekrarlayın.

 

6.      ClassWizard’ı kapatmak için OK düğmesine tıklayın.

 

 

 

            Tablo 3.2.   Mesaj-Yönetimi Fonksiyonları Yaratmak İçin Kullanılan

                                  Değerler

 

                       Nesne ID                   Mesaj                                    Fonksiyon

                        CmenuView              WM_CONTEXTMENU        OnContextMenu

                        ID_LIONS                  COMMAND                          OnLions

                       ID_TIGERS                COMMAND                          OnTigers

                        ID_BEARS                COMMAND                          OnBears

 

CMenuView::OnContextMenu mesaj-yönetimi fonksiyonunun kaynak kodu Kod 3.5’te verilmektedir.

 

            Kod 3.5.  Farenin Sağ Tuşuna Tıklandığında Bir Menü Açma

 

            void CMenuView::OnContextMenu(CWnd* pWnd, CPoint point)

            {

                    CMenu zooMenu;

                    //  Tıklanılan noktayı sakla ve

                     //  çizim fonksiyonları için özel koordinatlara dönüştür.

                     m_ptMsg = point;

                    ScreenToClient( &m_ptMsg );

                     zooMenu.LoadMenu( ID_POPUP );

                     CMenu* pPopup = zooMenu.GetSubMenu( 0 );

pPopup->TrackPOpUPMenu( TPM_LEFTALIGNITPM_RIGHTBUTTON,

point.x,

                        point.y,

                        this );

}

 

            Farenin sağ tuşuna tıklandığında uygulamaya WM_CONTEXTMENU mesajı gönderilir ve MFC yapısı OnContextMenu mesaj yöneticisini çağırır. OnContextMenu fonk­siyonu bir CMenu nesnesi yaratır ve ID_POPUP menü kaynağını yükler. GetSub­Menu ve TrackPopupMenu fonksiyonları çağrılarak kayan menü görüntülenir.

 

GetSubMenu fonksiyonu ID_POPUP menü kaynağının tepesindeki boş menü mad­desini atlamak için kullanılır. GetSubMenu fonksiyonu açilan menüye geçici bir işa­tetci döndürür. TrackPopupMenu fonksiyonunun çağrılinası açılan menünün gö­rüntülenmesini ve menü maddesi seçiminin otomatik olarak fare imlecini izleme­sini sağlar. CMenuView sınıfına gönderilen menü seçim mesajlarını yönetmek için kullanılan kaynak kod Kod 3.6’da verilmektedir.

 

            Kod 3.6.   Kayan Menü Maddeleri İçin Mesaj-Yönetimi Fonksiyonları

 

            void CMenuView::OnLions ( )

            {

                    mszMsg = “Lions are out”;

                    InvalidateRect( NULL );

            }

            void CMenuView::OnTigers()

            {

      

Yorumlar (0)add comment

Yorum Yazın
quote
bold
italicize
underline
strike
url
image
quote
quote
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley

busy
 
< Önceki   Sonraki >