Aracılığıyla paylaş


MFC ActiveX Denetimleri: Gelişmiş Konular

Bu makalede ActiveX denetimleri geliştirmeyle ilgili gelişmiş konular ele alınır. Bu modüller şunlardır:

Ö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.

ActiveX Denetimlerinde Veritabanı Sınıflarını Kullanma

ActiveX denetim sınıfları sınıf kitaplığının bir parçası olduğundan, MFC veritabanı sınıflarını kullanan ActiveX denetimleri geliştirmek için standart bir MFC uygulamasında veritabanı sınıflarını kullanmak için aynı yordamları ve kuralları uygulayabilirsiniz.

MFC veritabanı sınıflarının genel bir genel bakışı için bkz . MFC Veritabanı Sınıfları (DAO ve ODBC). Makale hem MFC ODBC sınıflarını hem de MFC DAO sınıflarını tanıtır ve her iki konuda da sizi daha fazla ayrıntıya yönlendirir.

Dekont

DAO, Office 2013 aracılığıyla desteklenir. DAO 3.6 son sürümdür ve eski olarak kabul edilir. Visual C++ ortamı ve sihirbazları DAO'yu desteklemez (DAO sınıfları dahil olsa da ve bunları kullanmaya devam edebilirsiniz). Microsoft, yeni projeler için OLE DB Şablonları veya ODBC ve MFC kullanmanızı önerir. DAO'yu yalnızca mevcut uygulamaları korumak için kullanmanız gerekir.

Parametreli Özellik Uygulama

Parametreli özellik (bazen özellik dizisi olarak da adlandırılır), homojen bir değer koleksiyonunu denetimin tek bir özelliği olarak kullanıma çıkarmak için bir yöntemdir. Örneğin, bir diziyi veya sözlüğü özellik olarak kullanıma açmak için parametreli bir özellik kullanabilirsiniz. Visual Basic'te böyle bir özelliğe dizi gösterimi kullanılarak erişilir:

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

Parametreli özellik uygulamak için Özellik Ekleme Sihirbazı'nı kullanın. Özellik Ekleme Sihirbazı, denetim kullanıcısının yukarıdaki gösterimi kullanarak veya standart şekilde özelliğe erişmesini sağlayan bir çift Get/Set işlevi ekleyerek özelliğini uygular.

Yöntemlere ve özelliklere benzer şekilde, parametreli özelliklerin de izin verilen parametre sayısıyla bir sınırı vardır. Parametreli özellikler söz konusu olduğunda sınır 15 parametredir (özellik değerini depolamak için ayrılmış bir parametre ile).

Aşağıdaki yordam, iki boyutlu bir tamsayı dizisi olarak erişilebilen Array adlı parametreli bir özellik ekler.

Özellik Ekleme Sihirbazı'nı kullanarak parametreli özellik eklemek için

  1. Denetiminizin projesini yükleyin.

  2. Sınıf Görünümü'nde, denetiminizin kitaplık düğümünü genişletin.

  3. Kısayol menüsünü açmak için denetiminizin arabirim düğümüne (kitaplık düğümünün ikinci düğümü) sağ tıklayın.

  4. Kısayol menüsünde Ekle'ye ve ardından Özellik Ekle'ye tıklayın.

  5. Özellik Adı kutusuna yazınArray.

  6. Özellik Türü kutusunda öğesini seçinshort.

  7. Uygulama Türü için Yöntemleri Al/Ayarla'ya tıklayın.

  8. İşlev Al ve İşlev Ayarla kutularına Get ve Set İşlevleriniz için benzersiz adlar yazın veya varsayılan adları kabul edin.

  9. Parametre Adı ve Parametre Türü denetimlerini kullanarak satır (kısa yazın) olarak adlandırılan bir parametre ekleyin.

  10. sütun adlı ikinci bir parametre ekleyin (kısa yazın).

  11. Finish (Son) düğmesine tıklayın.

Özellik Ekleme Sihirbazı Tarafından Yapılan Değişiklikler

Özel bir özellik eklediğinizde, Özellik Ekleme Sihirbazı denetim sınıfı üst bilgisinde ( değişiklik yapar. H) ve uygulama (. CPP) dosyaları.

Aşağıdaki satırlar denetim sınıfına eklenir. H dosyası:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

Bu kod adlı GetArray ve SetArray özelliğine erişirken kullanıcının belirli bir satır ve sütun istemesine olanak sağlayan iki işlev bildirir.

Ayrıca Özellik Ekleme Sihirbazı, denetim sınıfı uygulamasında ( bulunan denetim dağıtım eşlemesine aşağıdaki satırları ekler. CPP) dosyası:

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

Son olarak, ve SetArray işlevlerinin GetArray uygulamaları sonuna eklenir. CPP dosyası. Çoğu durumda Get işlevini özelliğinin değerini döndürecek şekilde değiştireceksiniz. Set işlevi genellikle özellik değişmeden önce veya sonra yürütülmesi gereken kodu içerir.

Bu özelliğin yararlı olması için, parametreli özelliğin değerlerini depolamak için denetim sınıfında türünde shortiki boyutlu bir dizi üye değişkeni bildirebilirsiniz. Ardından Get işlevini, parametreler tarafından gösterildiği gibi doğru satır ve sütunda depolanan değeri döndürecek şekilde değiştirebilir ve Set işlevini değiştirerek satır ve sütun parametreleri tarafından başvurulan değeri güncelleştirebilirsiniz.

ActiveX Denetiminizdeki Hataları İşleme

Denetimde hata koşulları oluşursa, hatayı denetim kapsayıcısına bildirmeniz gerekebilir. Hatanın oluştuğu duruma bağlı olarak, hataları raporlamak için iki yöntem vardır. Hata bir özelliğin Get veya Set işlevinde veya OLE Otomasyonu yönteminin uygulanmasında oluşursa, denetim COleControl::ThrowError'ı çağırmalıdır ve bu da denetim kullanıcısına bir hata oluştuğunun sinyalini vermelidir. Hata başka bir zamanda oluşursa, denetim bir stok Hata olayını tetikleyen COleControl::FireError'ı çağırmalıdır.

Oluşan hata türünü belirtmek için denetimin veya FireErroröğesine bir hata kodu ThrowError geçirmesi gerekir. Hata kodu, 32 bit değerine sahip bir OLE durum kodudur. Mümkün olduğunda, OLECTL'de tanımlanan standart kod kümesinden bir hata kodu seçin. H üst bilgi dosyası. Aşağıdaki tabloda bu kodlar özetlenmektedir.

ActiveX Denetimi Hata Kodları

Hata Tanım
CTL_E_ILLEGALFUNCTIONCALL Geçersiz işlev çağrısı
CTL_E_OVERFLOW Taşma
CTL_E_OUTOFMEMORY Bellek yetersiz
CTL_E_DIVISIONBYZERO Sıfıra bölme
CTL_E_OUTOFSTRINGSPACE Dizeler için ayrılan alan doldu
CTL_E_OUTOFSTACKSPACE Yığın için ayrılan alan doldu
CTL_E_BADFILENAMEORNUMBER Hatalı dosya adı veya numarası
CTL_E_FILENOTFOUND Dosya bulunamadı
CTL_E_BADFILEMODE Hatalı dosya modu
CTL_E_FILEALREADYOPEN Dosya zaten açık
CTL_E_DEVICEIOERROR Cihaz G/Ç hatası
CTL_E_FILEALREADYEXISTS Dosya zaten var
CTL_E_BADRECORDLENGTH Hatalı kayıt uzunluğu
CTL_E_DISKFULL Disk dolu
CTL_E_BADRECORDNUMBER Hatalı kayıt numarası
CTL_E_BADFILENAME Hatalı dosya adı
CTL_E_TOOMANYFILES Çok fazla sayıda dosya
CTL_E_DEVICEUNAVAILABLE Cihaz kullanılamıyor
CTL_E_PERMISSIONDENIED İzin reddedildi
CTL_E_DISKNOTREADY Disk hazır değil
CTL_E_PATHFILEACCESSERROR Yol/dosya erişim hatası
CTL_E_PATHNOTFOUND Yol bulunamadı
CTL_E_INVALIDPATTERNSTRING Geçersiz desen dizesi
CTL_E_INVALIDUSEOFNULL Geçersiz NULL kullanımı
CTL_E_INVALIDFILEFORMAT Geçersiz dosya biçimi
CTL_E_INVALIDPROPERTYVALUE Geçersiz özellik değeri
CTL_E_INVALIDPROPERTYARRAYINDEX Geçersiz özellik dizisi dizini
CTL_E_SETNOTSUPPORTEDATRUNTIME Çalışma zamanında desteklenmiyor olarak ayarlayın
CTL_E_SETNOTSUPPORTED Ayar desteklenmiyor (salt okunur özellik)
CTL_E_NEEDPROPERTYARRAYINDEX Need özelliği dizi dizini
CTL_E_SETNOTPERMITTED Kümeye izin verilmiyor
CTL_E_GETNOTSUPPORTEDATRUNTIME Çalışma zamanında desteklenmez
CTL_E_GETNOTSUPPORTED Desteklenmedi (salt yazma özelliği)
CTL_E_PROPERTYNOTFOUND Özellik bulunamadı
CTL_E_INVALIDCLIPBOARDFORMAT Geçersiz pano biçimi
CTL_E_INVALIDPICTURE Geçersiz resim
CTL_E_PRINTERERROR Yazıcı hatası
CTL_E_CANTSAVEFILETOTEMP Dosya TEMP'ye kaydedilemiyor
CTL_E_SEARCHTEXTNOTFOUND Arama metni bulunamadı
CTL_E_REPLACEMENTSTOOLONG Değiştirmeler çok uzun

Gerekirse, standart kodlardan birinin kapsamına alınmayan bir koşul için özel hata kodu tanımlamak üzere CUSTOM_CTL_SCODE makroyu kullanın. Bu makronun parametresi 1000 ile 32767 (dahil) arasında bir tamsayı olmalıdır. Örnek:

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

Mevcut bir VBX denetimini değiştirmek için bir ActiveX denetimi oluşturuyorsanız, Hata kodlarının uyumlu olduğundan emin olmak için ActiveX denetimi hata kodlarınızı VBX denetiminin kullandığı sayısal değerlerle tanımlayın.

Denetimdeki Özel Anahtarları İşleme

Bazı durumlarda belirli tuş vuruşu bileşimlerini özel bir şekilde işlemek isteyebilirsiniz; örneğin, çok satırlı metin kutusu denetiminde ENTER tuşuna basıldığında yeni bir satır ekleyin veya yön tuşu kimliğine basıldığında düzenleme denetimleri grubu arasında hareket edin.

ActiveX denetiminizin temel sınıfı iseCOleControl, kapsayıcı bunları işlemeden önce iletileri işlemek için CWnd::P reTranslateMessage'ı geçersiz kılabilirsiniz. Bu tekniği kullanırken, geçersiz kılmanızdaki iletiyi işlerseniz her zaman TRUE değerini döndürebilirsiniz.PreTranslateMessage

Aşağıdaki kod örneği, yönlü anahtarlarla ilgili iletileri işlemenin olası bir yolunu gösterir.

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
   case WM_KEYDOWN:
      switch (pMsg->wParam)
      {
      case VK_UP:
      case VK_DOWN:
      case VK_LEFT:
      case VK_RIGHT:
         bHandleNow = TRUE;
         break;
      }
      if (bHandleNow)
      {
         OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
      }
      break;
   }
   return bHandleNow;
}

ActiveX denetimi için klavye arabirimlerini işleme hakkında daha fazla bilgi için ActiveX SDK belgelerine bakın.

Çalışma Zamanında Görünmeyen İletişim Kutusu Denetimlerine Erişme

Kullanıcı arabirimi olmayan ve çalışma zamanında görünmeyen iletişim kutusu denetimleri oluşturabilirsiniz. Bir iletişim kutusuna çalışma zamanında görünmez bir ActiveX denetimi ekler ve denetime erişmek için CWnd::GetDlgItem kullanırsanız, denetim düzgün çalışmaz. Bunun yerine, denetimi temsil eden bir nesne elde etmek için aşağıdaki tekniklerden birini kullanmanız gerekir:

  • Üye Değişkeni Ekleme Sihirbazı'nı kullanarak Denetim Değişkeni'ni ve ardından denetimin kimliğini seçin. Bir üye değişkeni adı girin ve denetimin sarmalayıcı sınıfını Denetim Türü olarak seçin.

    -veya-

  • İletişim kutusu öğesi olarak yerel bir değişken ve alt sınıf bildirin. Aşağıdakine benzer bir kod ekleyin (CMyCtrl sarmalayıcı sınıfıdır, IDC_MYCTRL1 denetimin kimliğidir):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

Ayrıca bkz.

MFC ActiveX Denetimleri