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
Załadować projekt programu kontroli.
W widoku klasy rozwiń węzeł Biblioteka formantu.
Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.
W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.
Zostanie otwarty Kreator dodawania właściwości.
W Nazwa właściwości kliknij czcionki.
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
Załadować projekt programu kontroli.
W widoku klasy rozwiń węzeł Biblioteka formantu.
Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.
W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.
Zostanie otwarty Kreator dodawania właściwości.
W Nazwa właściwości kliknij Caption.
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.
Wykonawczych 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
Załadować projekt programu kontroli.
W widoku klasy rozwiń węzeł Biblioteka formantu.
Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.
W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.
Zostanie otwarty Kreator dodawania właściwości.
W Nazwa właściwości wpisz nazwę właściwości.Na przykład użyj HeadingFont.
Dla Implementacji typu, kliknij Metody Get i Set.
W Typ właściwości wybierz pozycję IDispatch * dla typu właściwości.
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;
Zmiany 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.
Przetwarzanie 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
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.
Wykonania 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.
Dodatki 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.
Dodatki 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