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
Denetiminizin projesini yükleyin.
Sınıf Görünümü'nde, denetiminizin kitaplık düğümünü genişletin.
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.
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.
Özellik Adı kutusunda Yazı Tipi'ne tıklayın.
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
Denetiminizin projesini yükleyin.
Sınıf Görünümü'nde, denetiminizin kitaplık düğümünü genişletin.
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.
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.
Özellik Adı kutusunda Resim Yazısı'na tıklayın.
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 Font özelliğini uygulamak için Özellik Ekleme Sihirbazı'nı kullanın.
Yeni bir yazı tipi bildirim arabirimi uygulama.
Ö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
Denetiminizin projesini yükleyin.
Sınıf Görünümü'nde, denetiminizin kitaplık düğümünü genişletin.
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.
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.
Özellik Adı kutusuna özellik için bir ad yazın. Bu örnek için HeadingFont kullanın.
Uygulama Türü için Yöntemleri Al/Ayarla'ya tıklayın.
Özellik Türü kutusunda, özelliğin türü için IDispatch'i* seçin.
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 SetHeadingFont
sı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şlevePX_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 COleControl
uygulanan 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 COleControl
tarafı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.
Birden Çok Yazı Tipi Nesne Arabirimi Uygulama
Yukarıdaki şekildeki düz çizgiler, her iki yazı tipi nesnesinin de aynı uygulamasını IFontNotification
kullandığı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ı HeadingFontNotify
arabiriminin IPropertyNotifySink
bir uygulamasını oluşturur. Bu yeni arabirim adlı OnChanged
bir 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