Freigeben über


MFC-ActiveX-Steuerelemente: Verwenden von Schriftarten

Wenn die ActiveX-Steuerelement-Anzeigen Text, können Sie dem Steuerelementbenutzer ermöglichen, um die Textdarstellung ändern, indem Sie eine Schriftarteigenschaft ändern. Zeicheneigenschaften werden als Schriftartobjekte implementiert und können zwei Typen aufweisen: Bestand oder Benutzerdefiniert. Vordefinierte Schriftarteigenschaften sind preimplemented Schriftarteigenschaften, die Sie mit dem Assistenten zum Hinzufügen von Eigenschaften hinzufügen können. Benutzerdefinierte Schriftarteigenschaften preimplemented nicht und Steuerelemententwickler bestimmt der das Verhalten und die Verwendung Eigenschaft.

Dieser Artikel enthält die folgenden Themen:

  • Verwenden vordefinierter Schriftarteigenschaft

  • Verwenden benutzerdefinierter Schriftarteigenschaften im Steuerelement

Verwenden vordefinierter Schriftarteigenschaft

Vordefinierte Schriftarteigenschaften preimplemented durch die COleControl. Außerdem ist eine Standardschriftarteigenschaftenseite auch verfügbar und ermöglicht den Benutzern zu verschiedenen Attributen der Änderung des Schriftartobjekts, wie deren Namen, Größe und Format.

Greifen Sie auf das Schriftartobjekt von GetFont, SetFont und InternalGetFont-Funktionen von COleControl. Der Steuerelementbenutzer greift auf das Schriftartobjekt über die Funktionen GetFont und SetFont auf die gleiche Weise wie für jede andere Cacheabhängigkeit Get/Set-Eigenschaft zu. Wenn auf den Schriftartobjekt aus ein Steuerelement erforderlich ist, verwenden Sie die InternalGetFont-Funktion.

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

So der vordefinierten Schriftarteigenschaft mit dem Assistenten zum Hinzufügen von Eigenschaften hinzufügen

  1. Laden Sie das Projekt des Steuerelements.

  2. Erweitern Sie in der Klassenansicht den Bibliotheksknoten des Steuerelements.

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

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

    Dadurch wird der Assistent zum Hinzufügen von Eigenschaften.

  5. Im Feld Eigenschaftenname klicken Sie auf Schriftart.

  6. Klicken Sie auf Fertig stellen.

Der Assistent zum Hinzufügen von Eigenschaften wird die folgende Zeile der Dispatchzuordnung des Steuerelements hinzu, in der Steuerelementklassenimplementierungsdatei:

DISP_STOCKPROP_FONT()

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

[id(DISPID_FONT)] IFontDisp*Font;

Die vordefinierte Beschriftungseigenschaft ist ein Beispiel einer Text-Eigenschaft, die mithilfe vordefinierter Informationen zu Schrifteigenschaften gezeichnet werden kann. Der vordefinierte Beschriftungseigenschaft dem Steuerelement hinzufügen, werden die Schritte, die ähnlich, die für die vordefinierten Schriftarteigenschaft verwendet werden.

So der vordefinierten Beschriftungseigenschaft mit dem Assistenten zum Hinzufügen von Eigenschaften hinzufügen

  1. Laden Sie das Projekt des Steuerelements.

  2. Erweitern Sie in der Klassenansicht den Bibliotheksknoten des Steuerelements.

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

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

    Dadurch wird der Assistent zum Hinzufügen von Eigenschaften.

  5. Im Feld Eigenschaftenname klicken Sie auf Beschriftung.

  6. Klicken Sie auf Fertig stellen.

Der Assistent zum Hinzufügen von Eigenschaften wird die folgende Zeile der Dispatchzuordnung des Steuerelements hinzu, in der Steuerelementklassenimplementierungsdatei:

DISP_STOCKPROP_CAPTION()

Ändern der OnDraw-Funktion

Die Standardimplementierung von OnDraw verwendet die Windows-Systemschriftart für sämtlichen Text, der im Steuerelement angezeigt wird. Das bedeutet, dass Sie den Code OnDraw ändern müssen, indem Sie das Schriftartobjekt in den Gerätekontext auswählen. Hierzu, rufen Sie COleControl::SelectStockFont auf und übergeben den Gerätekontext des Steuerelements auf, 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, um das Schriftartobjekt zu verwenden, wird der Text innerhalb des Steuerelements mit Eigenschaften der Schriftarteigenschaft der Bestand des Steuerelements angezeigt.

Verwenden benutzerdefinierter Schriftarteigenschaften im Steuerelement

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

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

  • Verarbeiten von Schriftartbenachrichtigungen.

  • Implementieren einer neuen Schriftartbenachrichtigungsschnittstelle.

Implementieren einer benutzerdefinierten Schriftarteigenschaft

Um eine benutzerdefinierte Schriftarteigenschaft implementieren dann zu lassen, verwenden Sie den Assistenten zum Hinzufügen von Eigenschaften, um die Eigenschaft hinzuzufügen und Änderungen am Code. In den folgenden Abschnitten wird beschrieben, wie der benutzerdefinierte HeadingFont-Eigenschaft dem Beispielsteuerelement hinzufügt.

So fügen die benutzerdefinierte Schriftarteigenschaft mit dem Assistenten zum Hinzufügen von Eigenschaften hinzufügen

  1. Laden Sie das Projekt des Steuerelements.

  2. Erweitern Sie in der Klassenansicht den Bibliotheksknoten des Steuerelements.

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

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

    Dadurch wird der Assistent zum Hinzufügen von Eigenschaften.

  5. Im Feld Eigenschaftenname geben Sie einen Namen für die Eigenschaft ein. In diesem Beispiel verwendet HeadingFont.

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

  7. Im Feld Eigenschaftentyp aus 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 HeadingFont-Eigenschaft der CSampleCtrl-Klasse und der SAMPLE.IDL-Datei hinzuzufügen. Da HeadingFont ein Set-Eigenschaftentyp Get/ist, ändert der Assistent zum Hinzufügen von Eigenschaften die Dispatchzuordnung der CSampleCtrl-Klasse, um einen Makroeintrag DISP_PROPERTY_EX_IDDISP_PROPERTY_EX einzuschließen:

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

Das Makro DISP_PROPERTY_EX ordnet den HeadingFont-Eigenschaftennamen mit der entsprechenden CSampleCtrl-Klasse und set-Methoden, GetHeadingFont und SetHeadingFont zu. Der Typ des Eigenschaftswerts wird auch angegeben; in diesem Fall VT_FONT.

Der Assistent zum Hinzufügen von Eigenschaften fügt auch eine Deklaration in der Steuerheaderdatei hinzu (.H) für GetHeadingFont und SetHeadingFont verwendet wird und fügt ihren Funktionsvorlagen in der Steuerimplementierungsdatei hinzu (.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();
}

Schließlich ändert der Assistent zum Hinzufügen von Eigenschaften die Steueridl-datei, indem ein Eintrag für die HeadingFont-Eigenschaft hinzufügt:

[id(1)] IDispatch* HeadingFont;

Änderungen dem Steuerelementcode

Nachdem Sie der HeadingFont-Eigenschaft zum Steuerelement hinzugefügt haben, müssen Sie einige Änderungen an der Steuerkopfzeile und -Implementierungsdateien vornehmen, um die neue Eigenschaft vollständig zu unterstützen.

In der Steuerheaderdatei (.H), fügen der folgenden Deklaration einer geschützten Membervariable hinzu:

protected:
   CFontHolder m_fontHeading;

In der Steuerimplementierungsdatei (.CPP), sind folgende:

  • Initialisieren Sie m_fontHeading im Steuerkonstruktor.

    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 PX_Font-Funktion hinzu. Dies stellt Initialisierung und Dauerhaftigkeit für die benutzerdefinierte 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, welches die Steuerelement- GetHeadingFont-Memberfunktion implementiert.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Ende, welches die Steuerelement- SetHeadingFont-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 definieren, um die zuvor ausgewählte Schriftart enthält.

    CFont* pOldHeadingFont;
    
  • Ändern Sie die Steuerelement- OnDraw-Memberfunktion, um sie in den Gerätekontext auszuwählen, indem Sie die folgende Zeile hinzu, wenn 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 auszuwählen, indem Sie die folgende Zeile hinzu, nachdem die Schriftart verwendet wurde.

    pdc->SelectObject(pOldHeadingFont);
    

Nachdem die benutzerdefinierte Schriftarteigenschaft implementiert wurde, sollte die Standardschriftarteigenschaftenseite implementiert und Steuerbenutzern ermöglichen, um die aktuelle Schriftart des Steuerelements zu ändern. Um die Eigenschaftenseite ID für die Standardschriftarteigenschaftenseite hinzuzufügen, die folgende Zeile nach dem Makro BEGIN_PROPPAGEIDS ein:

PROPPAGEID(CLSID_CFontPropPage)

Sie müssen den BEGIN_PROPPAGEIDS Anzahlparameter des Makros durch eines auch erhöhen. Die folgende Zeile veranschaulicht dies:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Nachdem diese Änderungen vorgenommen wurden, erstellen Sie das gesamte Projekt neu, die zusätzlichen Funktionen zu enthalten.

Verarbeiten von Schriftart-Benachrichtigungen

In den meisten Fällen muss es, zu wissen, wann die Eigenschaften des Schriftartobjekts geändert wurden. Jedes Schriftartobjekt ist Bereitstellen von Benachrichtigungen geeignet, wenn es geändert, indem eine Memberfunktion der IFontNotification aufruft, Schnittstelle implementiert durch COleControl.

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

Implementieren mehrerer Schnittstellen für Schriftartobjekte

Mehrere Schnittstellen für Schriftartobjekte werden implementiert

Die durchgezogenen Linien in der Abbildung oben geben an, dass beide Schriftartobjekte dieselbe Implementierung von IFontNotification. Dies kann Probleme verursachen, wenn Sie unterscheiden möchten, das sich Schriftart geändert hat.

Eine Möglichkeit, zwischen den Schriftartobjektbenachrichtigungen des Steuerelements unterscheiden ist, eine separate Implementierung der Schnittstelle IFontNotification für jedes Schriftartobjekt im Steuerelement zu erstellen. Diese Technik lässt Sie, um den Zeichencode, indem nur die Zeichenfolge zu optimieren aktualisiert, oder Zeichenfolgen, die die zuletzt geänderten Schriftart verwenden. Die folgenden Abschnitte zeigen die Schritte, die erforderlich sind, separate Benachrichtigungsschnittstellen für eine zweite Schriftarteigenschaft zu implementieren. Die zweite Schriftarteigenschaft wird angenommen, dass die HeadingFont-Eigenschaft sein, die im vorherigen Abschnitt hinzugefügt wurde.

Implementieren einer neuen Schriftart-Benachrichtigungs-Schnittstelle

Um zwischen den Benachrichtigungen aus zwei oder mehreren Schriftarten unterscheiden, muss eine neue Benachrichtigungsschnittstelle für alle Schriftarten- implementiert werden, die im Steuerelement verwendet wird. In den folgenden Abschnitten wird beschrieben, wie eine neue Schriftartbenachrichtigungsschnittstelle implementiert, indem die Steuerkopfzeile und -Implementierungsdateien ändern.

Hinzufügungen zur Headerdatei

In der Steuerheaderdatei (.H), fügen den folgenden Zeilen der Klassendeklaration 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 Schnittstelle IPropertyNotifySink, die HeadingFontNotify genannt wird. Diese neue Schnittstelle enthält eine Methode, die OnChanged genannt wird.

Erweiterungen der Implementierungsdatei

In Code, der die Überschriftsschriftart initialisiert (im Steuerkonstruktor), ändern Sie &m_xFontNotification in &m_xHeadingFontNotify. Fügen Sie dann 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 Methoden AddRef und Release in der IPropertyNotifySink-Schnittstelle behalten den Verweiszähler für das ActiveX-Steuerelementobjekt nachverfolgt. Wenn das Steuerelement z Schnittstellenzeiger Zugriff erhält, ruft das Steuerelement AddRef auf, um den Verweiszähler zu erhöhen. Wenn das Steuerelement mit dem Zeiger beendet wird, wird Release, auf fast genauso auf, dass GlobalFree möglicherweise aufgerufen wird, um einem 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 auf einem bestimmten Objekt zurück. Diese Funktion ermöglicht einem ActiveX-Steuerelement, um ein Objekt abzufragen, um zu bestimmen, welche Schnittstellen sie unterstützt.

Nachdem diese Änderungen am Projekt vorgenommen wurden, erstellen Sie das Projekt neu 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 von Bildern in einem ActiveX-Steuerelement

MFC-ActiveX-Steuerelemente: Verwenden von vordefinierten Eigenschaftenseiten

Konzepte

MFC-ActiveX-Steuerelemente