Aracılığıyla paylaş


MFC ActiveX Denetimleri: Bir Windows Denetimini Alt Sınıf Yapma

Bu makalede, ActiveX denetimi oluşturmak için ortak bir Windows denetimini alt sınıflama işlemi açıklanmaktadır. Mevcut bir Windows denetimini alt sınıfa almak, ActiveX denetimi geliştirmenin hızlı bir yoludur. Yeni denetim, alt sınıf Windows denetiminin boyama ve fare tıklamalarına yanıt verme gibi özelliklerine sahip olacaktır. MFC ActiveX denetimleri örnek BUTTON , Windows denetimini alt sınıflama örneğidir.

Önemli

ActiveX, yeni geliştirme için kullanılmaması gereken eski bir teknolojidir. ActiveX'in yerine geçen modern teknolojiler hakkında daha fazla bilgi için bkz . ActiveX Denetimleri.

Bir Windows denetimini alt sınıfa almak için aşağıdaki görevleri tamamlayın:

IsSubclassedControl ve PreCreateWindow'u Geçersiz Kılma

ve IsSubclassedControlöğesini geçersiz kılmak PreCreateWindow için, denetim sınıfı bildiriminin protected bölümüne aşağıdaki kod satırlarını ekleyin:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();

Denetim uygulama dosyasında (. CPP), geçersiz kılınan iki işlevi uygulamak için aşağıdaki kod satırlarını ekleyin:

// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx

BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
   cs.lpszClass = _T("BUTTON");
   return COleControl::PreCreateWindow(cs);
}

// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control

BOOL CMyAxSubCtrl::IsSubclassedControl()
{
   return TRUE;
}

Bu örnekte, Windows düğmesi denetiminin içinde PreCreateWindowbelirtildiğine dikkat edin. Ancak, tüm standart Windows denetimleri alt sınıflandırılabilir. Standart Windows denetimleri hakkında daha fazla bilgi için bkz . Denetimler.

Windows denetimini alt sınıflarken, denetimin penceresini oluştururken kullanılacak belirli pencere stilini (WS_) veya genişletilmiş pencere stili (WS_EX_) bayraklarını belirtmek isteyebilirsiniz. ve cs.dwExStyle yapı alanlarını değiştirerek cs.style üye işlevinde PreCreateWindow bu parametreler için değerler ayarlayabilirsiniz. Sınıfına COleControlgöre ayarlanan varsayılan bayrakları korumak için, bu alanlarda yapılan değişiklikler VEYA işlemi kullanılarak yapılmalıdır. Örneğin, denetim BUTTON denetiminin alt sınıfını uyguluyorsa ve denetimin onay kutusu olarak görünmesini istiyorsanız, return deyiminden önce uygulamasına CSampleCtrl::PreCreateWindowaşağıdaki kod satırını ekleyin:

cs.style |= BS_CHECKBOX;

Bu işlem, sınıfın COleControl varsayılan stil bayrağını (WS_CHILD) olduğu gibi bırakırken BS_CHECKBOX stil bayrağını ekler.

OnDraw Üye İşlevini Değiştirme

Alt sınıf denetiminizin ilgili Windows denetimiyle aynı görünümü korumasını istiyorsanız, denetimin OnDraw üye işlevi aşağıdaki örnekte olduğu gibi yalnızca üye işlevine DoSuperclassPaint yönelik bir çağrı içermelidir:

void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   DoSuperclassPaint(pdc, rcBounds);
}

DoSuperclassPaint tarafından COleControluygulanan üye işlevi, windows denetiminin pencere yordamını kullanarak denetimi sınırlayıcı dikdörtgenin içinde belirtilen cihaz bağlamında çizer. Bu, etkin olmasa bile denetimi görünür hale getirir.

Dekont

DoSuperclassPaint Üye işlevi yalnızca cihaz bağlamının bir WM_PAINT iletisinin wParam değeri olarak geçirilmesine izin veren denetim türleriyle çalışır. Bu, SCROLLBAR ve BUTTON gibi bazı standart Windows denetimlerini ve tüm yaygın denetimleri içerir. Bu davranışı desteklemeyen denetimler için, etkin olmayan bir denetimi düzgün şekilde görüntülemek için kendi kodunuzu sağlamanız gerekir.

Düşünceler Pencere İletilerini İşleme

Windows denetimleri genellikle belirli pencere iletilerini üst penceresine gönderir. WM_COMMAND gibi bu iletilerden bazıları, kullanıcı tarafından bir eylem bildirimi sağlar. Üst pencereden bilgi almak için WM_CTLCOLOR gibi diğerleri kullanılır. ActiveX denetimi genellikle üst pencereyle başka yollarla iletişim kurar. Bildirimler olaylar tetiklenerek (olay bildirimleri gönderilerek) iletilir ve kapsayıcının ortam özelliklerine erişilerek denetim kapsayıcısı hakkındaki bilgiler elde edilir. Bu iletişim teknikleri mevcut olduğundan, ActiveX denetim kapsayıcılarının denetim tarafından gönderilen pencere iletilerini işlemesi beklenmez.

Kapsayıcının alt sınıf bir Windows denetimi tarafından gönderilen pencere iletilerini almasını önlemek için, COleControl denetimin üst öğesi olarak hizmet vermek için ek bir pencere oluşturur. "Yansıtıcı" olarak adlandırılan bu ek pencere, yalnızca windows denetimini alt sınıfa alan ve denetim penceresiyle aynı boyuta ve konuma sahip bir ActiveX denetimi için oluşturulur. Yansıtıcı penceresi belirli pencere iletilerini durdurur ve denetime geri gönderir. Denetim, pencere yordamında bir ActiveX denetimine uygun eylemler gerçekleştirerek (örneğin, bir olay tetikleyerek) bu yansıtılan iletileri işleyebilir. Kesişen Windows iletilerinin ve karşılık gelen yansıtılmış iletilerin listesi için bkz. Düşünceler Pencere İletisi Kimlikleri.

ActiveX denetim kapsayıcısı, ileti yansımasını gerçekleştirecek şekilde tasarlanabilir ve yansıtıcı penceresi oluşturma gereksinimi COleControl ortadan kaldırılabilir ve alt sınıf bir Windows denetimi için çalışma süresi ek yükü azaltılabilir. COleControltrue değerine sahip message Düşünceler ambient özelliğini denetleyerek kapsayıcının bu özelliği destekleyip desteklemediğini algılar.

Yansıtılmış bir pencere iletisini işlemek için, denetim iletisi eşlemesine bir giriş ekleyin ve bir işleyici işlevi uygulayın. Yansıtılan iletiler Windows tarafından tanımlanan standart ileti kümesinin parçası olmadığından, Sınıf Görünümü bu tür ileti işleyicilerinin eklenmesini desteklemez. Ancak, işleyiciyi el ile eklemek zor değildir.

Yansıtılmış pencere iletisi için el ile ileti işleyicisi eklemek için aşağıdakileri yapın:

  • denetim sınıfında. H dosyası, bir işleyici işlevi bildirin. İşlev, sırasıyla WPARAM ve LPARAM türlerine sahip bir LRESULT dönüş türüne ve iki parametreye sahip olmalıdır. Örnek:

    class CMyAxSubCtrl : public COleControl
    {
    
    protected:
       LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam);
    };
    
  • denetim sınıfında. CPP dosyası, ileti eşlemesine bir ON_MESSAGE girdisi ekleyin. Bu girdinin parametreleri ileti tanımlayıcısı ve işleyici işlevinin adı olmalıdır. Örnek:

    BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl)
       ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand)
    END_MESSAGE_MAP()
    
  • Ayrıca içinde. CPP dosyası, yansıtılan iletiyi işlemek için üye işlevini uygulayın OnOcmCommand . wParam ve lParam parametreleri, özgün pencere iletisinin parametreleriyle aynıdır.

Yansıtılan iletilerin nasıl işlendiğine ilişkin bir örnek için MFC ActiveX denetimleri örnek BUTTON bölümüne bakın. BN_CLICKED bildirim kodunu algılayan ve bir olayı tetikleyerek (göndererek) yanıt veren bir Click işleyici gösterirOnOcmCommand.

Ayrıca bkz.

MFC ActiveX Denetimleri