Aracılığıyla paylaş


MFC ActiveX Denetimleri: Yazı Tiplerini Kullanma

ActiveX denetiminiz metin görüntülüyorsa, denetim kullanıcısının yazı tipi özelliğini değiştirerek metin görünümünü değiştirmesine izin vekleyebilirsiniz. Yazı tipi özellikleri yazı tipi nesneleri olarak uygulanır ve iki türden biri olabilir: hisse senedi veya özel. Stok Yazı Tipi özellikleri, Özellik Ekleme Sihirbazı'nı kullanarak ekleyebileceğiniz önceden yüklenmiş yazı tipi özellikleridir. Özel Yazı Tipi özellikleri önceden sağlanmaz ve denetimi geliştirici özelliğin davranışını ve kullanımını belirler.

Bu makalede aşağıdaki konular ele alınır:

Hisse Senedi Yazı Tipi Özelliğini Kullanma

Hisse Senedi Yazı Tipi özellikleri COleControl sınıfı tarafından önceden sağlanır. Ayrıca, kullanıcının yazı tipi nesnesinin adı, boyutu ve stili gibi çeşitli özniteliklerini değiştirmesine olanak sağlayan standart bir Font özellik sayfası da mevcuttur.

yazı tipi nesnesine GetFont, SetFont ve InternalGetFont işlevleri aracılığıyla erişinCOleControl. Denetim kullanıcısı, ve SetFont işlevleri aracılığıyla yazı tipi nesnesine GetFont diğer Get/Set özellikleriyle aynı şekilde erişecektir. Bir denetimin içinden yazı tipi nesnesine erişim gerektiğinde işlevini kullanın InternalGetFont .

MFC ActiveX Denetimleri: Özellikler bölümünde açıklandığı gibi, Özellik Ekleme Sihirbazı ile stok özellikleri eklemek kolaydır. Yazı Tipi özelliğini seçersiniz ve Özellik Ekleme Sihirbazı hisse senedi Yazı Tipi girdisini otomatik olarak denetimin dağıtım haritasına ekler.

Özellik Ekleme Sihirbazı'nı kullanarak stok Yazı Tipi özelliğini 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.

    Bu işlem Özellik Ekleme Sihirbazı'nı açar.

  5. Özellik Adı kutusunda Yazı Tipi'ne tıklayın.

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

Özellik Ekleme Sihirbazı, denetim sınıfı uygulama dosyasında bulunan denetimin dağıtım eşlemesine aşağıdaki satırı ekler:

DISP_STOCKPROP_FONT()

Ayrıca, Özellik Ekleme Sihirbazı denetimine aşağıdaki satırı ekler. IDL dosyası:

[id(DISPID_FONT)] IFontDisp* Font;

stock Caption özelliği, hisse senedi Yazı Tipi özellik bilgileri kullanılarak çizilebilen bir metin özelliği örneğidir. Hisse senedi Caption özelliğini denetime eklemek, hisse senedi Font özelliği için kullanılanlara benzer adımları kullanır.

Özellik Ekleme Sihirbazı'nı kullanarak stock Caption özelliğini 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.

    Bu işlem Özellik Ekleme Sihirbazı'nı açar.

  5. Özellik Adı kutusunda Resim Yazısı'na tıklayın.

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

Özellik Ekleme Sihirbazı, denetim sınıfı uygulama dosyasında bulunan denetimin dağıtım eşlemesine aşağıdaki satırı ekler:

DISP_STOCKPROP_CAPTION()

OnDraw İşlevini Değiştirme

varsayılan uygulaması OnDraw , denetimde görüntülenen tüm metinler için Windows sistem yazı tipini kullanır. Bu, cihaz bağlamında yazı tipi nesnesini seçerek kodu değiştirmeniz OnDraw gerektiği anlamına gelir. Bunu yapmak için COleControl::SelectStockFont'u çağırın ve aşağıdaki örnekte gösterildiği gibi denetimin cihaz bağlamını geçirin:

CFont* pOldFont;
TEXTMETRIC tm;
const CString& strCaption = InternalGetText();

pOldFont = SelectStockFont(pdc);
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
pdc->GetTextMetrics(&tm);
pdc->SetTextAlign(TA_CENTER | TA_TOP);
pdc->ExtTextOut((rcBounds.left + rcBounds.right) / 2,
(rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(), NULL);

pdc->SelectObject(pOldFont);

OnDraw İşlev yazı tipi nesnesini kullanacak şekilde değiştirildikten sonra, denetimin içindeki tüm metinler denetimin stock Font özelliğindeki özelliklerle görüntülenir.

Denetiminizde Özel Yazı Tipi Özelliklerini Kullanma

Stok Font özelliğine ek olarak, ActiveX denetiminin özel Yazı Tipi özellikleri olabilir. Özel yazı tipi özelliği eklemek için:

Özel Yazı Tipi Özelliği Uygulama

Özel bir Font özelliği uygulamak için Özellik Ekleme Sihirbazı'nı kullanarak özelliği ekler ve kodda bazı değişiklikler yaparsınız. Aşağıdaki bölümlerde, özel HeadingFont özelliğin Örnek denetimine nasıl ekleneceği açıklanmaktadır.

Özellik Ekleme Sihirbazı'nı kullanarak özel Font özelliğini 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.

    Bu işlem Özellik Ekleme Sihirbazı'nı açar.

  5. Özellik Adı kutusuna özellik için bir ad yazın. Bu örnek için HeadingFont kullanın.

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

  7. Özellik Türü kutusunda, özelliğin türü için IDispatch'i* seçin.

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

Özellik Ekleme Sihirbazı, özel özelliği sınıfına ve SAMPLE'a eklemek HeadingFont için CSampleCtrl kodu oluşturur. IDL dosyası. HeadingFont Get/Set özellik türü olduğundan, Özellik Ekleme Sihirbazı sınıfın CSampleCtrl dağıtım eşlemesini DISP_PROPERTY_EX_ID DISP_PROPERTY_EX makro girdisi içerecek şekilde değiştirir:

DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
   GetHeadingFont, SetHeadingFont, VT_DISPATCH)

DISP_PROPERTY_EX makro, özellik adını ilgili Get ve Set yöntemleri ve SetHeadingFontsınıfıyla ilişkilendirir HeadingFont GetHeadingFont.CSampleCtrl Özellik değerinin türü de belirtilir; bu durumda VT_FONT.

Özellik Ekleme Sihirbazı, denetim üst bilgisi dosyasına ( bir bildirim de ekler. ve işlevleri için GetHeadingFont H) ve SetHeadingFont işlev şablonlarını denetim uygulama dosyasına (. CPP:

IDispatch* CWizardGenCtrl::GetHeadingFont(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetHeadingFont(IDispatch* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Son olarak, Özellik Ekleme Sihirbazı denetimini değiştirir. özelliği için HeadingFont bir girdi ekleyerek IDL dosyası:

[id(1)] IDispatch* HeadingFont;

Denetim Kodunda Yapılan Değişiklikler

Özelliği denetime eklediğinize HeadingFont göre, yeni özelliği tam olarak desteklemek için denetim üst bilgisinde ve uygulama dosyalarında bazı değişiklikler yapmanız gerekir.

Denetim üst bilgisi dosyasında (. H), korumalı üye değişkeninin aşağıdaki bildirimini ekleyin:

protected:
   CFontHolder m_fontHeading;

Denetim uygulama dosyasında (. CPP), aşağıdakileri yapın:

  • Denetim oluşturucusunda m_fontHeading başlatın.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
       InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Yazı tipinin varsayılan özniteliklerini içeren statik bir FONTDESC yapısı bildirin.

    static const FONTDESC _fontdescHeading =
    { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE(12), FW_BOLD,
      ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • Denetim DoPropExchange üyesi işlevine işleve PX_Font bir çağrı ekleyin. Bu, özel Font özelliğiniz için başlatma ve kalıcılık sağlar.

    void CMyAxFontCtrl::DoPropExchange(CPropExchange* pPX)
    {
       ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
       COleControl::DoPropExchange(pPX);
    
       // [...other PX_ function calls...]
       PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading);
    }
    
  • Denetim GetHeadingFont üyesi işlevini uygulamayı tamamlayın.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Denetim SetHeadingFont üyesi işlevini uygulamayı tamamlayın.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Daha önce seçilen yazı tipini tutacak bir değişken tanımlamak için denetim OnDraw üyesi işlevini değiştirin.

    CFont* pOldHeadingFont;
    
  • Cihaz bağlamında özel yazı tipini seçmek için denetim OnDraw üyesi işlevini değiştirmek için, yazı tipinin kullanılacağı her yere aşağıdaki satırı ekleyin.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Denetim OnDraw üyesi işlevini değiştirerek önceki yazı tipini cihaz bağlamı içine geri seçmek için yazı tipi kullanıldıktan sonra aşağıdaki satırı ekleyin.

    pdc->SelectObject(pOldHeadingFont);
    

Özel Font özelliği uygulandıktan sonra, denetim kullanıcılarının denetimin geçerli yazı tipini değiştirmesine izin veren standart Font özellik sayfası uygulanmalıdır. Standart Font özellik sayfasının özellik sayfası kimliğini eklemek için, BEGIN_PROPPAGEIDS makrosunun arkasına aşağıdaki satırı ekleyin:

PROPPAGEID(CLSID_CFontPropPage)

Ayrıca BEGIN_PROPPAGEIDS makronuzun count parametresini bir artırmalısınız. Aşağıdaki satırda bu gösterilmektedir:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Bu değişiklikler yapıldıktan sonra, ek işlevleri birleştirmek için projenin tamamını yeniden oluşturun.

Yazı Tipi Bildirimlerini İşleme

Çoğu durumda denetimin yazı tipi nesnesinin özelliklerinin ne zaman değiştirildiğini bilmesi gerekir. Her yazı tipi nesnesi, tarafından COleControluygulanan arabirimin üye işlevini çağırarak değiştiğinde IFontNotification bildirim sağlama yeteneğine sahiptir.

Denetim stock Font özelliğini kullanıyorsa, bildirimleri öğesinin OnFontChanged üye işlevi COleControltarafından işlenir. Özel yazı tipi özellikleri eklediğinizde, aynı uygulamayı kullanmalarını sağlayabilirsiniz. Önceki bölümdeki örnekte bu, m_fontHeading üye değişkeni başlatılırken &m_xFontNotification geçirilerek gerçekleştirilir.

Implementing multiple font object interfaces.
Birden Çok Yazı Tipi Nesne Arabirimi Uygulama

Yukarıdaki şekildeki düz çizgiler, her iki yazı tipi nesnesinin de aynı uygulamasını IFontNotificationkullandığını gösterir. Hangi yazı tipinin değiştiğini ayırt etmek isterseniz bu sorunlara neden olabilir.

Denetimin yazı tipi nesnesi bildirimlerini ayırt etmenin bir yolu, denetimdeki her yazı tipi nesnesi için arabirimin IFontNotification ayrı bir uygulamasını oluşturmaktır. Bu teknik, yalnızca son değiştirilen yazı tipini kullanan dizeyi veya dizeleri güncelleştirerek çizim kodunuzu iyileştirmenizi sağlar. Aşağıdaki bölümlerde, ikinci bir Font özelliği için ayrı bildirim arabirimleri uygulamak için gereken adımlar gösterilmektedir. İkinci yazı tipi özelliğinin önceki bölümde eklenen özellik olduğu varsayılır HeadingFont .

Yeni Yazı Tipi Bildirim Arabirimi Uygulama

İki veya daha fazla yazı tipinin bildirimlerini ayırt etmek için, denetimde kullanılan her yazı tipi için yeni bir bildirim arabirimi uygulanmalıdır. Aşağıdaki bölümlerde, denetim üst bilgisi ve uygulama dosyalarını değiştirerek yeni bir yazı tipi bildirim arabiriminin nasıl uygulandığı açıklanmaktadır.

Üst Bilgi Dosyasına Eklemeler

Denetim üst bilgisi dosyasında (. H), sınıf bildirimine aşağıdaki satırları ekleyin:

protected:
   BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
      INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
      STDMETHOD(OnRequestEdit)(DISPID);
   STDMETHOD(OnChanged)(DISPID);
   END_INTERFACE_PART(HeadingFontNotify)

Bu, adlı HeadingFontNotifyarabiriminin IPropertyNotifySink bir uygulamasını oluşturur. Bu yeni arabirim adlı OnChangedbir yöntem içerir.

Uygulama Dosyasına Eklemeler

Başlık yazı tipini başlatan kodda (denetim oluşturucusunda), &m_xFontNotification öğesini &m_xHeadingFontNotify olarak değiştirin. Ardından aşağıdaki kodu ekleyin:

STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::AddRef()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
      return 1;
}
STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::Release()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
      return 0;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::QueryInterface(REFIID iid, LPVOID FAR* ppvObj)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
      if (IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IPropertyNotifySink))
      {
         *ppvObj = this;
         AddRef();
         return NOERROR;
      }
   return ResultFromScode(E_NOINTERFACE);
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnChanged(DISPID)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
      pThis->InvalidateControl();
   return NOERROR;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnRequestEdit(DISPID)
{
   return NOERROR;
}

AddRef Arabirimindeki IPropertyNotifySink ve Release yöntemleri, ActiveX denetim nesnesi için başvuru sayısını izler. Denetim arabirim işaretçisine erişim elde ettiğinde, denetim başvuru sayısını artırmak için öğesini çağırır AddRef . Denetim işaretçiyle tamamlandığında, genel bellek bloğunu serbest bırakırken çağrılabilecek şekilde GlobalFree öğesini çağırırRelease. Bu arabirimin başvuru sayısı sıfıra çıktığında, arabirim uygulaması serbestleştirilebilir. Bu örnekte işlev, QueryInterface belirli bir nesnedeki arabirimin IPropertyNotifySink işaretçisini döndürür. Bu işlev, ActiveX denetiminin hangi arabirimleri desteklediğini belirlemek için bir nesneyi sorgulamasına olanak tanır.

Projenizde bu değişiklikler yapıldıktan sonra projeyi yeniden derleyin ve arabirimi test etmek için Test Kapsayıcısı'nı kullanın. Test kapsayıcısına erişme hakkında bilgi için bkz . Test Kapsayıcısı ile Test Özellikleri ve Olayları.

Ayrıca bkz.

MFC ActiveX Denetimleri
MFC ActiveX Denetimleri: ActiveX Denetiminde Resim Kullanma
MFC ActiveX Denetimleri: Stok Özellik Sayfalarını Kullanma