TN062: Mesaj yansıması için Windows denetimleri

Bu teknik not iletisi yansıması, mfc 4.0 yeni bir özelliği açıklanmaktadır. Ayrıca ileti yansıma kullanan basit bir yeniden kullanılabilir denetimi oluşturma yönergeleri içerir.

(Eski adıyla: ole Denetimleri) ActiveX denetimleri için geçerli olarak bu teknik not iletisi yansıma anlatılmamaktadır. Lütfen makalesine bakın ActiveX denetimleri: Windows Denetim sınıflara Visual c++ Programcı Kılavuzu.

İleti yansıma nedir?

Windows denetimleri, sık sık kendi ana windows bildirim iletileri gönderin. Örneğin, birçok denetim üst üst denetimin arka plan boyama için bir fırça sağlamak izin vermek için (wm_ctlcolor veya türevlerinden biri) denetim renk bildirim iletisi gönderme.

Ana pencere, genellikle bir iletişim kutusu, Windows ve mfc sürüm 4.0 kala, bu iletileri işlemek için sorumludur. Bu ileti işleme kodu ana pencere sınıfı olması gerekiyor ve bu iletiyi işlemek için gereken her sınıfta çoğaltılacak olduğunu anlamına gelir. Yukarıdaki durumda, her iletişim kutusu denetimleri ile özel arka planlar istediği denetim renk bildirim iletisini işlemek gerekir. Denetim sınıfı, kendi arka plan rengi ele yazılabilir kodunu yeniden çok daha kolay olurdu.

Mfc 4. 0 ' eski mekanizması çalışır — ana windows bildirim iletilerini işleyebilir. Buna ek olarak, ancak, mfc 4.0 yeniden "ileti yansıması" olarak adlandırılan bir özellik sunarak kolaylaştıran alt denetimin pencere ya da üst pencere veya her ikisi de ele alınması bu bildirim iletileri sağlar. Denetimin arka plan rengi örnek, sen-ebilmek şimdi yazmak yansıyan wm_ctlcolor ileti işleme göre kendi arka plan rengini ayarlar denetim sınıfı — üst güvenerek olmadan. (İleti yansıma mfc tarafından uygulanan beri Windows tarafından Ana pencere sınıfı çalışmak için CWnd mesaj yansıması türetilmelidir değil olduğunu unutmayın.)

Mfc eski sürümleri ileti yansıması için benzer bir şey birkaç iletileri, iletilerin sahibi çizilmiş liste kutuları (WM_DRAWITEMvb.) gibi sanal işlevler sağlayarak yaptım. Genelleştirilmiş ve tutarlı yeni ileti yansıma mekanizması.

İleti yansıma MFC'ün 4.0 için önceki sürümleri için yazılmış kod ile geriye doğru uyumlu.

Sen don't call temel sınıf eylemcisini kendi işleyicinizi sağlanan belirli bir ileti için bir işleyici sağladığınız ya da bu iletileri, ana pencere sınıfı, bir dizi için geçersiz kılar aynı ileti için ileti işleyicileri yansıtıyordu. İletişim kutusunda sınıf wm_ctlcolor idare, örneğin, işleme herhangi bir yansıyan ileti işleyicileri kılar.

Ana pencere sınıf, belirli bir WM_NOTIFY mesaj veya WM_NOTIFY mesajlar bir dizi için bir işleyici sağlarsanız yalnızca bu iletileri gönderen alt denetim yansıyan ileti işleyicisi aracılığıyla ON_NOTIFY_REFLECT()yoksa işleyicinizin adını alır. İleti Haritanız ON_NOTIFY_REFLECT_EX() kullanırsanız, ileti işleyicisi olabilir veya iletiyi işlemek üst pencere izin vermeyebilir. İşleyici truedöndürürse, ileti üst tarafından da, yanlış ele üst izin vermez döndüren bir çağrı sırasında ele alınacaktır. Not yansıyan ileti bildirim iletisi önce işlenir.

WM_NOTIFY ileti gönderildiğinde, denetimi ele ilk şansı sunulur. Yansıyan başka bir ileti gönderilirse, ana penceresi bunu işlemek için ilk şansı ve denetim yansıyan mesajı alacaksınız. Bunu yapmak için bir işleyici işlevi ve Denetim sınıfı iletisi göster uygun bir giriş gerekir.

Yansıyan iletileri için ileti göster makro düzenli bildirimler için biraz farklıdır: her zamanki gibi kendi adına eklenen _reflect vardır. Örneğin, üst WM_NOTIFY ileti işlemek için ebeveynin iletisi göster ON_NOTIFY makrosunda kullanın. Alt denetim yansıyan iletiyi işlemek için ON_NOTIFY_REFLECT Makro alt denetim iletisi Haritayı kullanın. Bazı durumlarda, parametreleri de farklı. ClassWizard genellikle sizin için mesaj-eşleme girdilerini ekleyebilir ve iskelet işlevi uygulamaları doğru parametrelerle sağlamak olduğunu unutmayın.

Bkz: TN061: ON_NOTIFY ve WM_NOTIFY haber bilgi WM_NOTIFY mesaj.

Mesaj-eşleme girdilerini ve işleyici işlevi Prototipler yansıyan iletileri

Yansıyan denetim bildirim iletisi işlemek için iletiyi göster makroları ve fonksiyon prototipleri aşağıdaki tabloda listelenen kullanın.

ClassWizard genellikle sizin için bu mesaj-eşleme girdilerini ekleyebilir ve iskelet işlevi uygulamaları sağlamak. Bkz: yansıyan bir ileti için ileti işleyicisi tanımlama için işleyicileri tanımlama hakkında bilgi için Visual c++ programlama Kılavuzu yansıyan mesajları.

Yansıyan makro adı ileti adı dönüştürmek için on_ başına ve _reflectekleyin. Örneğin, wm_ctlcolor , on_wm_ctlcolor_reflectolur. (Hangi iletilerin yansıması olabilir görmek için aşağıdaki tabloda makro girişleri ters dönüşüm yapmak.)

Yukarıdaki kural üç özel durumlar aşağıdaki gibidir:

Her yukarıdaki özel durumlarda, üye eylemcisini adını belirtmeniz gerekir. Diğer durumlarda, İşleyici işlevinizde adı kullanmanız gerekir.

Parametrelerin anlamları ve işlevleri dönüş değerleri işlevi veya işlev adı altında önüne Tarih ile belgelenmiştir. Örneğin, CtlColor , OnCtlColor' de belgelenmiştir. Birkaç yansıyan ileti işleyicileri benzer işleyicileri bir üst pencerede daha az parametre gerekir. Sadece aşağıdaki tabloda belgelerinde biçimsel parametre adları ile adlarıyla.

Eşleme girişi İşlev prototipi
on_control_reflect ( wNotifyCode, memberFxn ) afx_msg voidmemberFxn ( );
ON_NOTIFY_REFLECT ( wNotifyCode, memberFxn ) afx_msg voidmemberFxn(nmhdr * pNotifyStruct, lresult * sonuç );
ON_UPDATE_COMMAND_UI_REFLECT ( memberFxn ) afx_msg voidmemberFxn(CCmdUI * pCmdUI );
ON_WM_CTLCOLOR_REFLECT) afx_msg hbrush CtlColor (cdc * pDC, UINT nCtlColor );
ON_WM_DRAWITEM_REFLECT) afx_msg void DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct );
ON_WM_MEASUREITEM_REFLECT) afx_msg void MeasureItem (LPMEASUREITEMSTRUCT lpMeasureItemStruct );
ON_WM_DELETEITEM_REFLECT) afx_msg void DeleteItem (LPDELETEITEMSTRUCT lpDeleteItemStruct );
ON_WM_COMPAREITEM_REFLECT) afx_msg int CompareItem (LPCOMPAREITEMSTRUCT lpCompareItemStruct );
ON_WM_CHARTOITEM_REFLECT) afx_msg int CharToItem (UINT nKey, UINT nIndex );
ON_WM_VKEYTOITEM_REFLECT) afx_msg int VKeyToItem (UINT nKey, UINT nIndex );
ON_WM_HSCROLL_REFLECT) afx_msg void HScroll (UINT nSBCode, UINT nPos );
ON_WM_VSCROLL_REFLECT) afx_msg void VScroll (UINT nSBCode, UINT nPos );
ON_WM_PARENTNOTIFY_REFLECT) afx_msg void ParentNotify (UINT mesaj, lparam lParam );

ON_NOTIFY_REFLECT ve on_control_reflect makroları bir iletiyi işlemek için birden fazla nesne (örneğin, Denetim ve üst) izin çeşitleri var.

Eşleme girişi İşlev prototipi
ON_NOTIFY_REFLECT_EX ( wNotifyCode, memberFxn ) bool afx_msgmemberFxn(nmhdr * pNotifyStruct, lresult * sonuç );
on_control_reflect_ex ( wNotifyCode, memberFxn ) bool afx_msgmemberFxn ( );

İşleme Reflected iletileri: Yeniden denetim örnek

Yeniden denetim adı verilen bu basit bir örnek oluşturur CYellowEdit . Sarı bir arka plan üzerinde siyah metin görüntüler dışında denetim normal düzenleme denetimi ile aynı çalışır. Sağlayacak üye işlevler eklemek kolay olurdu CYellowEdit farklı renkleri görüntülemek için denetimi.

Bu örnek denemek için aşağıdaki adımları uygulayın.:

  1. Yeni iletişim kutusu varolan bir uygulama oluşturun. Daha fazla bilgi için bkz: iletişim kutusu Düzenleyicisi Visual c++ kullanım kılavuzu.

    Yeniden denetim geliştirmek için bir uygulama olması gerekir. Kullanmak için varolan bir uygulama yoksa, AppWizard kullanarak iletişim tabanlı bir uygulama oluşturma.

  2. Projenizi Visual c++ yüklenen adında yeni bir sınıf oluşturmak için ClassWizard kullanın CYellowEdit CEditdayalı. Kontrol "Bileşeni Galeriye Ekle" kutusunu bırakın.

  3. Üç üye değişkenler eklemek için CYellowEdit sınıfı. İlk iki metin rengini ve arka plan rengini basılı colorref değişkenleri olacaktır. Üçüncü bir CBrush nesnesi için arka plan boyama fırça tutulacağı olacaktır. CBrush nesnesi, bir kez, sadece daha sonra referans fırça oluşturmak ve fırça otomatik olarak ne zaman yok etmek sağlar CYellowEdit kontrol yok.

  4. Yapıcı şekilde yazarak üye değişkenlerini başlatmak:
    CYellowEdit::CYellowEdit()
    {
    m_clrText = rgb (0, 0, 0);
    m_clrBkgnd = rgb (255, 255, 0);
    m_brBkgnd.CreateSolidBrush (m_clrBkgnd);
    }
    
  5. ClassWizard,'ı kullanarak yansıyan wm_ctlcolor mesajı için bir işleyici ekleyin, CYellowEdit sınıfı. Not iletileri işlemek listesinde ileti adının önünde eşittir işareti iletiyi yansıtılır gösterir. Bu anlatılan Visual c++ programlama Kılavuzu yansıyan bir ileti için ileti işleyicisi tanımlama.

    ClassWizard makro ve iskelet aşağıdaki iletiyi göster işlevi için ekler:

    ON_WM_CTLCOLOR_REFLECT()
    
    / / Not: diğer kod arasında olacaktır....
    
    hbrush CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) {}
    / / todo: dc burada tüm niteliklerini değiştirmek
    
    / / todo: boş olmayan fırça döndürür
    / / ebeveynin işleyici değil denilen
    null döndürür;
    }
    
  6. İşlev gövdesinde aşağıdaki kodla değiştirin. Kod, metin rengi, metin rengi ve denetimi geri kalanı için arka plan rengini belirtir.
    pDC-gt;SetTextColor (m_clrText);    / / metin
    pDC - > SetBkColor (m_clrBkgnd);    / / metin bkgnd
    return m_brBkgnd;                / / ctl bkgnd
    
  7. İletişim kutusunda bir düzenleme denetimi oluşturun, sonra bunu kontrol tuşu basılı iken düzenleme denetimi çift tıklatarak bir üye değişken ekleyin. Üye değişken Ekle iletişim kutusunda, değişken adı bitirmek ve "Kontrol" Kategori, sonra "CYellowEdit" için değişken tipini seçin. Sekme sırasını ayarla iletişim kutusunda unutmayın. Ayrıca üstbilgi dosyası eklemeyi unutmayın CYellowEdit kontrolü, iletişim kutusunun üstbilgi dosyasında.

  8. Oluşturup uygulamanızı çalıştırın. Düzenleme denetimi sarı arka plana sahip olacaktır.

  9. Şimdi bileşen Galerisi eklemek için kullanabileceğiniz, CYellowEdit Denetim sınıfı diğer projeler.

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index