Sdílet prostřednictvím


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

  1. Načtěte projekt ovládacího prvku.

  2. V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.

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

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

  5. V poli Název vlastnosti klepněte na tlačítko Písmo.

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

  1. Načtěte projekt ovládacího prvku.

  2. V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.

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

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

  5. V poli Název vlastnosti klikněte na titulek.

  6. 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:

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
  1. Načtěte projekt ovládacího prvku.

  2. V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.

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

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

  5. Do pole Název vlastnosti zadejte název vlastnosti. V tomto příkladu použijte HeadingFont.

  6. Pro typ implementace klepněte na tlačítko Get/Set Metody.

  7. V poli Typ vlastnosti vyberte IDispatch* pro typ vlastnosti.

  8. 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í funkce PX_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é.

Implementing multiple font object interfaces.
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á Releasese 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í