MFC – ovládací prvky ActiveX: Použití písem
Pokud váš ovládací prvek ActiveX zobrazí text, můžete povolit ovládací prvek uživatele Chcete-li změnit vzhled textu změnou vlastnosti písma.Vlastnosti písma jsou implementovány jako objekty písma a může být dvou typů: akcií nebo vlastní.Uložené vlastnosti písma jsou písma preimplemented vlastnosti, které můžete přidat pomocí Průvodce přidáním vlastnosti.Vlastní vlastnosti písma nejsou preimplemented a vývojář ovládacího prvku určuje chování vlastnosti a použití.
Tento článek obsahuje následující témata:
Pomocí vlastnosti písma na skladě
Pomocí vlastnosti vlastní písma ve vašem ovládacím prvku
Pomocí vlastnosti akcií písma
Uložené vlastnosti písma jsou preimplemented ve třídě COleControl.Standardní stránka vlastností písma je kromě toho také k dispozici, umožňuje uživatelům měnit různé atributy písma objektu, například jeho název, velikost a styl.
Přístup k objektu písmo až GetFont, SetFont, a InternalGetFont funkce COleControl.Ovládací prvek uživatel přistupuje prostřednictvím objektu písmo GetFont a SetFont funkce stejným způsobem jako ostatní vlastnosti Get a Set.Pokud je přístup k objektu písmo z požadované v rámci ovládacího prvku, použijte InternalGetFont funkce.
Jak je uvedeno v ovládací prvky MFC ActiveX: vlastnosti, přidání vlastností zásob je snadné se Průvodce přidáním vlastnosti.Vyberte vlastnosti písma a Průvodce přidáním vlastnosti automaticky vloží uloženou položku písma do mapy odesílaní ovládacího prvku.
Chcete-li přidat vlastnost akcií písma pomocí Průvodce přidáním vlastnosti
Načtěte projektu ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Klepněte pravým tlačítkem na uzel rozhraní pro ovládací prvek (druhý uzel uzlu knihovny) a místní nabídce.
V místní nabídce klepněte na příkaz Přidat a potom klepněte na tlačítko Přidat vlastnost.
Otevře se Průvodce přidáním vlastnosti.
V Název vlastnosti klepněte na tlačítko písma.
Klepněte na tlačítko Dokončit.
Add Property Wizard přidá do mapy odesílaní ovládací prvek, umístěn v souboru třídy implementace ovládacího prvku následující řádek:
DISP_STOCKPROP_FONT()
Kromě toho Průvodce přidáním vlastnosti přidá následující řádek do ovládacího prvku.Soubor IDL:
[id(DISPID_FONT)] IFontDisp*Font;
Akcií vlastnost titulek je příkladem textovou vlastnost, která může být vykresleno pomocí burzovní informace vlastnosti písma.Přidání akcií vlastnost titulek k ovládacímu prvku pomocí kroků, které jsou podobné vlastnosti Font populace.
Chcete-li přidat akcií vlastnost titulek pomocí Průvodce přidáním vlastnosti
Načtěte projektu ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Klepněte pravým tlačítkem na uzel rozhraní pro ovládací prvek (druhý uzel uzlu knihovny) a místní nabídce.
V místní nabídce klepněte na příkaz Přidat a potom klepněte na tlačítko Přidat vlastnost.
Otevře se Průvodce přidáním vlastnosti.
V Název vlastnosti klepněte na tlačítko Titulek.
Klepněte na tlačítko Dokončit.
Add Property Wizard přidá do mapy odesílaní ovládací prvek, umístěn v souboru třídy implementace ovládacího prvku následující řádek:
DISP_STOCKPROP_CAPTION()
Změna funkce OnDraw
Výchozí implementace OnDraw používá písmo systému Windows pro všechny text zobrazený v ovládacím prvku.To znamená, že je třeba upravit OnDraw kód tak, že vyberete objekt písma do kontextu zařízení.To lze provést voláním COleControl::SelectStockFont a předat kontext zařízení ovládacího prvku, jak je znázorněno v následujícím příkladu:
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);
Po OnDraw byla změněna funkce použití objektu písmo, zobrazí se text v ovládacím prvku s vlastnostmi ze zásobní vlastnosti Font ovládacího prvku.
Pomocí vlastnosti vlastní písma ve vašem ovládacím prvku
Kromě akcií vlastnosti Font ovládacího prvku ActiveX může mít vlastní vlastnosti písma.Chcete-li přidat vlastnost vlastní písma postupujte takto:
Pomocí Průvodce přidáním vlastnosti implementovat vlastní vlastnosti písma.
Zpracování oznámení písmo.
Implementaci nového rozhraní oznámení písmo.
Implementování vlastnosti vlastní písmo
Implementovat vlastní vlastnosti písma, použijte Průvodce přidáním vlastnosti přidat vlastnosti a proveďte změny kódu.V následujících částech popisují, jak přidat vlastní HeadingFont vlastnost ovládacího prvku vzorku.
Chcete-li přidat vlastní vlastnosti písma pomocí Průvodce přidáním vlastnosti
Načtěte projektu ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Klepněte pravým tlačítkem na uzel rozhraní pro ovládací prvek (druhý uzel uzlu knihovny) a místní nabídce.
V místní nabídce klepněte na příkaz Přidat a potom klepněte na tlačítko Přidat vlastnost.
Otevře se Průvodce přidáním vlastnosti.
V Název vlastnosti zadejte název vlastnosti.V tomto příkladu pomocí HeadingFont.
Pro Typ implementace, klepněte na tlačítko Metody Get/Set.
V Vlastnost typu vyberte rozhraní IDispatch * pro typ vlastnosti.
Klepněte na tlačítko Dokončit.
Průvodce přidáním vlastnosti vytvoří kód, který chcete přidat HeadingFont vlastní vlastnost CSampleCtrl třídy a vzorek.Soubor IDL.Vzhledem k tomu, HeadingFont je vlastnost typu Get a Set upraví Průvodce přidáním vlastnosti CSampleCtrl třídy odeslání mapy zahrnout DISP_PROPERTY_EX_IDDISP_PROPERTY_EX makro položka:
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
DISP_PROPERTY_EX Makro připojí HeadingFont název vlastnosti s odpovídající CSampleCtrl třídy Get a Set metod, GetHeadingFont a SetHeadingFont.Není také zadán typ hodnoty vlastnosti; v tomto případě VT_FONT.
Průvodce přidáním vlastnosti také přidá deklaraci v souboru hlaviček ovládacího prvku (.H) u GetHeadingFont a SetHeadingFont funguje a přidá jejich funkce šablony v souboru implementace ovládacího prvku (.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();
}
Nakonec upraví Průvodce přidáním vlastnosti ovládacího prvku.Soubor IDL pomocí přidání položky pro HeadingFont vlastnosti:
[id(1)] IDispatch* HeadingFont;
Změny v kódu ovládacího prvku
Nyní, když jste přidali HeadingFont vlastnost ovládacího prvku, je nutné provést některé změny ovládacího prvku záhlaví a provádění soubory plně podporují nové vlastnosti.
V souboru záhlaví ovládacího prvku (.H) přidejte následující deklaraci proměnné chráněný člen:
protected:
CFontHolder m_fontHeading;
V souboru implementace ovládacího prvku (.CPP), proveďte následující kroky:
Inicializace m_fontHeading v konstruktoru ovládacího prvku.
CMyAxFontCtrl::CMyAxFontCtrl() : m_fontHeading(&m_xFontNotification) { InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents); }
Deklarování statického FONTDESC struktura obsahující výchozí atributy písma.
static const FONTDESC _fontdescHeading = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE };
V ovládacím prvku DoPropExchange členské funkce, přidejte volání PX_Font funkce.To umožňuje inicializaci a přetrvávání vlastnosti písma.
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); }
Dokončení implementace ovládacího prvku GetHeadingFont členské funkce.
IDispatch* CMyAxFontCtrl::GetHeadingFont(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return m_fontHeading.GetFontDispatch(); }
Dokončení implementace ovládacího prvku SetHeadingFont členské funkce.
void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_fontHeading.InitializeFont(&_fontdescHeading, pVal); OnFontChanged(); //notify any changes SetModifiedFlag(); }
Změnit ovládací prvek OnDraw členské funkce definovat proměnné pro uložení dříve vybrané písmo.
CFont* pOldHeadingFont;
Změnit ovládací prvek OnDraw členské funkce přidáním následující řádek všude, kde se použije písmo vyberte vlastní písmo do kontextu zařízení.
pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
Změnit ovládací prvek OnDraw členské funkce přidáním následujícího řádku, poté, co bylo použito písmo vyberte písmo předchozí zpět do kontextu zařízení.
pdc->SelectObject(pOldHeadingFont);
Poté, co byla implementována vlastní vlastnosti písma, standardní stránka vlastností písma musí být provedeny, umožňující uživatelům ovládacího prvku změnit písmo použité pro aktuální ovládací prvek.Chcete-li přidat ID stránky vlastností pro standardní stránku vlastností písma, vložte následující řádek po BEGIN_PROPPAGEIDS makra:
PROPPAGEID(CLSID_CFontPropPage)
Musíte také zvýšit počet parametr v BEGIN_PROPPAGEIDS makro po jednom.To ukazuje následující řádek:
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
Poté, co byly provedeny tyto změny, znovu začlenit další funkce celého projektu.
Oznámení o zpracování písma
Ve většině případů je třeba vědět, kdy byly změněny vlastnosti font objektu ovládacího prvku.Každý objekt písmo je poskytovat oznámení při změně voláním členské funkce IFontNotification rozhraní je implementováno pomocí COleControl.
Pokud ovládací prvek používá vlastnost akcií písma, jeho oznámení jsou zpracována OnFontChanged členské funkce COleControl.Pokud přidáte vlastní písmo, mohou uživatelé použít stejné provedení.V příkladu v předchozím oddílu, to bylo provedeno předáním &m_xFontNotification při inicializaci m_fontHeading členské proměnné.
Implementace více rozhraní objektů písma
Plné čáry na výše uvedeném obrázku zobrazit, oba objekty písma používají stejné provádění IFontNotification.To může způsobit potíže, pokud jste chtěli odlišit písmo změnit.
Je možné rozlišit oznámení objektu písma ovládacího prvku k vytvoření samostatné provádění IFontNotification rozhraní pro každý objekt písma v ovládacím prvku.Tato technika umožňuje optimalizovat kód výkresu pomocí aktualizace pouze řetězec nebo řetězce, které používají nedávno upravené písmo.V následujících částech ukazují kroky potřebné k implementaci rozhraní samostatné oznámení druhé vlastnosti písma.Druhá vlastnost font považován HeadingFont vlastnost, která byla přidána v předchozí části.
Implementaci nového rozhraní oznámení písma
Rozlišovat mezi oznámení o dvě nebo více písem, se musí uplatňovat nové rozhraní oznámení pro každé písmo použité v ovládacím prvku.Následující části popisují, jak implementovat nové písmo rozhraní oznámení úpravou souborů záhlaví a implementace ovládacího prvku.
Dodatky k souboru hlaviček
V souboru záhlaví ovládacího prvku (.H) k deklaraci třídy přidejte následující řádky:
protected:
BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(HeadingFontNotify)
Tím se vytvoří implementace IPropertyNotifySink rozhraní nazvané HeadingFontNotify.Toto nové rozhraní obsahuje metodu s názvem OnChanged.
Dodatky k souboru implementace
Kód, který inicializuje písmo nadpisu (v konstruktoru ovládacího prvku), změnit &m_xFontNotification k &m_xHeadingFontNotify.Přidejte následující kód:
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 a Release metody v IPropertyNotifySink rozhraní si udržel přehled o počet odkazů pro objekt ovládacího prvku ActiveX.Když ovládací prvek získá přístup k ukazatel rozhraní, vyvolá ovládací prvek AddRef zvýšit počet odkazů.Po dokončení ovládacího prvku se volá Release, mnohem stejným způsobem, GlobalFree může být volána volného globální paměti bloku.Když se počet odkazů pro toto rozhraní dostane na nulu, implementace rozhraní může být uvolněno.V tomto příkladu QueryInterface funkce vrací ukazatel IPropertyNotifySink rozhraní pro daný objekt.Tato funkce umožňuje dotaz na objekt, chcete-li zjistit, co je rozhraní podporuje ovládací prvek ActiveX.
Poté, co byly provedeny tyto změny do projektu, projekt znovu vytvořit a kontejneru Test slouží k testování rozhraní.Viz Testování vlastností a událostí s kontejnerem Test informace o získání přístupu k kontejner testu.
Viz také
Referenční dokumentace
MFC – ovládací prvky ActiveX: Použití obrázků v ovládacím prvku ActiveX
MFC – ovládací prvky ActiveX: Použití stránek uložených vlastností