Özellik Sayfası Ekleme (ATL Eğitmeni, Bölüm 6)
Not
ATL OLE DB Sağlayıcısı sihirbazı Visual Studio 2019 ve sonraki sürümlerde kullanılamaz.
Özellik sayfaları, gerekirse paylaşılmalarını sağlayan ayrı COM nesneleri olarak uygulanır. Bu adımda, denetime bir özellik sayfası eklemek için aşağıdaki görevleri yapacaksınız:
Özellik Sayfası Kaynağı Oluşturma
Özellik Sayfası Oluşturmak ve Yönetmek için Kod Ekleme
Denetime Özellik Sayfası Ekleme
Özellik Sayfası Kaynağı Oluşturma
Denetiminize özellik sayfası eklemek için ATL Özellik Sayfası şablonunu kullanın.
Özellik Sayfası eklemek için
Çözüm Gezgini'da sağ tıklayın
Polygon
.Kısayol menüsünde Yeni Öğe Ekle'ye>tıklayın.
Şablon listesinden ATL ATL>Özellik Sayfası'nı seçin ve Ekle'ye tıklayın.
ATL Özellik Sayfası Sihirbazı görüntülendiğinde, Kısa ad olarak PolyProp girin.
Dizeler sayfasını açmak için Dizeler'e tıklayın ve Başlık olarak &Polygon yazın.
Özellik sayfasının Başlığı, bu sayfanın sekmesinde görüntülenen dizedir. Belge dizesi, bir özellik çerçevesinin durum satırına veya araç ipucuna koymak için kullandığı bir açıklamadır. Standart özellik çerçevesinin şu anda bu dizeyi kullanmadığını, bu nedenle varsayılan içerikle bırakabileceğinizi unutmayın. Şu anda bir Yardım dosyası oluşturmayacaksınız, bu nedenle bu metin kutusundaki girdiyi silin.
Son'a tıklar ve özellik sayfası nesnesi oluşturulur.
Aşağıdaki üç dosya oluşturulur:
Dosya | Açıklama |
---|---|
PolyProp.h | Özellik sayfasını uygulayan C++ sınıfını CPolyProp içerir. |
PolyProp.cpp | PolyProp.h dosyasını içerir. |
PolyProp.rgs | Özellik sayfası nesnesini kaydeden kayıt defteri betiği. |
Aşağıdaki kod değişiklikleri de yapılır:
Yeni özellik sayfası, Polygon.cpp nesne giriş eşlemesine eklenir.
PolyProp
sınıfı Polygon.idl dosyasına eklenir.Yeni kayıt defteri betik dosyası PolyProp.rgs proje kaynağına eklenir.
Özellik sayfasının proje kaynağına bir iletişim kutusu şablonu eklenir.
Belirttiğiniz özellik dizeleri kaynak dizesi tablosuna eklenir.
Şimdi özellik sayfasında görünmesini istediğiniz alanları ekleyin.
Özellik Sayfasına alan eklemek için
Çözüm Gezgini'da Polygon.rc kaynak dosyasına çift tıklayın. Bu işlem Kaynak Görünümü'nü açar.
Kaynak Görünümü'nde
Dialog
düğümü genişletin ve öğesine çift tıklayınIDD_POLYPROP
. Görüntülenen iletişim kutusunun, denetimlerinizi buraya eklemenizi söyleyen bir etiket dışında boş olduğunu unutmayın.Bu etiketi seçin ve Özellikler penceresindeki Resim Yazısı metnini değiştirerek okunacak
Sides:
şekilde değiştirin.Etiket kutusunu, metnin boyutuna sığacak şekilde yeniden boyutlandırın.
Bir Düzenleme Denetimini Araç Kutusu'ndan etiketin sağındaki sürükleyin.
Son olarak, Özellikler penceresini kullanarak düzenleme denetiminin
IDC_SIDES
kimliğini değiştirin.
Bu, özellik sayfası kaynağını oluşturma işlemini tamamlar.
Özellik Sayfası Oluşturmak ve Yönetmek için Kod Ekleme
Özellik sayfası kaynağını oluşturduğunuza göre uygulama kodunu yazmanız gerekir.
İlk olarak, Uygula düğmesine basıldığında sınıfın nesnenizdeki kenar sayısını ayarlamasını etkinleştirinCPolyProp
.
Apply işlevini değiştirerek kenar sayısını ayarlamak için
Apply
PolyProp.h içindeki işlevini aşağıdaki kodla değiştirin:STDMETHOD(Apply)(void) { USES_CONVERSION; ATLTRACE(_T("CPolyProp::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]); short nSides = (short)GetDlgItemInt(IDC_SIDES); if FAILED(pPoly->put_Sides(nSides)) { CComPtr<IErrorInfo> pError; CComBSTR strError; GetErrorInfo(0, &pError); pError->GetDescription(&strError); MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION); return E_FAIL; } } m_bDirty = FALSE; return S_OK; }
Özellik sayfasında aynı anda birden fazla istemci eklenebilir, bu nedenle Apply
işlev döngüye alınır ve düzenleme kutusundan alınan değerle her istemcide çağrılar put_Sides
yapılır. Arabirimi arabirimden IUnknown
(dizide depolanan) almak IPolyCtl
için her nesne üzerinde komutunu gerçekleştiren QueryInterface
CComQIPtr sınıfını m_ppUnk
kullanıyorsunuz.
Kod artık özelliği ayarlamanın Sides
gerçekten işe yaradığını denetler. Başarısız olursa, kod arabirimden IErrorInfo
hata ayrıntılarını gösteren bir ileti kutusu görüntüler. Genellikle kapsayıcı bir nesneden ISupportErrorInfo
arabirimi ister ve önce çağırarak InterfaceSupportsErrorInfo
nesnenin hata bilgilerini ayarlamayı destekleyip desteklemediğini belirler. Bu görevi atlayabilirsiniz.
CComPtr , başvuru sayımını otomatik olarak işleyerek size yardımcı olur, bu nedenle arabirimde arama Release
yapmanız gerekmez. CComBSTR
BSTR işleme konusunda size yardımcı olur, bu nedenle son SysFreeString
çağrıyı yapmanız gerekmez. Gerekirse BSTR'yi dönüştürebilmeniz için çeşitli dize dönüştürme sınıflarından birini de kullanırsınız (bu nedenle USES_CONVERSION makro işlevin başındadır).
Uygula düğmesinin etkinleştirilmesi gerektiğini belirtmek için özellik sayfasının kirli bayrağını da ayarlamanız gerekir. Bu durum, kullanıcı Kenarlar düzenleme kutusundaki değeri değiştirdiğinde oluşur.
Uygula düğmesini işlemek için
Sınıf Görünümü'nde sağ tıklayın
CPolyProp
ve kısayol menüsünde Özellikler'e tıklayın.Özellikler penceresinde Olaylar simgesine tıklayın.
IDC_SIDES
Olay listesindeki düğümü genişletin.öğesini seçin
EN_CHANGE
ve sağ taraftaki açılan menüden OnEnChangeSides Ekle'ye> tıklayın<. İşleyiciOnEnChangeSides
bildirimi Polyprop.h'ye eklenir ve işleyici uygulaması Polyprop.cpp.
Ardından işleyiciyi değiştireceksiniz.
OnEnChangeSides yöntemini değiştirmek için
aşağıdaki kodu Polyprop.cpp yöntemine
OnEnChangeSides
ekleyin (sihirbazın buraya yerleştirdiğini tüm kodları silin):LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
OnEnChangeSides
, denetim bildirimiyle birlikte EN_CHANGE
bir WM_COMMAND
ileti gönderildiğinde çağrılırIDC_SIDES
. OnEnChangeSides
ardından özellik sayfasının artık kirli olduğunu ve Uygula düğmesinin etkinleştirilmesi gerektiğini belirtmek için TRUE'yu çağırır SetDirty
ve geçirir.
Denetime Özellik Sayfası Ekleme
ATL Özellik Sayfası şablonu ve sihirbazı, projenizde birden çok denetim olabileceğinden özellik sayfasını sizin denetiminize otomatik olarak eklemez. Denetimin özellik eşlemesine bir giriş eklemeniz gerekir.
Özellik sayfasını eklemek için
PolyCtl.h dosyasını açın ve şu satırları özellik eşlemesine ekleyin:
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT) PROP_PAGE(CLSID_PolyProp)
Denetimin özellik eşlemesi şimdi şöyle görünür:
BEGIN_PROP_MAP(CPolyCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
#ifndef _WIN32_WCE
PROP_ENTRY_TYPE("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UI4)
#endif
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
PROP_PAGE(CLSID_PolyProp)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
Özellik sayfanızın CLSID değerine sahip bir PROP_PAGE
makro ekleyebilirsiniz, ancak makroyu PROP_ENTRY
gösterildiği gibi kullanırsanız, Sides
denetim kaydedildiğinde özellik değeri de kaydedilir.
Makronun üç parametresi özellik açıklaması, özelliğin DISPID'i ve özelliği üzerinde özelliği olan özellik sayfasının CLSID'leridir. Bu, örneğin denetimi Visual Basic'e yükler ve tasarım zamanında Kenar sayısını ayarlarsanız kullanışlıdır. Kenar sayısı kaydedildiğinden, Visual Basic projenizi yeniden yüklerken Kenar sayısı geri yüklenir.
Denetimi Oluşturma ve Test Etme
Şimdi bu denetimi derleyin ve ActiveX Denetim Testi Kapsayıcısına ekleyin. Test Kapsayıcısı'ndaki Düzenle menüsünde PolyCtl Sınıf Nesnesi'ne tıklayın. Özellik sayfası, eklediğiniz bilgilerle birlikte görüntülenir.
Uygula düğmesi başlangıçta devre dışıdır. Kenarlar kutusuna bir değer yazmaya başladığınızda Uygula düğmesi etkinleştirilir. Değeri girmeyi tamamladıktan sonra Uygula düğmesine tıklayın. Denetim görünümü değişir ve Uygula düğmesi yeniden devre dışı bırakılır. Geçersiz bir değer girmeyi deneyin. İşlevden put_Sides
ayarladığınız hata açıklamasını içeren bir ileti kutusu görürsünüz.
Ardından, denetiminizi bir Web sayfasına koyacaksınız.