| MENÜLER |
|
|
|
| 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ştirilebilecek 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 yaratmak 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 genelde 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ızdaki 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 fazladan 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ğini 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ındadı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 ikinci 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 özelliklerini 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 belirlemesi 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ümlere ayıran yatay bir çizgi olduğunu gösterir. Bu onay kutusu normalde işaretli değildir.
· Checked menü maddesinin seçili olduğunu belirtmek için yanında bir onay işareti 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 fonksiyonları 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ü maddelerini eklemek için bu temel adımlar kullanılır. Developer Studio araçları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şlemlerin 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ükmez, 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ülenecektir. 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çıklamasının altına ekleyin.
Kod 3.2. CMenuView Sınıfının Yeni Üye Değişkenleri// Implementationprotected: 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 OnDraw üye fonksiyonuna benzer. Her iki fonksiyon da belli bir noktada bir mesaj göstermek için TextOut fonksiyonunu kullanır. CMenuView::OnDraW fonksiyonunu Kod 3.4’teki gibi değiştirin. AppWizard’ın eklediği birkaç kod satırını çıkarmanı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 uygulamanızın içinde yönlendirilirler. Her menü maddesi için bir mesaj-yönetimi fonksiyonu 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 ClassWizard’ı kullanın. Bunlardan üçü yeni menü maddeleri için, biri de farenin sağ tuşuna 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ılanDeğ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 fonksiyonu bir CMenu nesnesi yaratır ve ID_POPUP menü kaynağını yükler. GetSubMenu ve TrackPopupMenu fonksiyonları çağrılarak kayan menü görüntülenir.
GetSubMenu fonksiyonu ID_POPUP menü kaynağının tepesindeki boş menü maddesini atlamak için kullanılır. GetSubMenu fonksiyonu açilan menüye geçici bir işatetci 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 izlemesini 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() {
|
|||||||
| < Önceki | Sonraki > |
|---|














