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:
COleControl'ün IsSubclassedControl ve PreCreateWindow üye işlevlerini geçersiz kılma
Denetime yansıtılan tüm ActiveX denetim iletilerini (OCM) işleme
Dekont
Denetim Ayarlar sayfasındaki Üst Pencere Sınıfı Seç açılan listesini kullanarak alt sınıflanacak denetimi seçerseniz, bu işin büyük bir kısmı ActiveX Denetim Sihirbazı tarafından sizin için yapılır.
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 PreCreateWindow
belirtildiğ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 COleControl
gö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::PreCreateWindow
aş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 COleControl
uygulanan ü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. COleControl
true 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
.