Udostępnij za pośrednictwem


Formanty MFC ActiveX: używanie czcionek

Jeżeli formant ActiveX wyświetlany jest tekst, można umożliwić użytkownikowi sterowania zmienić wygląd tekstu, zmieniając właściwości czcionki.Właściwości czcionki są implementowane jako obiekty czcionki i może być jeden z dwóch typów: podstawowy lub niestandardowe.Właściwości czcionki zapasów są właściwości czcionki preimplemented, które można dodać za pomocą Kreatora dodawania właściwości.Właściwości niestandardowe czcionki nie są preimplemented i autora kontroli określa zachowanie i użycie właściwości.

W tym artykule omówiono następujące tematy:

  • Za pomocą właściwości Font zapasów

  • Za pomocą właściwości niestandardowych czcionek w pilota

Za pomocą właściwości Font zapasów

Właściwości czcionki zapasów są preimplemented przez klasę COleControl.Ponadto standardowe strona właściwości czcionki jest również dostępna, pozwalając użytkownikowi na zmianę różne atrybuty obiektu czcionki, takie jak jego nazwa, rozmiar i styl.

Dostęp do obiektu czcionki za pomocą GetFont, SetFont, i InternalGetFont funkcje COleControl.Kontrola użytkownik uzyska dostęp obiekt czcionki za pomocą GetFont i SetFont funkcje w taki sam sposób jak inne właściwości Get i Set.Jeśli dostęp do obiektu czcionki jest wymagane od wewnątrz formantu, należy użyć InternalGetFont funkcji.

Jak wspomniano w części formantów ActiveX MFC: właściwości, dodawanie właściwości zapasów jest proste dzięki Kreatora dodawania właściwości.Wybierz właściwości czcionki, a Kreator dodawania właściwości automatycznie wstawia powiększeniem czcionki do formantu mapy wysyłki.

Aby dodać czas właściwości czcionki za pomocą Kreatora dodawania właściwości

  1. Załaduj projekt z kontroli.

  2. W widoku klasy rozwiń węzeł Biblioteka pilota.

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolnej (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.

  4. W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.

    Spowoduje to otwarcie Kreatora dodawania właściwości.

  5. W Nazwa właściwości kliknij przycisk czcionki.

  6. Kliknij Zakończ.

Kreator dodawania właściwości dodaje następujący wiersz do formantu wysyłki mapę, znajdujące się w pliku implementacji klasy:

DISP_STOCKPROP_FONT()

Ponadto Kreator dodawania właściwości dodaje następujący wiersz do formantu.Plik IDL:

[id(DISPID_FONT)] IFontDisp*Font;

Właściwość Caption zapasów jest przykładem właściwość text, jaka może być pobierana za pomocą giełdowe właściwości czcionki.Dodanie właściwości Caption zapasów do formantu używa kroki podobne do używanych akcji właściwości czcionki.

Aby dodać właściwości Caption podstawowego za pomocą Kreatora dodawania właściwości

  1. Załaduj projekt z kontroli.

  2. W widoku klasy rozwiń węzeł Biblioteka pilota.

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolnej (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.

  4. W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.

    Spowoduje to otwarcie Kreatora dodawania właściwości.

  5. W Nazwa właściwości kliknij przycisk Podpis.

  6. Kliknij Zakończ.

Kreator dodawania właściwości dodaje następujący wiersz do formantu wysyłki mapę, znajdujące się w pliku implementacji klasy:

DISP_STOCKPROP_CAPTION()

Zmieniające funkcję OnDraw

Domyślna implementacja z OnDraw korzysta z czcionki systemu Windows dla całego tekstu wyświetlanych w formancie.Oznacza to, że należy zmodyfikować OnDraw kodu wybierając obiekt czcionki do kontekstu urządzenia.W tym celu należy wywołać COleControl::SelectStockFont i przekazać kontekstu urządzenia formantu, jak pokazano w następującym przykładzie:

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 funkcja została zmodyfikowana, aby użyć obiektu czcionki, dowolny tekst w formancie jest wyświetlany z charakterystyką od podstawowego właściwości czcionki formantu.

Za pomocą właściwości niestandardowych czcionek w pilota

Oprócz podstawowego właściwości Font formant ActiveX może mieć właściwości niestandardowe czcionki.Aby dodać właściwości niestandardowe czcionki należy:

  • Użyj Kreatora dodawania właściwości do wdrożenia niestandardowe właściwości czcionki.

  • Przetwarzanie powiadomień czcionki.

  • Wdrażanie nowego interfejsu powiadamiania czcionki.

Wykonywania właściwość niestandardowych czcionek

Aby zaimplementować niestandardowe właściwości czcionki, używasz Kreatora dodawania właściwości dodana właściwość, a następnie wprowadzić pewne modyfikacje do kodu.W poniższych sekcjach opisano sposób dodawania niestandardowego HeadingFont właściwość do próbki kontrolnej.

Aby dodać za pomocą Kreatora dodawania właściwości niestandardowej właściwości czcionki

  1. Załaduj projekt z kontroli.

  2. W widoku klasy rozwiń węzeł Biblioteka pilota.

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolnej (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.

  4. W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.

    Spowoduje to otwarcie Kreatora dodawania właściwości.

  5. W Nazwa właściwości wpisz nazwę właściwości.W tym przykładzie należy użyć HeadingFont.

  6. Dla Typ implementacji, kliknij przycisk Metody Get i Set.

  7. W Typ właściwości wybierz opcję interfejsu IDispatch * dla typu właściwości.

  8. Kliknij Zakończ.

Kreator dodawania właściwości tworzy kod, aby dodać HeadingFont właściwości niestandardowych do CSampleCtrl klasy i próbki.Plik IDL.Ponieważ HeadingFont jest typu Get/Set właściwości Kreatora dodawania właściwości modyfikuje CSampleCtrl mapy wysyłki klasy, aby uwzględnić DISP_PROPERTY_EX_IDDISP_PROPERTY_EX wpis makro:

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

DISP_PROPERTY_EX Kojarzy makro HeadingFont nazwa właściwości z jego odpowiadającego CSampleCtrl klasy metody Get i Set, GetHeadingFont i SetHeadingFont.Typ wartości właściwości jest również określona; w tym przypadku VT_FONT.

Kreator dodawania właściwości dodaje również deklarację w pliku nagłówka formantu (.H) do GetHeadingFont i SetHeadingFont funkcji i dodaje szablony ich funkcji w pliku implementacji sterowania (.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();
}

Wreszcie Kreator dodawania właściwości modyfikuje formantu.Plik IDL przez dodanie wpisu do HeadingFont właściwość:

[id(1)] IDispatch* HeadingFont;

Modyfikacje kodu sterującego

Teraz, gdy dodałeś HeadingFont właściwość do formantu, musi wprowadzić pewne zmiany do plików nagłówek i wykonania kontroli do pełnej obsługi nowej właściwości.

W pliku nagłówka formantu (.H), należy dodać następującą deklarację zmiennej chroniony członek:

protected:
   CFontHolder m_fontHeading;

W pliku implementacji sterowania (.CPP), wykonaj następujące czynności:

  • Inicjowanie m_fontHeading w Konstruktorze kontroli.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Zadeklarować statycznego FONTDESC struktury zawierające atrybuty domyślne czcionki.

    static const FONTDESC _fontdescHeading =
      { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
        ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • W formancie DoPropExchange Członkowskich funkcji, dodać wywołanie PX_Font funkcji.Zapewnia to inicjowania i trwałości dla właściwości niestandardowej czcionki.

    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);
    }
    
  • Zakończenie wykonywania kontroli GetHeadingFont funkcji składowej.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Zakończenie wykonywania kontroli SetHeadingFont funkcji składowej.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Zmodyfikuj formant OnDraw funkcji składowej, aby zdefiniować zmienną do przechowywania uprzednio wybranej czcionki.

    CFont* pOldHeadingFont;
    
  • Zmodyfikuj formant OnDraw funkcji składowej, aby wybrać czcionkę niestandardowych do kontekstu urządzenia przez dodanie następująca linia wszędzie tam, gdzie czcionka ma być używany.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Zmodyfikuj formant OnDraw funkcji składowej, aby wybrać poprzedni czcionkę do kontekstu urządzenia przez dodanie następującego po odpowiednią czcionkę.

    pdc->SelectObject(pOldHeadingFont);
    

Po został zaimplementowany właściwości niestandardowych czcionek, standard strona właściwości czcionki powinny zostać wdrożone, umożliwiając użytkownikom kontroli zmienić czcionkę bieżącego formantu.Aby dodać identyfikator strony właściwości dla standardowej strony właściwości czcionki, Wstaw następujący wiersz po BEGIN_PROPPAGEIDS makro:

PROPPAGEID(CLSID_CFontPropPage)

Musi również przyrost wartości parametru liczba Twój BEGIN_PROPPAGEIDS makro o jeden.Następujący wiersz ilustruje to:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Po dokonaniu tych zmian, odbudować całego projektu, aby włączyć dodatkowe funkcje.

Przetwarzanie powiadomień czcionki

W większości przypadków formant musi wiedzieć, kiedy zostały zmienione właściwości obiektu czcionki.Każdy obiekt czcionki jest zdolne do dostarczania powiadomienia o zmianie przez wywołanie funkcji składowej z IFontNotification interfejsu zaimplementowanego przez COleControl.

Jeśli formant używa podstawowego właściwości czcionki, jej powiadomienia są obsługiwane przez OnFontChanged funkcji składowej z COleControl.Po dodaniu właściwości niestandardowych czcionek, program może ich używać samego wykonania.W przykładzie w poprzedniej sekcji, był to osiągnąć, przekazując &m_xFontNotification podczas inicjowania m_fontHeading zmienna członka.

Wykonania wielu interfejsów obiektów czcionek

Implementowanie wielu interfejsów obiektów czcionek

Linie ciągłe na powyższym rysunku pokazać, że oba obiekty czcionki są za pomocą samego wykonania IFontNotification.Może to powodować problemy, jeżeli chce się rozróżnienie, zmienić czcionki, która.

Jednym ze sposobów na rozróżnienie między powiadomienia obiektu czcionki formantu jest utworzenie oddzielnych wykonania IFontNotification interfejsu dla każdego obiektu czcionki w formancie.Ta technika pozwala na optymalizacji kodu rysunku aktualizując tylko ciąg lub ciągów, które Użyj czcionki ostatnio zmodyfikowany.Poniższe sekcje przedstawiają instrukcje potrzebne do zaimplementowania interfejsów odrębnego zgłoszenia dla drugiej właściwości czcionki.Druga właściwość font zakłada się, że HeadingFont właściwość, która została dodana w poprzedniej sekcji.

Wdrażanie nowego interfejsu powiadamiania czcionki

Aby odróżnić od powiadomienia o dwóch lub więcej czcionek, nowy interfejs powiadomień musi być zaimplementowana dla każdej czcionki użytej w formancie.W poniższych sekcjach opisano sposób implementacji nowego interfejsu powiadamiania czcionki modyfikując pliki nagłówka i wdrażania kontroli.

Dodatki do pliku nagłówka

W pliku nagłówka formantu (.H), Dodaj następujące wiersze do deklaracji klasy:

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

Stwarza to implementacja IPropertyNotifySink interfejs o nazwie HeadingFontNotify.Ten nowy interfejs zawiera metodę o nazwie OnChanged.

Dodatki do pliku implementacji

Zmiany w kodzie, który inicjuje Czcionka nagłówka (w Konstruktorze kontroli), &m_xFontNotification do &m_xHeadingFontNotify.Następnie dodaj następujący kod:

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 i Release metody w IPropertyNotifySink interfejsu utrzymywać ślad od licznika odwołań do obiektu formantu ActiveX.Gdy formant uzyskuje dostęp do wskaźnika interfejsu, wywołuje formant AddRef do przyrost wartości licznika odwołań.Po zakończeniu kontroli ze wskaźnikiem wywołuje Release, w podobny sposób, że globalny może być wywołana z wolny blok pamięci globalnej.Gdy stan licznika odwołań do tego interfejsu przechodzi do zera, mogą zostać uwolnione implementacji interfejsu.W tym przykładzie QueryInterface , funkcja zwraca wskaźnik do IPropertyNotifySink interfejsu dla określonego obiektu.Ta funkcja umożliwia formant ActiveX obiektem w celu określenia, jakie interfejsy obsługuje kwerendy.

Po dokonaniu tych zmian do projektu, Odbuduj projekt i użyć Test kontenera, aby przetestować interfejsu.Zobacz badania właściwości i zdarzenia z kontenerem Test informacji na temat sposobu dostępu do kontenera test.

Zobacz też

Informacje

Formanty MFC ActiveX: używanie obrazów w formancie ActiveX

Formanty MFC ActiveX: używanie stron właściwości standardowych

Koncepcje

Formanty MFC ActiveX