Delen via


MFC ActiveX-besturingselementen: lettertypen gebruiken

Als in uw ActiveX-besturingselement tekst wordt weergegeven, kunt u de gebruiker van het besturingselement toestaan het uiterlijk van de tekst te wijzigen door een lettertype-eigenschap te wijzigen. Lettertype-eigenschappen worden geïmplementeerd als objecten en kunnen een van de volgende twee typen zijn: standaard of aangepast. Standaard lettertype-eigenschappen zijn vooraf geïmplementeerde lettertype-eigenschappen die u kunt toevoegen met behulp van de Wizard Eigenschap Toevoegen. Aangepaste lettertype-eigenschappen worden niet vooraf geïmplementeerd en de besturingselementontwikkelaar bepaalt het gedrag en het gebruik van de eigenschap.

In dit artikel worden de volgende onderwerpen behandeld:

De eigenschap Aandelenlettertype gebruiken

Voorgeïnstalleerde lettertype-eigenschappen zijn geïmplementeerd door de klasse COleControl. Daarnaast is er ook een standaardpagina voor lettertype-eigenschappen beschikbaar, zodat de gebruiker verschillende kenmerken van het lettertypeobject kan wijzigen, zoals de naam, grootte en stijl.

Open het lettertypeobject via de functies GetFont, SetFont en InternalGetFont.COleControl De besturingselementgebruiker heeft toegang tot het lettertypeobject via de GetFont en SetFont functies op dezelfde manier als elke andere eigenschap Ophalen/instellen. Wanneer toegang tot het lettertypeobject is vereist vanuit een besturingselement, gebruikt u de InternalGetFont functie.

Zoals besproken in MFC ActiveX-besturingselementen: Eigenschappen, het toevoegen van voorraadeigenschappen is eenvoudig met de wizard Eigenschap toevoegen. U kiest de Lettertype-eigenschap en de wizard Eigenschap toevoegen voegt automatisch de standaard Lettertype-invoer toe aan de dispatch map van het besturingselement.

De standaard Lettertype-eigenschap toevoegen met behulp van de Wizard Eigenschap Toevoegen

  1. Laad het project van uw besturingselement.

  2. Vouw in de klasseweergave het bibliotheekknooppunt van uw besturingselement uit.

  3. Klik met de rechtermuisknop op het interfaceknooppunt voor uw besturingselement (het tweede knooppunt van het bibliotheekknooppunt) om het snelmenu te openen.

  4. Klik in het snelmenu op Toevoegen en klik vervolgens op Eigenschap toevoegen.

    Hiermee opent u de Wizard Eigenschap Toevoegen.

  5. Klik in het vak Eigenschapsnaam op Lettertype.

  6. Klik op Voltooien.

De Eigenschap toevoegen wizard voegt de volgende regel toe aan de dispatch-map van de control, die zich in het implementatiebestand van de controlklasse bevindt.

DISP_STOCKPROP_FONT()

Bovendien voegt de wizard Eigenschap toevoegen de volgende regel toe aan het besturingselement .IDL-bestand:

[id(DISPID_FONT)] IFontDisp* Font;

De standaard Bijschrift-eigenschap is een voorbeeld van een teksteigenschap die kan worden weergegeven met behulp van de standaard Lettertype-eigenschap. Door de eigenschap voorraadbijschrift aan het besturingselement toe te voegen, worden stappen gebruikt die vergelijkbaar zijn met die voor de voorraad Lettertype-eigenschap.

De eigenschap Stock Caption toevoegen met behulp van de Wizard Eigenschap Toevoegen

  1. Laad het project van uw besturingselement.

  2. Vouw in de klasseweergave het bibliotheekknooppunt van uw besturingselement uit.

  3. Klik met de rechtermuisknop op het interfaceknooppunt voor uw besturingselement (het tweede knooppunt van het bibliotheekknooppunt) om het snelmenu te openen.

  4. Klik in het snelmenu op Toevoegen en klik vervolgens op Eigenschap toevoegen.

    Hiermee opent u de Wizard Eigenschap Toevoegen.

  5. Klik in het vak Eigenschapsnaam op Bijschrift.

  6. Klik op Voltooien.

De Eigenschap toevoegen wizard voegt de volgende regel toe aan de dispatch-map van de control, die zich in het implementatiebestand van de controlklasse bevindt.

DISP_STOCKPROP_CAPTION()

De functie OnDraw wijzigen

De standaardimplementatie van OnDraw gebruikt het Windows-systeemlettertype voor alle tekst die in het besturingselement wordt weergegeven. Dit betekent dat u de OnDraw code moet wijzigen door het lettertypeobject te selecteren in de apparaatcontext. Hiervoor roept u COleControl::SelectStockFont aan en geeft u de apparaatcontext van het besturingselement door, zoals wordt weergegeven in het volgende voorbeeld:

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);

Nadat de OnDraw functie is gewijzigd om het lettertypeobject te gebruiken, wordt alle tekst in het besturingselement weergegeven met kenmerken van de eigenschap Lettertype van het besturingselement.

Aangepaste lettertype-eigenschappen gebruiken in uw controle-element

Naast de standaard Lettertype-eigenschap kan het ActiveX-besturingselement aangepaste Lettertype-eigenschappen hebben. Als u een aangepaste lettertype-eigenschap wilt toevoegen, moet u het volgende doen:

Een aangepaste lettertype-eigenschap implementeren

Als u een aangepaste eigenschap Lettertype wilt implementeren, gebruikt u de wizard Eigenschap toevoegen om de eigenschap toe te voegen en vervolgens enkele wijzigingen aan te brengen in de code. In de volgende secties wordt beschreven hoe u de aangepaste HeadingFont eigenschap toevoegt aan het voorbeeldcontrole.

De aangepaste Font-eigenschap toevoegen met de wizard Eigenschap toevoegen
  1. Laad het project van uw besturingselement.

  2. Vouw in de klasseweergave het bibliotheekknooppunt van uw besturingselement uit.

  3. Klik met de rechtermuisknop op het interfaceknooppunt voor uw besturingselement (het tweede knooppunt van het bibliotheekknooppunt) om het snelmenu te openen.

  4. Klik in het snelmenu op Toevoegen en klik vervolgens op Eigenschap toevoegen.

    Hiermee opent u de Wizard Eigenschap Toevoegen.

  5. Typ in het vak Eigenschapsnaam een naam voor de eigenschap. Gebruik in dit voorbeeld HeadingFont.

  6. Klik voor implementatietype op Methoden ophalen/instellen.

  7. Selecteer in het vak EigenschapstypeIDispatch* voor het type van de eigenschap.

  8. Klik op Voltooien.

Met de wizard Eigenschap toevoegen wordt de code gemaakt om de HeadingFont aangepaste eigenschap toe te voegen aan de CSampleCtrl klasse en het VOORBEELD. IDL-bestand. Omdat HeadingFont een Get/Set-eigenschapstype is, wijzigt de wizard Eigenschap toevoegen de dispatcherkaart van de CSampleCtrl klasse om een DISP_PROPERTY_EX_ID DISP_PROPERTY_EX macro-invoer op te nemen.

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

De DISP_PROPERTY_EX macro koppelt de HeadingFont eigenschapsnaam aan de bijbehorende CSampleCtrl methoden Ophalen en instellen, GetHeadingFont en SetHeadingFont. Het type eigenschapswaarde wordt ook opgegeven; in dit geval VT_FONT.

Met de wizard Eigenschap toevoegen wordt ook een declaratie toegevoegd aan het besturingselementheaderbestand (.H) voor de GetHeadingFont- en SetHeadingFont-functies, en hun functiesjablonen worden toegevoegd in het besturingselementimplementatiebestand (.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();
}

Ten slotte wijzigt de wizard Eigenschap toevoegen de .IDL-bestand van het besturingselement door een vermelding voor de HeadingFont eigenschap toe te voegen:

[id(1)] IDispatch* HeadingFont;

Wijzigingen in de besturingscode

Nu u de HeadingFont eigenschap aan het besturingselement hebt toegevoegd, moet u enkele wijzigingen aanbrengen in de besturingselementheader- en implementatiebestanden om de nieuwe eigenschap volledig te ondersteunen.

In het headerbestand van het besturingselement (. H), voeg de volgende declaratie toe van een beveiligde lidvariabele:

protected:
   CFontHolder m_fontHeading;

In het besturingsimplementatiebestand (.CPP), ga als volgt te werk:

  • Initialiseer m_fontHeading in de besturingsconstructor.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
       InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Declareer een statische FONTDESC-structuur met standaardkenmerken van het lettertype.

    static const FONTDESC _fontdescHeading =
    { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE(12), FW_BOLD,
      ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • Voeg in de lidfunctie van het DoPropExchange besturingselement een aanroep naar de PX_Font functie toe. Dit biedt initialisatie en persistentie voor uw aangepaste lettertype-eigenschap.

    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);
    }
    
  • Voltooi de implementatie van de besturingslidfunctie GetHeadingFont.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Voltooi de implementatie van de besturingslidfunctie SetHeadingFont.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Wijzig de functie van het besturingselementlid OnDraw om een variabele te definiëren die het eerder geselecteerde lettertype bevat.

    CFont* pOldHeadingFont;
    
  • Wijzig de functie besturingselementlid OnDraw om het aangepaste lettertype te selecteren in de apparaatcontext door de volgende regel toe te voegen waar het lettertype moet worden gebruikt.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Wijzig de functie van het besturingselementlid OnDraw om het vorige lettertype weer in de apparaatcontext te selecteren door de volgende regel toe te voegen nadat het lettertype is gebruikt.

    pdc->SelectObject(pOldHeadingFont);
    

Nadat de aangepaste eigenschap Lettertype is geïmplementeerd, moet de standaard eigenschapspagina voor het lettertype worden geïmplementeerd, zodat gebruikers van de bedieningsinterface het huidige lettertype van de interface kunnen wijzigen. Als u de id van de eigenschapspagina voor de standaard lettertypepagina wilt toevoegen, voegt u de volgende regel in na de BEGIN_PROPPAGEIDS-macro:

PROPPAGEID(CLSID_CFontPropPage)

U moet ook de tellingsparameter van uw BEGIN_PROPPAGEIDS macro met één verhogen. De volgende regel illustreert dit:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Nadat deze wijzigingen zijn aangebracht, bouwt u het hele project opnieuw op om de extra functionaliteit op te nemen.

Lettertypemeldingen verwerken

In de meeste gevallen moet het besturingselement weten wanneer de kenmerken van het lettertypeobject zijn gewijzigd. Elk lettertypeobject kan meldingen geven wanneer het wordt gewijzigd door een lidfunctie van de IFontNotification interface aan te roepen, geïmplementeerd door COleControl.

Als het besturingselement de standaard Lettertype-eigenschap gebruikt, worden de meldingen verwerkt door de lidfunctie van OnFontChanged van COleControl. Wanneer u aangepaste lettertype-eigenschappen toevoegt, kunt u deze dezelfde implementatie laten gebruiken. In het voorbeeld in de vorige sectie is dit bereikt door &m_xFontNotification door te geven bij het initialiseren van de variabele m_fontHeading lid.

Meerdere lettertypeobjectinterfaces implementeren.
Meerdere lettertypeobjectinterfaces implementeren

De ononderbroken lijnen in de bovenstaande afbeelding laten zien dat beide lettertypeobjecten dezelfde implementatie van IFontNotificationgebruiken. Dit kan problemen veroorzaken als u wilt onderscheiden welk lettertype is gewijzigd.

Een manier om onderscheid te maken tussen de meldingen van het lettertype-object van de control is door voor elk lettertype-object in de control een afzonderlijke implementatie van de IFontNotification interface te maken. Met deze techniek kunt u de tekencode optimaliseren door alleen de tekenreeks of tekenreeksen bij te werken die gebruikmaken van het onlangs gewijzigde lettertype. In de volgende secties ziet u de stappen die nodig zijn voor het implementeren van afzonderlijke meldingsinterfaces voor een tweede lettertype-eigenschap. De tweede lettertypeeigenschap wordt ervan uitgegaan dat deze de HeadingFont eigenschap is die in de vorige sectie is toegevoegd.

Een nieuwe lettertypemeldingsinterface implementeren

Als u onderscheid wilt maken tussen de meldingen van twee of meer lettertypen, moet er een nieuwe meldingsinterface worden geïmplementeerd voor elk lettertype dat in het besturingselement wordt gebruikt. In de volgende secties wordt beschreven hoe u een nieuwe meldingsinterface voor lettertypen implementeert door de besturingsheader- en implementatiebestanden te wijzigen.

Toevoegingen aan het headerbestand

In het headerbestand van het besturingselement (. H), voeg de volgende regels toe aan de klassedeclaratie:

protected:
   BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
      INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
      STDMETHOD(OnRequestEdit)(DISPID);
   STDMETHOD(OnChanged)(DISPID);
   END_INTERFACE_PART(HeadingFontNotify)

Hiermee maakt u een implementatie van de IPropertyNotifySink interface genaamd HeadingFontNotify. Deze nieuwe interface bevat een methode met de naam OnChanged.

Toevoegingen aan het implementatiebestand

Wijzig &m_xFontNotification in &m_xHeadingFontNotify in de code waarmee het lettertype voor de kop wordt geïnitialiseerd (in de besturingselementconstructor). Voeg vervolgens de volgende code toe:

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;
}

De AddRef en Release methoden in de IPropertyNotifySink interface houden het aantal verwijzingen voor het ActiveX-besturingsobject bij. Wanneer het besturingselement toegang krijgt tot de interfacepointer, roept het besturingselement AddRef aan om het aantal verwijzingen te verhogen. Wanneer het besturingselement klaar is met de aanwijzer, roept het Release op, op vrijwel dezelfde manier als GlobalFree kan worden aangeroepen om een globaal geheugenblok vrij te maken. Wanneer het aantal verwijzingen voor deze interface naar nul gaat, kan de interface-implementatie worden vrijgemaakt. In dit voorbeeld retourneert de QueryInterface functie een aanwijzer naar een interface van een IPropertyNotifySink bepaald object. Met deze functie kan een ActiveX-besturingselement een query uitvoeren op een object om te bepalen welke interfaces het ondersteunt.

Nadat deze wijzigingen zijn aangebracht in uw project, bouwt u het project opnieuw en gebruikt u Testcontainer om de interface te testen. Zie Eigenschappen en gebeurtenissen testen met testcontainer voor informatie over het openen van de testcontainer.

Zie ook

MFC ActiveX-besturingselementen
MFC ActiveX-besturingselementen: afbeeldingen gebruiken in een ActiveX-besturingselement
MFC ActiveX-besturingselementen: Gebruikmaken van standaard-eigenschappenpagina's