Udostępnij za pośrednictwem


Formanty ActiveX MFC: Przy użyciu czcionek

Formantu ActiveX wyświetla tekst, można zezwolić użytkownikowi kontroli 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: zapasów lub niestandardowe.Właściwości czcionki zapasów są właściwości preimplemented czcionki, które można dodać za pomocą Kreatora dodawania właściwości.Niestandardowe właściwości czcionki nie są preimplemented i developer kontroli określa zachowanie właściwości i sposób użycia.

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

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

  • Przy użyciu niestandardowych właściwości czcionki formantu użytkownika

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

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

Dostęp do obiektu czcionki za pomocą GetFont, Setfont(), i InternalGetFont funkcje COleControl.Użytkownika formant będzie dostęp do obiektu czcionki via GetFont i SetFont funkcje w taki sam sposób jak inne właściwości Get i Set.Gdy dostęp do obiektu czcionek jest wymagane od wewnątrz formantu, należy użyć InternalGetFont funkcji.

Jak już wspomniano w 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 i Kreatora dodawania właściwości automatycznie wstawia zapasów wejścia czcionki w mapie wysyłki tego formantu.

Aby dodać zapasów przy użyciu Kreatora dodawania właściwości właściwości czcionki

  1. Załadować projekt programu kontroli.

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

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (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ść.

    Zostanie otwarty Kreator dodawania właściwości.

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

  6. Kliknij Zakończ.

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

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ści tekstu, który rysowane przy użyciu informacji giełdowych właściwości czcionki.Dodanie właściwości Caption zapasów do kontroli używa kroki podobne do używanych dla zapasów właściwości czcionki.

Aby dodać właściwość Caption zapasów przy użyciu Kreatora dodawania właściwości

  1. Załadować projekt programu kontroli.

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

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (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ść.

    Zostanie otwarty Kreator dodawania właściwości.

  5. W Nazwa właściwości kliknij Caption.

  6. Kliknij Zakończ.

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

DISP_STOCKPROP_CAPTION()

Modyfikowanie funkcji OnDraw

Domyślne wykonania OnDraw używa 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.Aby to zrobić, należy wywołać COleControl::SelectStockFont i przekazać kontekstu urządzenia sterowania, 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 funkcji została zmodyfikowana, aby użyć obiektu czcionki, dowolny tekst w formancie jest wyświetlany z właściwości z zapasów właściwości czcionki formantu.

Przy użyciu niestandardowych właściwości czcionki formantu użytkownika

Oprócz podstawowego właściwości czcionki formantu ActiveX może mieć niestandardowe właściwości czcionki.Aby dodać właściwości niestandardowe czcionki musi:

  • Użyj Kreatora dodawania właściwości, aby zaimplementować niestandardowych właściwości czcionki.

  • Przetwarzanie powiadomień czcionki.

  • Wykonania nowego interfejsu powiadamiania czcionki.

ay7tx1x6.collapse_all(pl-pl,VS.110).gifWykonawczych niestandardowe właściwości czcionki

Aby wdrożenia niestandardowe właściwości czcionki, należy użyć Kreatora dodawania właściwości do dodania właściwości, a następnie uzupełnić niektóre modyfikacji kodu.W poniższych sekcjach opisano sposób dodawania niestandardowej 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ładować projekt programu kontroli.

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

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (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ść.

    Zostanie otwarty Kreator dodawania właściwości.

  5. W Nazwa właściwości wpisz nazwę właściwości.Na przykład użyj HeadingFont.

  6. Dla Implementacji typu, kliknij Metody Get i Set.

  7. W Typ właściwości wybierz pozycję 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 właściwości Get i Set modyfikuje Kreatora dodawania właściwości CSampleCtrl klasy mapę wysyłki, aby uwzględnić DISP_PROPERTY_EX_IDDISP_PROPERTY_EX makro wpis:

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.Podano także typ wartości właściwości; w przypadku VT_FONT.

Dodaj właściwość dodaje także deklarację w pliku nagłówka formantu (.H) dla GetHeadingFont i SetHeadingFont funkcje 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 kontroli.Plik IDL, dodając wpis dla HeadingFont właściwość:

[id(1)] IDispatch* HeadingFont;

ay7tx1x6.collapse_all(pl-pl,VS.110).gifZmiany do kodu sterującego

Teraz, po dodaniu HeadingFont właściwość do formantu, trzeba dokonać pewnych zmian do plików nagłówka i wykonania kontroli pełną obsługę 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:

  • Zainicjuj m_fontHeading w konstruktorze kontroli.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Stwierdzenie 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 działały, 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 określenie zmiennej do przechowania wcześniej wybrane czcionki.

    CFont* pOldHeadingFont;
    
  • Zmodyfikuj formant OnDraw funkcji składowej, aby wybrać czcionkę niestandardowych do kontekstu urządzenia dodając następująca linia gdziekolwiek czcionka ma być używany.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Zmodyfikuj formant OnDraw Członkowskich funkcji Zaznacz poprzedni czcionki do kontekstu urządzenia przez dodanie następującego wiersza po zastosowano czcionki.

    pdc->SelectObject(pOldHeadingFont);
    

Po wdrożeniu niestandardowej właściwości czcionki, standardowe strona właściwości czcionki powinny zostać wdrożone, umożliwiając użytkownikom kontroli, zmienić czcionki formantu.Aby dodać identyfikator strony właściwości dla standardowych strony właściwości czcionki, wstaw poniższy wiersz po BEGIN_PROPPAGEIDS makro:

PROPPAGEID(CLSID_CFontPropPage)

Należy również zwiększyć parametr liczba your BEGIN_PROPPAGEIDS makro o jeden.Następujący wiersz ilustruje to:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Po dokonaniu tych zmian, należy przebudować całego projektu, aby włączyć dodatkowe funkcje.

ay7tx1x6.collapse_all(pl-pl,VS.110).gifPrzetwarzanie powiadomień czcionki

W większości przypadków kontroli 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 zapasów właściwości czcionki, jej powiadomienia są obsługiwane przez OnFontChanged Członkowskich funkcji COleControl.Po dodaniu właściwości niestandardowe czcionki mogą mieć je użyć samego wykonania.W przykładzie w poprzedniej sekcji, był to osiągnąć, przekazując &m_xFontNotification podczas inicjowania m_fontHeading zmienną.

Implementowanie wiele interfejsów obiektu czcionki

Wdrożenie wielu interfejsów obiektów czcionek

Pokaż linie ciągłe na powyższym rysunku, że oba obiekty czcionki z wykonania tych samych IFontNotification.Aby odróżnić zmianie czcionki, która może to spowodować problemy.

Jednym ze sposobów rozróżnienie między powiadomienia obiektu czcionki formantu jest utworzenie oddzielnych wykonania IFontNotification interfejsu dla każdego obiektu czcionki w formancie.Ta technika umożliwia Optymalizowanie kodu rysunku aktualizując tylko ciąg lub ciągów, które Użyj czcionki niedawno zmodyfikowanych.Poniższe sekcje wykazać kroki niezbędne do wykonania interfejsów oddzielnej notyfikacji drugiej właściwości czcionki.Przyjmowana jest wartość drugiego właściwości czcionki HeadingFont właściwość, która została dodana w poprzedniej sekcji.

ay7tx1x6.collapse_all(pl-pl,VS.110).gifWykonania 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.Poniżej opisano sposób implementacji nowego interfejsu powiadamiania czcionki modyfikując pliki nagłówka i wdrażania kontroli.

ay7tx1x6.collapse_all(pl-pl,VS.110).gifDodatki do pliku nagłówkowego

W pliku nagłówka formantu (.H), należy dodać 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)

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

ay7tx1x6.collapse_all(pl-pl,VS.110).gifDodatki do pliku implementacji

W kodzie, który inicjuje czcionkę nagłówka (w konstruktorze kontroli), należy zmienić &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 metod w IPropertyNotifySink interfejsu zachować o 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 prawie tak samo sposób GlobalFree może być wywołana do wolnego bloku pamięci globalnej.Gdy licznika odwołań do tego interfejsu przechodzi do zera, mogą zostać uwolnione w implementacji interfejsu.W tym przykładzie QueryInterface funkcja zwraca wskaźnik do IPropertyNotifySink interfejsu dla określonego obiektu.Ta funkcja umożliwia formant ActiveX, kwerendy obiekt, aby ustalić, jakie interfejsy go obsługuje.

Po przeprowadzeniu tych zmian do projektu Odbuduj projekt i przetestować kontenera do testowania interfejsu.Zobacz badania właściwości i zdarzenia z kontenerem Test informacji na temat dostępu kontener testu do.

Zobacz też

Informacje

Formanty ActiveX MFC: Obrazy za pomocą formantu ActiveX

Formanty ActiveX MFC: Za pomocą stron właściwości zasobu

Koncepcje

Formanty ActiveX MFC