Sdílet prostřednictvím


Ovládací prvky MFC ActiveX: Používání písem

Pokud ovládacího prvku ActiveX zobrazí text, můžete povolit uživatelské řízení 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í.Burzovní vlastnosti písma jsou písma preimplemented vlastnosti, které lze přidat pomocí Průvodce přidáním vlastností.Vlastní vlastnosti písma není preimplemented a vývojář tento prvek určuje chování vlastnosti a použití.

Tento článek obsahuje následující témata:

  • Pomocí vlastnosti písma akcií

  • Pomocí vlastní vlastnosti písma v ovládacím prvku.

Pomocí vlastnosti písma akcií

Burzovní vlastnosti písma jsou preimplemented pomocí třídy COleControl.Standardní stránka vlastností písma je navíc také k dispozici, což umožňuje uživateli změnit různé atributy písma objektu, například jeho název, velikost a styl.

Přístup k objektu prostřednictvím písmo GetFont, SetFont, a InternalGetFont funkce COleControl.Řízení uživatel přistupuje prostřednictvím objektu písmo GetFont a SetFont funkce stejným způsobem jako ostatní vlastnost Get a Set.Při přístupu k objektu písma, je nutné v rámci ovládacího prvku použít InternalGetFont funkce.

Jak je popsáno v ovládací prvky MFC ActiveX: vlastnosti, přidání vlastností akcií je snadné se Průvodce přidat vlastnost.Zvolte vlastnosti písma a průvodce Přidat vlastnost automaticky vloží akcií písmo vstupu mapa odeslání ovládacího prvku.

Přidání akcií vlastnosti písma pomocí Průvodce přidáním vlastností

  1. Načtení ovládacího prvku projektu.

  2. V zobrazení třídy rozbalte knihovnu ovládacího prvku.

  3. Uzel rozhraní pro ovládání (druhý uzel uzel knihovny) tlačítkem otevřete místní nabídku.

  4. V místní nabídce klepněte na příkaz Přidat a klepněte na tlačítko Přidat vlastnost.

    Otevře se Průvodce přidáním vlastností.

  5. V Název vlastnosti klepněte na tlačítko písma.

  6. Klepněte na tlačítko Dokončit.

Průvodce přidat vlastnost přidá do mapy odeslání ovládacího prvku, umístěn v souboru třídy implementace řízení následující řádek:

DISP_STOCKPROP_FONT()

Průvodce přidáním vlastností navíc přidá následující řádek na ovládací prvek.IDL souboru:

[id(DISPID_FONT)] IFontDisp*Font;

Vlastnost Titulek akcií je příkladem vlastnost text, který lze stanovit pomocí burzovní informace vlastnosti písma.Přidání vlastnosti Titulek populace na ovládací prvek používá kroky podobné populace vlastnosti písma.

Přidat zásobní vlastnost titulek pomocí Průvodce přidáním vlastností

  1. Načtení ovládacího prvku projektu.

  2. V zobrazení třídy rozbalte knihovnu ovládacího prvku.

  3. Uzel rozhraní pro ovládání (druhý uzel uzel knihovny) tlačítkem otevřete místní nabídku.

  4. V místní nabídce klepněte na příkaz Přidat a klepněte na tlačítko Přidat vlastnost.

    Otevře se Průvodce přidáním vlastností.

  5. V Název vlastnosti klepněte na tlačítko Titulek.

  6. Klepněte na tlačítko Dokončit.

Průvodce přidat vlastnost přidá do mapy odeslání ovládacího prvku, umístěn v souboru třídy implementace řízení následující řádek:

DISP_STOCKPROP_CAPTION()

Změna funkce OnDraw

Výchozí implementace OnDraw písmo systému Windows používá pro text v ovládacím prvku.To znamená, že je třeba upravit OnDraw kód výběrem písem objektu do kontextu zařízení.To provedete volání COleControl::SelectStockFont a předat ovládacího prvku kontext zařízení, 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 upravena funkce použít objekt písma, je zobrazen text v ovládacím prvku s vlastnostmi z akcií vlastnosti Font ovládacího prvku.

Pomocí vlastní vlastnosti písma v ovládacím prvku.

Kromě akcií vlastnosti písma, můžete ovládací prvek ActiveX mají vlastní vlastnosti písma.Přidání vlastnosti vlastní písmo musí:

  • Pomocí Průvodce přidáním vlastností implementovat vlastní vlastnosti písma.

  • Zpracování oznámení písma.

  • Implementace nového rozhraní oznámení písma.

ay7tx1x6.collapse_all(cs-cz,VS.110).gifProvádění vlastní vlastnosti písma

Chcete-li implementovat vlastní vlastnosti písma pomocí průvodce Přidat vlastnost přidat vlastnost a potom provést některé úpravy kódu.Následující části popisují, jak přidat vlastní HeadingFont vlastnost ovládacího prvku vzorku.

Přidat vlastní vlastnosti písma pomocí Průvodce přidáním vlastností

  1. Načtení ovládacího prvku projektu.

  2. V zobrazení třídy rozbalte knihovnu ovládacího prvku.

  3. Uzel rozhraní pro ovládání (druhý uzel uzel knihovny) tlačítkem otevřete místní nabídku.

  4. V místní nabídce klepněte na příkaz Přidat a klepněte na tlačítko Přidat vlastnost.

    Otevře se Průvodce přidáním vlastností.

  5. V Název vlastnosti zadejte název vlastnosti.Například pomocí HeadingFont.

  6. Pro Typ implementace, klepněte na tlačítko Metody Get a Set.

  7. V Vlastnost typu vyberte položku IDispatch * pro typ vlastnosti.

  8. Klepněte na tlačítko Dokončit.

Přidat vlastnost vytvoří kód, který chcete přidat HeadingFont vlastní vlastnost CSampleCtrl třídy a vzorek.IDL souboru.Protože HeadingFont je vlastnost typu Get a Set upraví vlastnosti průvodce Přidat CSampleCtrl třídy odeslání mapy zahrnout DISP_PROPERTY_EX_IDDISP_PROPERTY_EX položku Makro:

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

DISP_PROPERTY_EX Associates makro HeadingFont název vlastnosti s jeho odpovídající CSampleCtrl třídy získání a nastavení metody, GetHeadingFont a SetHeadingFont.Typ hodnoty vlastnosti je také určen; v tomto případě VT_FONT.

Průvodce přidat vlastnost přidá prohlášení v záhlaví souboru ovládacího prvku (.H) pro GetHeadingFont a SetHeadingFont funkce a přidá soubor řízení provádění jejich funkce šablony (.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 změní vlastnosti Průvodce přidáním ovládacího prvku.IDL souboru přidáním položky pro HeadingFont vlastnosti:

[id(1)] IDispatch* HeadingFont;

ay7tx1x6.collapse_all(cs-cz,VS.110).gifKód řízení změn

Nyní, když jste přidali HeadingFont vlastnost ovládacího prvku, je nutné provést některé změny soubory záhlaví a provádění řízení plně podporuje nové vlastnosti.

V záhlaví souboru ovládacího prvku (.H) přidejte následující prohlášení chráněné členské proměnné:

protected:
   CFontHolder m_fontHeading;

Řízení provádění souboru (.CPP), proveďte následující:

  • Inicializace m_fontHeading v konstruktoru ovládacího prvku.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Statické deklarovat 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 perzistence pro vaše vlastní 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čit provádění ovládací prvek GetHeadingFont členské funkce.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Dokončit provádění ovládací prvek 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ího řádku vždy, když se použije písmo vyberte vlastní písma 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 po používá písmo vyberte písmo předchozí zpět do kontextu zařízení.

    pdc->SelectObject(pOldHeadingFont);
    

Po uplatňovat vlastní vlastnosti písma standardní stránka vlastností písma musí být provedeny, umožňující uživatelům změnit aktuální písmo ovládacího prvku řízení.Chcete-li přidat vlastnost ID stránky pro standardní stránku vlastností písma vložit za následující řádek BEGIN_PROPPAGEIDS makro:

PROPPAGEID(CLSID_CFontPropPage)

Musí také zvýšit počet parametr vaše BEGIN_PROPPAGEIDS jedním makro.Následující řádek zobrazuje toto:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Po provedení změny znovu sestavit celý projekt začlenit další funkce.

ay7tx1x6.collapse_all(cs-cz,VS.110).gifZpracování oznámení písma

Ve většině případů potřebuje vědět, kdy byly změněny vlastnosti písma objekt ovládacího prvku.Každý objekt písmo je schopný oznámení při změně voláním funkce člena IFontNotification rozhraní implementované COleControl.

Pokud ovládací prvek používá akcií vlastnosti písma, jeho oznámení jsou zpracována OnFontChanged členské funkce COleControl.Při přidání vlastnosti vlastní písma mohou uživatelé použít stejné provedení.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 více písem

Implementace více rozhraní objektů písma

Plné čáry na výše uvedeném obrázku zobrazit oba objekty písma pomocí stejné provádění IFontNotification.Pokud jste chtěli odlišit změnit písmo, které to může způsobit potíže.

Jedním způsobem, jak rozlišit oznámení objekt ovládacího prvku písmo je 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 aktualizací pouze řetězec nebo řetězce, které naposledy změněné písmo.V následujících částech prokázat kroky potřebné k implementaci rozhraní samostatné oznámení druhé vlastnosti písma.Druhou vlastností písma považován HeadingFont vlastnost, která byla přidána v předchozí části.

ay7tx1x6.collapse_all(cs-cz,VS.110).gifImplementace nového rozhraní oznámení písma

Chcete-li rozlišovat mezi oznámení dvě nebo více písem, musí provést nové rozhraní oznámení pro každé písmo použité v ovládacím prvku.Následující části popisují, jak implementovat rozhraní oznámení písmo úpravou souborů záhlaví a provádění kontroly.

ay7tx1x6.collapse_all(cs-cz,VS.110).gifDodatky k souboru záhlaví

V záhlaví souboru ovládacího prvku (.H) přidejte následující řádky deklarace třídy:

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í s názvem HeadingFontNotify.Nové rozhraní obsahuje metodu s názvem OnChanged.

ay7tx1x6.collapse_all(cs-cz,VS.110).gifDodatky k souboru implementace

Změna v kódu, který inicializuje písmo nadpisu (v konstruktoru řízení), &m_xFontNotification na &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 metod IPropertyNotifySink rozhraní udržení přehledu o počet odkazů pro objekt ovládacího prvku ActiveX.Když ovládací prvek získává přístup k ukazatel rozhraní, volá ovládací prvek AddRef přibývá počet odkazů.Po dokončení ovládací prvek s ukazatelem volá Release, mnohem stejným způsobem, že GlobalFree může být například volného bloku globální paměti.Pokud počet odkazů pro toto rozhraní na nulu, může být uvolněno implementaci rozhraní.V tomto příkladu QueryInterface funkce vrací ukazatel IPropertyNotifySink rozhraní pro daný objekt.Tato funkce umožňuje ovládací prvek ActiveX objektu zjistit, co je rozhraní podporuje dotaz.

Po provedení těchto změn do projektu sestavte projekt znovu a kontejner Test slouží k testování rozhraní.Viz testování vlastnosti a události s kontejnerem Test informace o přístup k testovací kontejner.

Viz také

Referenční dokumentace

Ovládací prvky MFC ActiveX: Ovládací prvek ActiveX pomocí obrázků

Ovládací prvky MFC ActiveX: Použití stránek vlastností v zásobách

Koncepty

Ovládací prvky MFC ActiveX