MFC-ActiveX-Steuerelemente: Verwenden der Schriftarten

Wenn die ActiveX-Steuerelement-Anzeigen simsen, können Sie dem Steuerelement Benutzern ermöglichen, die Darstellung des Texts ändern, indem Sie eine Schriftarteigenschaft ändern.Schriftarteigenschaften werden als Schriftart Objekte implementiert und kann einer der beiden Typen aufweisen: Vorrat oder Benutzerdefiniert aus.Vordefinierte Schriftarteigenschaften sind preimplemented Schriftarteigenschaften, die Sie mithilfe des Assistenten zum Hinzufügen von Eigenschaften hinzufügen können.Benutzerdefinierte Schriftarteigenschaften preimplemented nicht und Steuerelemententwickler spezifisch der das Verhalten und die Verwendung Eigenschaft.

Dieser Artikel enthält die folgenden Themen:

  • Verwenden von vordefinierten Schriftarteigenschaft

  • Verwenden benutzerdefinierter Schriftarteigenschaften des Steuerelements

Verwenden von vordefinierten Schriftarteigenschaft

Vordefinierte Schriftarteigenschaften preimplemented von der Klasse COleControl.Zusätzlich wird eine standardmäßige schriftarteigenschaften auch Seite zur Verfügung und ermöglicht dem Benutzer zu den verschiedenen Attributen mithilfe der Änderung des Objekts Schriftart, z. B. ihren Namen, Größe und Format.

Öffnen Sie das Objekt von der GetFont, Schriftart und SetFontInternalGetFont-Funktionen von COleControl.Der Steuerelements Benutzer greift auf das Objekt über die GetFont Schriftart und SetFont-Funktionen auf dieselbe Weise wie jede andere Get/Set-Eigenschaft.Beim Zugriff auf das Objekt Schriftart aus einem Steuerelement erforderlich ist, verwenden Sie die InternalGetFont-Funktion.

Wie in MFC-ActiveX-Steuerelemente: Eigenschaften erläutert, vordefinierte Eigenschaften ist einfach Assistent zum Hinzufügen von Eigenschaften mit hinzuzufügen.Wählen Sie die Schriftarteigenschaft, und der Assistent zum Hinzufügen von Eigenschaften fügt automatisch den vordefinierten Schriftart in die Dispatchzuordnung des Steuerelements ein.

Um die Schriftarteigenschaft vordefinierte mit dem Assistenten zum Hinzufügen von Eigenschaften hinzufügen

  1. Laden Sie das Projekt des Steuerelements.

  2. Erweitern Sie in der Klassenansicht den Knoten Bibliothek des Steuerelements.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten Schnittstellen für das Steuerelement (der zweite Knoten des Knotens Bibliothek), um das Kontextmenü zu öffnen.

  4. Klicken Sie im Kontextmenü auf Hinzufügen und klicken Sie dann auf Eigenschaft hinzufügen.

    Dadurch wird der Assistent zum Hinzufügen von Eigenschaften.

  5. Im Feld Eigenschaftenname auf Schriftart.

  6. Klicken Sie auf Fertig stellen.

Der Assistent zum Hinzufügen von Eigenschaften fügt die nächste Zeile der Dispatchzuordnung des Steuerelements hinzu, in der Steuerelementklassen implementierungsdatei:

DISP_STOCKPROP_FONT()

Darüber hinaus fügt der Assistent zum Hinzufügen von Eigenschaften des Steuerelements idl-datei die folgende Zeile hinzu:

[id(DISPID_FONT)] IFontDisp*Font;

Die vordefinierte Caption-Eigenschaft ist ein Beispiel für eine Texteigenschaft, die mithilfe der vordefinierten Informationen über Schriftarteigenschaften gezeichnet werden kann.Die vordefinierte Caption-Eigenschaft zu dem Steuerelement hinzufügen, wird die Schritte, die in denen ähneln, die für die vordefinierte Schriftarteigenschaft verwendet werden.

Um die Caption-Eigenschaft vordefinierte mit dem Assistenten zum Hinzufügen von Eigenschaften hinzufügen

  1. Laden Sie das Projekt des Steuerelements.

  2. Erweitern Sie in der Klassenansicht den Knoten Bibliothek des Steuerelements.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten Schnittstellen für das Steuerelement (der zweite Knoten des Knotens Bibliothek), um das Kontextmenü zu öffnen.

  4. Klicken Sie im Kontextmenü auf Hinzufügen und klicken Sie dann auf Eigenschaft hinzufügen.

    Dadurch wird der Assistent zum Hinzufügen von Eigenschaften.

  5. Im Feld Eigenschaftenname auf Beschriftung.

  6. Klicken Sie auf Fertig stellen.

Der Assistent zum Hinzufügen von Eigenschaften fügt die nächste Zeile der Dispatchzuordnung des Steuerelements hinzu, in der Steuerelementklassen implementierungsdatei:

DISP_STOCKPROP_CAPTION()

Die OnDraw-Funktion ändern

Die Standardimplementierung von OnDraw Windows-System werden die Schriftart für den gesamten Text, der im Steuerelement angezeigt wird.Dies bedeutet, dass Sie den Code ändern müssen OnDraw, indem Sie das Objekt in den Gerätekontext Schriftart auswählen.Dazu rufen Sie COleControl::SelectStockFont auf, und übergeben Sie den Gerätekontext des Steuerelementstarttags, wie im folgenden Beispiel gezeigt:

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

Nachdem die OnDraw-Funktion geändert wurde, um das Objekt zu verwendende Schriftart wird jeder Text innerhalb des Steuerelements mit Eigenschaften der Schriftarteigenschaft der Vorrat des Steuerelements angezeigt.

Verwenden benutzerdefinierter Schriftarteigenschaften des Steuerelements

Neben der vordefinierten Schriftarteigenschaft kann das ActiveX-Steuerelement benutzerdefinierte Schriftarteigenschaften haben.So erstellen Sie eine benutzerdefinierte Schriftarteigenschaft hinzufügen müssen Sie Folgendes:

  • Verwenden Sie den Assistenten zum Hinzufügen von Eigenschaften, um die benutzerdefinierte Schriftarteigenschaft zu implementieren.

  • Verarbeiten von Benachrichtigungen Schriftart.

  • Eine neue Schnittstelle implementieren benachrichtigungs Schriftart.

ay7tx1x6.collapse_all(de-de,VS.110).gifEine benutzerdefinierte Schriftarteigenschaft implementieren

So implementieren Sie eine benutzerdefinierte Schriftarteigenschaft, verwenden Sie den Assistenten zum Hinzufügen von Eigenschaften, um die Eigenschaft hinzuzufügen und einige Änderungen am Code.In den folgenden Abschnitten wird beschrieben, wie Sie die benutzerdefinierte HeadingFont-Eigenschaft zum Beispiel die Steuerung hinzugefügt wird.

Um die benutzerdefinierte Schriftarteigenschaft mithilfe des Assistenten zum Hinzufügen von Eigenschaften hinzufügen

  1. Laden Sie das Projekt des Steuerelements.

  2. Erweitern Sie in der Klassenansicht den Knoten Bibliothek des Steuerelements.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten Schnittstellen für das Steuerelement (der zweite Knoten des Knotens Bibliothek), um das Kontextmenü zu öffnen.

  4. Klicken Sie im Kontextmenü auf Hinzufügen und klicken Sie dann auf Eigenschaft hinzufügen.

    Dadurch wird der Assistent zum Hinzufügen von Eigenschaften.

  5. Geben Sie im Feld Eigenschaftenname Geben Sie einen Namen für die Eigenschaft ein.In diesem Beispiel verwenden Sie HeadingFont.

  6. Für Implementierungstyp Klicken Sie auf Get/Set-Methoden.

  7. Im Eigenschaftentyp Feld den Eintrag IDispatch* für den Typ der Eigenschaft.

  8. Klicken Sie auf Fertig stellen.

Der Assistent zum Hinzufügen von Eigenschaften erstellt den Code, um die benutzerdefinierte Eigenschaft HeadingFont der CSampleCtrl-Klasse und der SAMPLE.IDL-Datei hinzuzufügen.Da ein HeadingFont Get/Set-Eigenschaftentyp ist, ändert der Assistent zum Hinzufügen von Eigenschaften die Dispatchzuordnung der CSampleCtrl-Klasse, um einen DISP_PROPERTY_EX_IDDISP_PROPERTY_EX Eintrag Makros einzuschließen:

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

Das DISP_PROPERTY_EX Makro ordnet den HeadingFont-Eigenschaftennamen die entsprechende CSampleCtrl-Klasse GetHeadingFont get- und set-Methoden, und SetHeadingFont.Der Typ des Eigenschaftswerts. Darüber hinaus wird angegeben. in diesem Fall VT_FONT.

Der Assistent zum Hinzufügen von Eigenschaften auch eine Deklaration in der headerdatei (Steuerelements hinzu. H) für GetHeadingFont und SetHeadingFont funktioniert und fügt die zugehörigen Funktionen von implementierungsdatei Steuerelements in der .CPP hinzu (:)

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

Schließlich ändert der Assistent zum Hinzufügen von Eigenschaften idl-datei das Steuerelement, indem er einen Eintrag für die HeadingFont-Eigenschaft hinzugefügt wird:

[id(1)] IDispatch* HeadingFont;

ay7tx1x6.collapse_all(de-de,VS.110).gifÄnderungen an den Steuerungscode

Nachdem Sie die HeadingFont-Eigenschaft für das Steuerelement hinzugefügt haben, müssen Sie einige Änderungen am Steuerelement vorgenommen Header und die Implementierungsdateien, um die neue Eigenschaft vollständig zu unterstützen.

In der headerdatei (Steuerelements. H), fügen Sie die folgende Deklaration einer geschützten Membervariable hinzu:

protected:
   CFontHolder m_fontHeading;

In der implementierungsdatei (.CPP), gehen Sie wie folgt vor:

  • Initialisieren Sie im Konstruktor des Steuerelements m_fontHeading.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Deklarieren Sie eine statische FONTDESC-Struktur, die Standardattribute der Schriftart enthält.

    static const FONTDESC _fontdescHeading =
      { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
        ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • In der Steuerelement DoPropExchange-Memberfunktion fügen Sie einen Aufruf der Funktion PX_Font hinzu.Dadurch wird die Initialisierung für die benutzerdefinierte Dauerhaftigkeit und Schriftarteigenschaft bereit.

    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);
    }
    
  • Ende GetHeadingFont-Steuerelement, das die Memberfunktion implementiert.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Ende SetHeadingFont-Steuerelement, das die Memberfunktion implementiert.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Ändern Sie die Steuerelement OnDraw-Memberfunktion, um eine Variable zu definieren, um die zuvor ausgewählte Schriftart enthält.

    CFont* pOldHeadingFont;
    
  • Ändern Sie die Memberfunktion OnDraw-Steuerelement, von dem die benutzerdefinierte Schriftart in den Gerätekontext ausgewählt werden, indem Sie die folgende Zeile hinzu, wo die Schriftart verwendet werden soll.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Ändern Sie die Steuerelement OnDraw-Memberfunktion, um die vorherige Schriftart zurück in den Gerätekontext ausgewählt werden, indem Sie die folgende Zeile hinzu, nachdem die Schriftart verwendet wurde.

    pdc->SelectObject(pOldHeadingFont);
    

Nachdem die benutzerdefinierte Schriftarteigenschaft implementiert wurde, sollte der Seite schriftarteigenschaften Steuerelements implementiert und Benutzern ermöglichen, die aktuelle Schriftart des Steuerelements zu ändern.Um die Eigenschaftenseite ID für die Seite schriftarteigenschaften hinzuzufügen, fügen Sie die folgende Zeile nach dem BEGIN_PROPPAGEIDS Makro eingefügt:

PROPPAGEID(CLSID_CFontPropPage)

Sie müssen den Anzahl von Parametern des BEGIN_PROPPAGEIDS auch durch Makros um eins erhöht werden.Die folgende Zeile veranschaulicht dies:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Nachdem diese Änderungen vorgenommen wurden, neu erstellen Sie das gesamte Projekt, die zusätzliche Funktionalität einzuschließen.

ay7tx1x6.collapse_all(de-de,VS.110).gifVerarbeiten Schriftart-Benachrichtigungen

In den meisten Fällen muss es wissen, wann die Schriftart Eigenschaften des Objekts geändert wurden.Jedes Schriftart Objekt ist für die Bereitstellung von Benachrichtigungen in der Lage, wenn es geändert wird, indem er eine Memberfunktion der IFontNotification-Schnittstelle aufruft, um COleControl implementiert.

Wenn das Steuerelement die vordefinierte Schriftarteigenschaft verwendet, werden die Benachrichtigungen von der OnFontChanged-Memberfunktion von COleControl bearbeitet.Wenn Sie benutzerdefinierte Schriftarteigenschaften hinzufügen, können Sie sie die gleiche Implementierung verwenden können.Im Beispiel im vorherigen Abschnitt wurde dies erreicht, indem &m_xFontNotification übergeben, als Membervariable, die m_fontHeading Initialisieren.

Implementieren mehrerer Schnittstellen für Schriftartobjekte

Implementieren mehrerer Schnittstellen für Schriftartobjekte

Die durchgezogenen Linien stellen in der Abbildung oben gezeigt, dass beide Schriftart Objekte dieselbe Implementierung von IFontNotification verwenden.Dies kann Probleme verursachen, wenn Sie unterscheiden möchten, die Schriftart geändert wurde.

Eine Möglichkeit, zwischen den Benachrichtigungen des Steuerelements für die Schriftart unterschieden, ist eine separate Implementierung der Schnittstelle IFontNotification Schriftart für jedes Objekt im Steuerelement zu erstellen.Diese Methode ermöglicht es Ihnen, den Code für das Zeichnen, indem nur die Zeichenfolge optimiert, aktualisiert oder Zeichenfolgen, die die zuletzt geänderte Schriftart verwenden.In den folgenden Abschnitten sind die Schritte, die erforderlich sind, um separate Benachrichtigung Schnittstellen für eine zweite Schriftarteigenschaft zu implementieren.Die zweite Schriftarteigenschaft wird angenommen, dass die HeadingFont-Eigenschaft zu sein, die im vorherigen Abschnitt hinzugefügt wurde.

ay7tx1x6.collapse_all(de-de,VS.110).gifEine neue Schriftart-Benachrichtigungs-Schnittstelle implementieren

Um zwischen den Benachrichtigungen über zwei oder mehrere Schriftarten variieren, muss eine neue Benachrichtigung Oberfläche für jede Schriftart implementiert werden, die im Steuerelement verwendet wird.In den folgenden Abschnitten wird beschrieben, wie eine neue benachrichtigungs Schriftart - Schnittstelle implementiert, indem sie den Header des Steuerelements und Implementierungsdateien ändern.

ay7tx1x6.collapse_all(de-de,VS.110).gifHinzufügungen zur Headerdatei

In der headerdatei (Steuerelements. H), fügen der Klassendeklaration die folgenden Zeilen hinzu:

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

Dadurch wird eine Implementierung der IPropertyNotifySink-Schnittstelle, die HeadingFontNotify aufgerufen wird.Diese neue Schnittstelle enthält eine Methode, die OnChanged aufgerufen wird.

ay7tx1x6.collapse_all(de-de,VS.110).gifErgänzungen der Implementierungsdatei

In Code, der die Schriftart Überschrifts Steuerelements im Konstruktor initialisiert (), ändern Sie &m_xFontNotification zu &m_xHeadingFontNotify.Fügen Sie den folgenden Code hinzu:

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

Die AddRef und Release-Methoden in der IPropertyNotifySink-Schnittstelle behalten den Verweiszähler für das ActiveX-Steuerelementobjekt.Wenn das Steuerelement auf den Schnittstellenzeiger abruft, ruft das Steuerelement AddRef auf, um den Verweiszähler erhöht wird.Wenn das Steuerelement mit dem Mauszeiger beendet wird, ruft es Release, auf ähnliche Weise an, dass GlobalFree möglicherweise aufgerufen wird, um einen globalen Speicherblock freizugeben.Wenn der Verweiszähler für diese Schnittstelle auf Null geht, kann die Schnittstellenimplementierung freigegeben werden.In diesem Beispiel gibt die QueryInterface-Funktion einen Zeiger auf eine IPropertyNotifySink-Schnittstelle für ein bestimmtes Objekt zurück.Diese Funktion ermöglicht es einem ActiveX-Steuerelement, um ein Objekt abgefragt, um zu bestimmen, welche Schnittstellen dies unterstützt.

Nachdem diese Änderungen am Projekt vorgenommen wurden, neu erstellen Sie das Projekt, und verwenden Sie Testcontainer, um die Schnittstelle zu testen.Informationen zum Zugreifen auf den Testcontainer finden Sie unter Testen von Eigenschaften und Ereignissen mit dem Testcontainer.

Siehe auch

Referenz

MFC-ActiveX-Steuerelemente: Verwenden der Bilder in einem ActiveX-Steuerelement

MFC-ActiveX-Steuerelemente: Verwenden vordefinierter Eigenschaftenseiten

Konzepte

MFC-ActiveX-Steuerelemente