MFC – ovládací prvky ActiveX: Použití písem
Pokud ovládací prvek technologie ActiveX zobrazuje text, můžete uživateli ovládacího prvku povolit změnit vzhled textu změnou vlastnosti písma. Vlastnosti písma se implementují jako objekty písma a můžou být jedním ze dvou typů: akcie nebo vlastní. Vlastnosti stock Font jsou předem připravené vlastnosti písma, které můžete přidat pomocí Průvodce přidáním vlastnosti. Vlastní vlastnosti písma nejsou předem nastaveny a vývojář ovládacího prvku určuje chování a použití vlastnosti.
Tento článek se zabývá následujícími tématy:
Použití vlastnosti Stock Font
Vlastnosti Stock Font jsou předem nastaveny třídou COleControl. Kromě toho je k dispozici také standardní stránka vlastností Písmo, která uživateli umožňuje změnit různé atributy objektu písma, jako je jeho název, velikost a styl.
Přístup k objektu písma prostřednictvím GetFont, SetFont a InternalGetFont funkce COleControl
. Uživatel ovládacího prvku bude přistupovat k objektu písma prostřednictvím GetFont
a SetFont
funkcí stejným způsobem jako jakákoli jiná vlastnost Get/Set. Pokud se vyžaduje přístup k objektu písma z ovládacího prvku, použijte InternalGetFont
funkci.
Jak je popsáno v ovládacích prvcích MFC technologie ActiveX: Vlastnosti, přidávání uložených vlastností je snadné pomocí Průvodce přidáním vlastnosti. Zvolíte vlastnost Písmo a Průvodce přidáním vlastnosti automaticky vloží položku Typu zásob do mapy dispečeru ovládacího prvku.
Přidání vlastnosti Písmo akcií pomocí Průvodce přidáním vlastnosti
Načtěte projekt ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Kliknutím pravým tlačítkem myši na uzel rozhraní ovládacího prvku (druhý uzel uzlu knihovny) otevřete místní nabídku.
V místní nabídce klepněte na tlačítko Přidat a potom klepněte na tlačítko Přidat vlastnost.
Tím se otevře Průvodce přidáním vlastnosti.
V poli Název vlastnosti klepněte na tlačítko Písmo.
Klikněte na Finish (Dokončit).
Průvodce přidáním vlastnosti přidá následující řádek do mapy dispečer ovládacího prvku, který se nachází v souboru implementace třídy ovládacího prvku:
DISP_STOCKPROP_FONT()
Průvodce přidáním vlastnosti navíc přidá do ovládacího prvku následující řádek . IDL soubor:
[id(DISPID_FONT)] IFontDisp* Font;
Vlastnost Titulek akcií je příkladem textové vlastnosti, kterou lze nakreslit pomocí informací o vlastnosti Písmo akcií. Přidání vlastnosti Titulek akcií do ovládacího prvku používá kroky podobné těm, které se používají pro vlastnost Písmo akcií.
Přidání vlastnosti Titulek akcií pomocí Průvodce přidáním vlastnosti
Načtěte projekt ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Kliknutím pravým tlačítkem myši na uzel rozhraní ovládacího prvku (druhý uzel uzlu knihovny) otevřete místní nabídku.
V místní nabídce klepněte na tlačítko Přidat a potom klepněte na tlačítko Přidat vlastnost.
Tím se otevře Průvodce přidáním vlastnosti.
V poli Název vlastnosti klikněte na titulek.
Klikněte na Finish (Dokončit).
Průvodce přidáním vlastnosti přidá následující řádek do mapy dispečer ovládacího prvku, který se nachází v souboru implementace třídy ovládacího prvku:
DISP_STOCKPROP_CAPTION()
Úprava funkce OnDraw
Výchozí implementace OnDraw
používá systémové písmo systému Windows pro veškerý text zobrazený v ovládacím prvku. To znamená, že kód musíte upravit OnDraw
výběrem objektu písma do kontextu zařízení. Uděláte to tak, že zavoláte COleControl::SelectStockFont a předáte 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 úpravě funkce tak OnDraw
, aby používal objekt písma, se veškerý text v ovládacím prvku zobrazí s vlastnostmi z stock Font ovládacího prvku.
Použití vlastních vlastností písma v ovládacím prvku
Kromě vlastnosti Stock Font může mít ovládací prvek technologie ActiveX vlastní vlastnosti Písmo. Pokud chcete přidat vlastní vlastnost písma, musíte:
Pomocí Průvodce přidáním vlastnosti implementujte vlastní vlastnost Písmo.
Zpracování oznámení písem
Implementace nového rozhraní pro oznámení písem
Implementace vlastní vlastnosti písma
Pokud chcete implementovat vlastní vlastnost Písmo, pomocí Průvodce přidáním vlastnosti přidejte vlastnost a pak proveďte určité úpravy kódu. Následující části popisují, jak přidat vlastní HeadingFont
vlastnost do ukázkového ovládacího prvku.
Přidání vlastní vlastnosti Písmo pomocí Průvodce přidáním vlastnosti
Načtěte projekt ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Kliknutím pravým tlačítkem myši na uzel rozhraní ovládacího prvku (druhý uzel uzlu knihovny) otevřete místní nabídku.
V místní nabídce klepněte na tlačítko Přidat a potom klepněte na tlačítko Přidat vlastnost.
Tím se otevře Průvodce přidáním vlastnosti.
Do pole Název vlastnosti zadejte název vlastnosti. V tomto příkladu použijte HeadingFont.
Pro typ implementace klepněte na tlačítko Get/Set Metody.
V poli Typ vlastnosti vyberte IDispatch* pro typ vlastnosti.
Klikněte na Finish (Dokončit).
Průvodce přidáním vlastnosti vytvoří kód pro přidání HeadingFont
vlastní vlastnosti do CSampleCtrl
třídy a ukázky. IDL soubor. Protože HeadingFont
je typ vlastnosti Get/Set, Průvodce přidáním vlastnosti upraví CSampleCtrl
mapu odeslání třídy tak, aby zahrnovala položku makra DISP_PROPERTY_EX_IDDISP_PROPERTY_EX :
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
Makro DISP_PROPERTY_EX přidruží HeadingFont
název vlastnosti ke své odpovídající CSampleCtrl
třídě Get a Set metody GetHeadingFont
a SetHeadingFont
. Typ hodnoty vlastnosti je také zadán; v tomto případě VT_FONT.
Průvodce přidáním vlastnosti také přidá deklaraci do souboru záhlaví ovládacího prvku (. H) pro GetHeadingFont
funkce a SetHeadingFont
přidá jejich šablony funkcí do souboru implementace řízení (. 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 Průvodce přidáním vlastnosti upraví ovládací prvek . Soubor IDL přidáním položky pro HeadingFont
vlastnost:
[id(1)] IDispatch* HeadingFont;
Úpravy řídicího kódu
Teď, když jste do ovládacího prvku přidali HeadingFont
vlastnost, musíte provést určité změny v hlavičce ovládacího prvku a implementačních souborech, aby byla nová vlastnost plně podporována.
V souboru záhlaví ovládacího prvku (. H) přidejte následující deklaraci chráněné členské proměnné:
protected:
CFontHolder m_fontHeading;
V souboru implementace ovládacího prvku (. CPP), udělejte toto:
Inicializace m_fontHeading v konstruktoru ovládacího prvku.
CMyAxFontCtrl::CMyAxFontCtrl() : m_fontHeading(&m_xFontNotification) { InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents); }
Deklarujte statickou strukturu FONTDESC 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 };
Do členské funkce ovládacího prvku
DoPropExchange
přidejte volání funkcePX_Font
. To poskytuje inicializaci a trvalost pro vlastní vlastnost Font.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čete implementaci členské funkce ovládacího prvku
GetHeadingFont
.IDispatch* CMyAxFontCtrl::GetHeadingFont(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return m_fontHeading.GetFontDispatch(); }
Dokončete implementaci členské funkce ovládacího prvku
SetHeadingFont
.void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_fontHeading.InitializeFont(&_fontdescHeading, pVal); OnFontChanged(); //notify any changes SetModifiedFlag(); }
Upravte členovou funkci ovládacího prvku
OnDraw
tak, aby definovala proměnnou pro uložení dříve vybraného písma.CFont* pOldHeadingFont;
Upravte členovou funkci ovládacího prvku
OnDraw
tak, aby v kontextu zařízení vybrali vlastní písmo tak, že do kontextu zařízení přidáte následující řádek, kam se má písmo použít.pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
Upravte členovou funkci ovládacího prvku
OnDraw
tak, aby po použití písma vybrali předchozí písmo zpět do kontextu zařízení přidáním následujícího řádku.pdc->SelectObject(pOldHeadingFont);
Po implementaci vlastní vlastnosti Písmo by měla být implementována standardní stránka vlastností Písmo, která umožňuje uživatelům ovládacích prvků změnit aktuální písmo ovládacího prvku. Pokud chcete přidat ID stránky vlastností pro standardní stránku vlastností Písmo, vložte následující řádek za makro BEGIN_PROPPAGEIDS:
PROPPAGEID(CLSID_CFontPropPage)
Parametr počtu BEGIN_PROPPAGEIDS makra musíte také zvýšit o jeden. Následující řádek ukazuje toto:
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
Po provedení těchto změn znovu sestavte celý projekt, aby zahrnoval další funkce.
Zpracování oznámení písem
Ve většině případů musí ovládací prvek vědět, kdy byly změněny vlastnosti objektu písma. Každý objekt písma je schopen poskytovat oznámení, když se změní voláním členské funkce IFontNotification
rozhraní implementovaného COleControl
.
Pokud ovládací prvek používá vlastnost Stock Font, jeho oznámení jsou zpracována OnFontChanged
člen funkce COleControl
. Když přidáte vlastní vlastnosti písma, můžete je použít stejnou implementaci. V příkladu v předchozí části toho bylo dosaženo předáním &m_xFontNotification při inicializaci m_fontHeading členské proměnné.
Implementace rozhraní objektu s více písmy
Plné čáry na obrázku výše ukazují, že oba objekty písma používají stejnou implementaci IFontNotification
. To by mohlo způsobit problémy, pokud chcete rozlišit, které písmo se změnilo.
Jedním ze způsobů, jak rozlišovat mezi oznámeními objektu písma ovládacího prvku, je vytvořit samostatnou implementaci IFontNotification
rozhraní pro každý objekt písma v ovládacím prvku. Tato technika umožňuje optimalizovat kód výkresu aktualizací pouze řetězce nebo řetězců, které používají nedávno změněné písmo. Následující části ukazují kroky nezbytné k implementaci samostatných rozhraní oznámení pro druhou vlastnost Písmo. Druhá vlastnost písma se předpokládá jako HeadingFont
vlastnost přidaná v předchozí části.
Implementace nového rozhraní pro oznámení písem
Aby bylo možné rozlišovat mezi oznámeními dvou nebo více písem, musí být pro každé písmo použité v ovládacím prvku implementováno nové rozhraní oznámení. Následující části popisují, jak implementovat nové rozhraní pro oznámení písem úpravou hlavičky ovládacího prvku a implementačních souborů.
Přidání do hlavičkového souboru
V souboru záhlaví ovládacího prvku (. H), přidejte do deklarace třídy 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í nazývaného HeadingFontNotify
. Toto nové rozhraní obsahuje metodu volanou OnChanged
.
Přidání souboru implementace
V kódu, který inicializuje písmo nadpisu (v konstruktoru ovládacího prvku), změňte &m_xFontNotification na &m_xHeadingFontNotify. Pak 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;
}
Metody AddRef
a Release
metody v IPropertyNotifySink
rozhraní udržují přehled o počtu odkazů pro technologie ActiveX řídicí objekt. Když ovládací prvek získá přístup k ukazateli rozhraní, volání AddRef
ovládacího prvku pro zvýšení počtu odkazů. Jakmile se ovládací prvek dokončí ukazatelem, volá Release
se stejným způsobem, jakým GlobalFree
může být volána k uvolnění globálního bloku paměti. Pokud počet odkazů pro toto rozhraní přejde na nulu, je možné uvolnit implementaci rozhraní. V tomto příkladu QueryInterface
vrátí funkce ukazatel na IPropertyNotifySink
rozhraní konkrétního objektu. Tato funkce umožňuje ovládacímu prvku technologie ActiveX dotazovat objekt, aby určil, jaká rozhraní podporuje.
Po provedení těchto změn v projektu znovu sestavte projekt a pomocí testovacího kontejneru otestujte rozhraní. Informace o přístupu k testovacímu kontejneru najdete v tématu Testování vlastností a událostí s testovacím kontejnerem .
Viz také
MFC – ovládací prvky ActiveX
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í