Aracılığıyla paylaş


TN021: Komut ve ileti yönlendirme

[!NOT]

İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.

Not Bu komut Yönlendirme ve gönderim mimarisi yanı sıra genel penceresinde ileti yönlendirme, gelişmiş konular açıklanmaktadır.

Lütfen Visual C++ için burada açıklanan mimarileri hakkında genel bilgi için özellikle Windows ileti denetimi bildirimleri ve komutları arasında ayrım bakın.Bu not, yazdırılan belgelerde açıklanan sorunlar konusunda bilgili ve yalnızca çok ileri düzey konular ele varsayar.

Komut Yönlendirme ve gönderim mfc 1.0 işlevlerini geliştikçe mfc 2.0 mimarisi

Windows sahip wm_command , menü komutlarını, kısayol tuşları ve iletişim denetimi bildirimleri bildirimleri aşırı ileti.

mfc 1.0 kurulu, üzerinde biraz komut işleyicisinden (örneğin, "OnFileNew") vererek bir CWnd türetilmiş sınıf adlı belirli bir yanıt için wm_command.Bu durum, ileti eşleme adı verilen bir veri yapısı ile birlikte yapışmış ve bir çok alanı verimli komut düzeneği olur.

mfc 1.0 denetimi bildirimleri komut iletilerden ayırmak için ek işlevler de sağladı.Bazen bir komutu kimliği bilinen bir 16-bit kimliği komutları gösterilirKomutları normal olarak Başlat bir CFrameWnd (menü seçin veya çevrilmiş bir Hızlandırıcı) ve çeşitli diğer windows.

Çok belgeli arabirim (MDI) uygulaması için sınırlı bir algılama komut yönlendirme mfc 1.0 kullanılır.(MDI çerçevesi pencere temsilci, etkin bir MDI alt penceresi komutları.)

Bu işlevsellik Genelleştirilmiş ve mfc 2.0 daha geniş nesneleri (yalnızca pencere nesneleri) tarafından işlenecek komutlarına izin uzatılmış.Daha fazla resmi sağlar ve Genişletilebilir mimari Yönlendirme iletilerini ve sadece komutları işlemek için aynı zamanda bir komutun geçerli kullanılabilirliklerini yansıtacak şekilde (menü öğeleri ve araç çubuğu düğmeleri gibi) kullanıcı Arabirimi nesneleri güncelleştirmek için yönlendirme komutu hedef kullanır.

Komut Kimliği

Visual C++ yönlendirme ve bağlama işlemi komut açıklaması için bkz.Teknik Not 20 adlandırma kimliği hakkında bilgi içerir.

"ID_" Genel öneki için komut kimliklerini kullanıyoruz.Komut kimliklerin > = 0x8000.Mesaj hattı veya durum çubuğundaki komut açıklama dizesini komut kimliği ile aynı kimliklerle STRINGTABLE kaynak olup olmadığını gösterir

Uygulamanızın kaynaklarında kimliği için bir komut çeşitli konumlarda görüntülenir:

  • İleti satırı istemi olarak aynı Kimliğe sahip bir STRINGTABLE kaynağı.

  • Aynı komutu gerektiğinde harekete menü öğelerine bağlı büyük olasılıkla birçok menü kaynaklarında.

  • İletişim düğmesinin gosub komut için (Gelişmiş).

Uygulamanızın kaynak kodunun kimliği için bir komut çeşitli konumlarda görüntülenir:

  • KAYNAĞINIZ.H (veya diğer ana sembol üstbilgi dosyası) uygulamaya özgü komut kimliklerini tanımlamak için.

  • Bir araç çubuğu oluşturmak için kullanılan BELKİ bir kimliği dizide.

  • İçinde bir on_command makro.

  • BELKİ de bir ON_UPDATE_COMMAND_UI makro.

Şu anda, yalnızca komut kimliklerini gerektirir mfc uygulamasında olması > = 0x8000 gosub iletişim kutuları/komutları uygulaması değil.

İletişim kutuları, komut mimarisini kullanarak gosub komutları

Yönlendirme ve etkinleştirme komutları komut mimarisini çerçeve pencereler, menü öğeleri, araç çubuğu düğmeleri, iletişim çubuğu düğmelerini, diğer Denetim çubuklarından ve isteğe bağlı ve rota komutları güncelleştirme veya ana komut hedef (genellikle ana çerçeve penceresi) kimliklerini denetlemek için tasarlanan diğer kullanıcı arabirimi öğeleri ile çalışır.Bu komut ana hedef uygun olarak diğer komut hedef nesnelere komut veya denetim bildirimleri yol.

Uygun komutu kimliği iletişim denetimi denetim kimliği atarsanız, bir iletişim kutusu (kalıcı veya geçici) komutu mimari özelliklerinden bazıları yararlanabilirsinizİletişim kutuları için destek, otomatik değil bazı ek kod yazmak zorunda kalabilirsiniz.

Düzgün çalışması tüm bu özellikler için komutu kimliklerinizi olması gerektiğini unutmayın > = 0x8000.Birçok iletişim kutuları aynı kareye yönlendirilen beri paylaşılan komutları olmalıdır > = 0x8000, belirli bir iletişim paylaşılmayan IDCs olması gereken sırada < = 0x7FFF.

Normal düğme normal kalıcı bir iletişim kutusu ile IDC uygun komutu kimliğini Ayarla düğmesinin yerleştirebilirsinizKullanıcı düğmeyi seçtiğinizde iletişim (genellikle ana çerçeve penceresi) sahibi olduğu gibi diğer komut komut alır.Genellikle (ilk iletişim gosub) başka bir iletişim kutusunu görüntülemek için kullanılır, çünkü bu gosub komut verilir.

İşlev çağrısı CWnd::UpdateDialogControls , iletişim ve adres ana kare pencere geçişi.Bu işlevi etkinleştirmek veya komut işleyicileri çerçevede olup temel iletişim denetimleri devre dışı.Bu işlev otomatik olarak sizin için uygulamanızın işlevsiz döngü denetimi Çubuklar için adlandırılır, ancak bu özelliğe sahip olmasını istediğiniz doğrudan normal için iletişim kutuları çağırması gerekir.

Ne zaman ON_UPDATE_COMMAND_UI olarak da bilinir

Her zaman bir programın tüm menü öğelerini etkin ve teslim durumunu korumak için çok fazla sorun olabilir.Bir ortak kullanıcı açılan seçtiğinde menü öğeleri etkinleştir/onay için tekniğidir.mfc 2.0 uygulaması CFrameWnd işleme WM_INITMENUPOPUP iletisi ve menülerde durumlarını belirlemek için komut yönlendirme mimarisini kullanan ON_UPDATE_COMMAND_UI işleyicileri.

CFrameWnd de işler WM_ENTERIDLE durum çubuğunda (ileti satırı olarak da bilinir) öğesi seçili geçerli menü açıklayan ileti.

Visual C++ tarafından düzenlenen bir uygulamanın menü yapısı adreste olası komutları göstermek için kullanılan WM_INITMENUPOPUP zaman.ON_UPDATE_COMMAND_UI işleyicileri durumu veya bir menü metnini değiştirebilirsiniz veya Gelişmiş kullanır (örneğin, Dosya mru Listesi veya ole Fiiller açılır menüsünden) gerçekten değiştirmek için önce menü yapısı menüsü çizilir.

Aynı sıralama ON_UPDATE_COMMAND_UI araç çubukları (ve diğer Denetim çubuklarından) işlem yapılır, işlevsiz döngü girdiğinde uygulama.Bakın Sınıf kitaplığı başvuru ve Teknik Not 31 denetim çubuğu hakkında daha fazla bilgi için.

İç içe açılır menüler

İç içe menü yapısı kullanıyorsanız, göreceksiniz ON_UPDATE_COMMAND_UI işleyicisi ilk menü öğesinin açılır menüsünde iki durumda verilir.

İlk olarak, Açılır menünün kendisi denir.Açılır menüler kimlikleri yoktur ve tüm menüye başvurmak için Açılır menünün ilk menü öğesinin kimliği kullanıyoruz çünkü bu işlem gereklidir.Bu durumda, m_pSubMenu üye değişkeni CCmdUI nesnesi null olmayan olacak ve açılır menüsünde.

İkinci olarak, yalnızca açılır menüde menü öğeleri çizilmesi önce denir.Bu durumda, yalnızca ilk menü öğesi kimliği başvurur ve m_pSubMenu üye değişkeni CCmdUI nesnesi null olacaktır.

Bu açılır menüyü kendi menü öğeleri ayrı olanak sağlar, ancak bazı menü uyumlu kod yazma gerektirir.Örneğin, bir iç içe menüsü aşağıdaki yapıya sahip:

File>
    New>
        Sheet (ID_NEW_SHEET)
        Chart (ID_NEW_CHART)

ID_NEW_SHEET ve ID_NEW_CHART komutları bağımsız olarak etkinleştirilmiş veya devre dışı.Yeni açılır menü etkinleştirildiğini ya da iki etkinleştirilirse.

ID_NEW_SHEET (açılır pencere içindeki ilk komut) komut işleyici aşağıdaki gibi görünecektir:

void CMyApp::OnUpdateNewSheet(CCmdUI* pCmdUI)
{
    if (pCmdUI->m_pSubMenu != NULL)
    {
        // enable entire pop-up for "New" sheet and chart
        BOOL bEnable = m_bCanCreateSheet || m_bCanCreateChart;

        // CCmdUI::Enable is a no-op for this case, so we
        //   must do what it would have done.
        pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
            MF_BYPOSITION | 
                (bEnable ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
        return;
    }
    // otherwise just the New Sheet command
    pCmdUI->Enable(m_bCanCreateSheet);
}

Komut işleyici için ID_NEW_CHART, normal güncelleştirme komut işleyici ve görünüm gibi bir şey olacaktır:

void CMyApp::OnUpdateNewChart(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(m_bCanCreateChart);
}

on_command ve ON_BN_CLICKED

İleti eşleme makrolar için on_command ve ON_BN_CLICKED aynıdır.mfc komut ve Denetim bildirim yönlendirme mekanizması yalnızca komut kimliği yönlendirmek nerede karar vermek için kullanır.Kontrol Denetim bildirim kodu ile sıfır bildirimleri (BN_CLICKED) komutları yorumlanır.

[!NOT]

Aslında, tüm denetim bildirim iletilerini komut işleyicisi zinciri gidin.Örneğin, bir denetim bildirim işleyicisi yazmak için teknik olarak mümkün en_change belge sınıfınızın içinde.Bu, bu özelliğin pratik uygulamalar birkaç özellik ClassWizard tarafından desteklenmez ve özelliğinin kullanımı kırılacak koduna sonuçlanabilir genellikle tavsiye değildir.

Otomatik devre dışı düğmesini denetimleri devre dışı bırakma

Bir button denetimi iletişim çubuğunda koyun ya da nerede kullanarak iletişim kutusunda, aradığınız CWnd::UpdateDialogControls kendi kendinize, size, yoksa bu düğmeler göreceksiniz on_command veya ON_UPDATE_COMMAND_UI işleyicileri otomatik olarak bırakılır, çerçevesi tarafından.Bazı durumlarda bir işleyici olması gerekmez, ancak düğmesi etkin kalmasını istersiniz.Bunu yapmanın en kolay yolu kukla komut işleyici (ClassWizard ile yapmak kolay) eklemektir ve bunun bir şey yapın.

İleti penceresinde yönlendirme

Aşağıdaki mfc sınıfları ve bunları nasıl Windows ileti yönlendirme ve diğer konuları etkiler daha gelişmiş olan bazı konuları açıklar.Burada yer alan bilgiler yalnızca kısaca açıklanmıştır.Bakın Sınıf kitaplığı başvuru ortak API hakkında ayrıntılı bilgi için.mfc kitaplık kaynak kodunu uygulama ayrıntıları hakkında daha fazla bilgi için bakın.

Bakın Teknik Not 17 Ayrıntıları penceresini temizleme, çok önemli bir konuyu tüm CWnd-türetilmiş sınıfları.

CWnd sorunları

Uygulama üye işlev CWnd::OnChildNotify kanca veya aksi halde iletiler, komutları ve kendi üst (veya "sahip") gider denetimi bildirimleri bilgilendirilmek alt pencereler (denetimleri olarak da bilinir) için güçlü ve Genişletilebilir bir mimari sağlar.Alt pencere (/ kontrol) bir C++ ise CWnd sanal işlevi kendisini nesne OnChildNotify parametrelerle özgün iletinin ilk olarak adlandırılan (yani, bir msg yapısı).Alt pencereyi ileti dokunmayın, yemek veya üst (nadir) iletisini değiştirme.

Varsayılan CWnd uygulaması aşağıdaki iletileri işleme ve kullanan OnChildNotify hook alt windows (denetimleri) iletiye ilk erişim için izin vermek için:

  • WM_MEASUREITEM ve WM_DRAWITEM (için self-draw)

  • WM_COMPAREITEM ve WM_DELETEITEM (için self-draw)

  • wm_hscroll ve wm_vscroll

  • WM_CTLCOLOR

  • WM_PARENTNOTIFY

Fark edersiniz OnChildNotify hook self-draw iletilere sahip çizim iletilerini değiştirmek için kullanılır.

Ek olarak OnChildNotify hook, kaydırma iletileriniz davranışını daha ayrıntılı yönlendirme.Lütfen aşağıya kaydırma çubuklarını ve kaynakları hakkında daha fazla bilgi için bakın wm_hscroll ve wm_vscroll iletileri.

CFrameWnd sorunları

CFrameWnd sınıfı sağlar komut Yönlendirme ve kullanıcı arabiriminin çoğu uygulama güncelleştiriliyor.Bu uygulamanın ana çerçeve penceresi için öncelikle kullanılır (CWinApp::m_pMainWnd) ancak tüm çerçeve pencereler için geçerlidir.

Ana kare pencere pencere menü çubuğu ve durum çubuğunun üst veya satır.Komut yönlendirme yukarıdaki tartışma başvurun ve WM_INITMENUPOPUP.

CFrameWnd sınıf yönetimi etkin görünüm sağlar.Aşağıdaki iletileri etkin görünüm yönlendirilir:

  • Tüm komut iletileri (ilk erişim sağlaması etkin görünüm alır).

  • wm_hscroll ve wm_vscroll kardeş iletilerden kaydırma çubukları (aşağıya bakın).

  • WM_ACTIVATE (ve WM_MDIACTIVATE için MDI) sanal işlev çağrılarının içine açık CView::OnActivateView.

CMDIFrameWnd/CMDIChildWnd sorunları

Hem MDI çerçevesi pencere sınıflarına öğesinden türetilmeli CFrameWnd ve bu nedenle her ikisi de aynı sıralama komut yönlendirme etkinleştirilir ve kullanıcı arabirimi güncelleştiriliyor sağlanan CFrameWnd.Tipik bir MDI uygulamasının ana çerçeve penceresi (yani, CMDIFrameWnd nesne) menü çubuğunu ve durum çubuğunu tutan ve bu nedenle ana komut yönlendirme uygulaması kaynağıdır.

Genel Yönlendirme etkin bir MDI alt penceresi ilk komutlara erişim alır tanımlanmıştır.Varsayılan PreTranslateMessage işlevleri hem MDI alt pencereleri için Hızlandırıcı tabloları (ilk) işlemek ve MDI çerçevesi (ikinci) yanı sıra standart MDI sistem komutu Hızlandırıcılar tarafından normal olarak ele TranslateMDISysAccel (son).

Kaydırma çubuğu sorunları

Kaydırma iletiyi işlerken (wm_hscroll/OnHScroll ve/veya wm_vscroll/OnVScroll), burada kaydırma çubuğu iletisini geldiği dayanmaz böylece işleyicisini kod yazmak denemelisiniz.Kaydırma iletilerini doğru kaydırma çubuğu denetimleri veya'den gelen gelebilir bu yana bu yalnızca bir genel Windows sorun değil ws_hscroll/ws_vscroll kaydırma çubukları, kaydırma çubuğu denetimleri değildir.

mfc genişleten bağımlı ya da eşi kaydırılan pencerenin kaydırma çubuğu denetimleri için izin vermek için (aslında, kaydırma çubuğu ve pencere kaydırılan alt üst ilişkisi herhangi bir şey olabilir).Splitter pencereleri paylaşılan kaydırma çubuklarıyla bu özellikle önemlidir.Bakın Teknik Not 29 uygulaması hakkında ayrıntılı bilgi için CSplitterWnd paylaşılan kaydırma çubuğu sorunları hakkında daha fazla bilgi de dahil olmak üzere.

Yan notu vardır iki CWnd türetilmiş sınıfları burada belirtilebilir kaydırma çubuğu stilleri oluşturmak zaman yakalanan ve Windows geçmedi.Oluşturma yordamına geçilen, ws_hscroll ve ws_vscroll bağımsız olarak ayarlanabilir, ancak oluşturma değiştikten sonra.Kuşkusuz, doğrudan test veya gerekir ayarlamak ws_?Oluşturdukları pencerenin kaydırma stili biti.

İçin CMDIFrameWnd kaydırma çubuğu stilleri için ilettiğiniz Create veya LoadFrame MDICLIENT oluşturmak için kullanılır.Ayarladığınızdan emin olun bir kaydırılabilir MDICLIENT alanı (gibi Windows Program Yöneticisi) isterseniz hem de kaydırma stilleri (ws_hscroll | ws_vscroll) oluşturmak için kullanılan stil CMDIFrameWnd.

İçin CSplitterWnd bölme bölgeleri için özel paylaşılan kaydırma çubuklarını kaydırma çubuğu stilleri uygulamak.Statik Bölümlendirici windows için ya da kaydırma çubuğu stilini ayarlar normal değil.Dinamik splitter pencereleri için kaydırma çubuğu stil kümesi böldüğünüz, yani yön için genellikle olur ws_hscroll satırları ayırırsanız ws_vscroll , sütunlara bölebilirsiniz.

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar