Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Om ActiveX-kontrollen visar text kan du tillåta att kontrollanvändaren ändrar textutseendet genom att ändra en teckensnittsegenskap. Teckensnittsegenskaper implementeras som teckensnittsobjekt och kan vara av två typer: förinställd eller anpassad. Standardteckensnittegenskaper är teckensnittsegenskaper som redan är implementerade och som du kan lägga till med hjälp av guiden Lägg till egenskap. Egenskaperna för anpassat teckensnitt är inte förimplementerade och kontrollutvecklaren bestämmer egenskapens beteende och användning.
Den här artikeln beskriver följande avsnitt:
Använda egenskapen Stock Font
Egenskaper för standardteckensnitt är implementerade i förväg av klassen COleControl. Dessutom finns en standard egenskapssida för teckensnitt tillgänglig, så att användaren kan ändra olika attribut för teckensnittsobjektet, till exempel dess namn, storlek och formatmall.
Få åtkomst till teckensnittsobjektet via funktionerna GetFont, SetFont och InternalGetFont i COleControl. Kontrollanvändaren kommer åt teckensnittsobjektet via GetFont funktionerna och SetFont på samma sätt som andra Get/Set-egenskaper. När åtkomst till teckensnittsobjektet krävs från en kontroll använder du InternalGetFont funktionen.
Enligt beskrivningen i MFC ActiveX Controls: Properties (Egenskaper) är det enkelt att lägga till lageregenskaper med guiden Lägg till egenskap. Du väljer egenskapen Teckensnitt, och guiden Lägg till Egenskap infogar automatiskt den fördefinierade teckensnittsposten i kontrollens distributionskarta.
Så här lägger du till egenskapen stock Font med hjälp av guiden Lägg till egenskap
Läs in kontrollens projekt.
I Klassvy expanderar du biblioteksnoden för din kontroll.
Högerklicka på gränssnittsnoden för kontrollen (biblioteksnodens andra nod) för att öppna snabbmenyn.
På snabbmenyn klickar du på Lägg till och sedan på Lägg till egenskap.
Då öppnas guiden Lägg till egenskap.
I rutan Egenskapsnamn klickar du på Teckensnitt.
Klicka på Finish.
Guiden Lägg till egenskap lägger till följande rad i kontrollens sändningskarta, som finns i implementeringsfilen för kontrollklassen:
DISP_STOCKPROP_FONT()
Dessutom lägger guiden Lägg till egenskap till följande rad i kontrollens .IDL-fil:
[id(DISPID_FONT)] IFontDisp* Font;
Egenskapen stock Caption är ett exempel på en textegenskap som kan ritas med hjälp av information om egenskapen font. När du lägger till egenskapen stock Caption i kontrollen används steg som liknar de som används för egenskapen stock Font.
Så här lägger du till egenskapen stock Caption med hjälp av guiden Lägg till egenskap
Läs in kontrollens projekt.
I Klassvy expanderar du biblioteksnoden för din kontroll.
Högerklicka på gränssnittsnoden för kontrollen (biblioteksnodens andra nod) för att öppna snabbmenyn.
På snabbmenyn klickar du på Lägg till och sedan på Lägg till egenskap.
Då öppnas guiden Lägg till egenskap.
I rutan Egenskapsnamn klickar du på Bildtext.
Klicka på Finish.
Guiden Lägg till egenskap lägger till följande rad i kontrollens sändningskarta, som finns i implementeringsfilen för kontrollklassen:
DISP_STOCKPROP_CAPTION()
Ändra OnDraw-funktionen
Standardimplementeringen av OnDraw använder Windows-systemteckensnittet för all text som visas i kontrollen. Det innebär att du måste ändra OnDraw koden genom att välja teckensnittsobjektet i enhetskontexten. Det gör du genom att anropa COleControl::SelectStockFont och skicka kontrollens enhetskontext, som du ser i följande exempel:
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);
När funktionen har ändrats för att använda teckensnittsobjektet visas all text i kontrollen med egenskaper från kontrollens standardegenskap för teckensnitt.
Använda anpassade teckensnittsegenskaper i din styrenhet
Förutom egenskapen stock Font kan ActiveX-kontrollen ha anpassade teckensnittsegenskaper. Om du vill lägga till en anpassad teckensnittsegenskap måste du:
Använd guiden Lägg till egenskap för att implementera den anpassade teckensnittsegenskapen.
Implementera en anpassad teckensnittsegenskap
Om du vill implementera en anpassad teckensnittsegenskap använder du guiden Lägg till egenskap för att lägga till egenskapen och gör sedan vissa ändringar i koden. I följande avsnitt beskrivs hur du lägger till den anpassade HeadingFont egenskapen i exempelkontrollen.
Så här lägger du till den anpassade teckensnittsegenskapen med hjälp av guiden Lägg till egenskap
Läs in kontrollens projekt.
I Klassvy expanderar du biblioteksnoden för din kontroll.
Högerklicka på gränssnittsnoden för kontrollen (biblioteksnodens andra nod) för att öppna snabbmenyn.
På snabbmenyn klickar du på Lägg till och sedan på Lägg till egenskap.
Då öppnas guiden Lägg till egenskap.
I rutan Egenskapsnamn skriver du ett namn för egenskapen. I det här exemplet använder du HeadingFont.
För Implementeringstyp klickar du på Hämta/ange metoder.
I rutan Egenskapstyp väljer du IDispatch* som egenskapstyp.
Klicka på Finish.
Guiden Lägg till egenskap skapar koden för att lägga till den HeadingFont anpassade egenskapen till CSampleCtrl klassen och SAMPLE.IDL-filen. Eftersom HeadingFont är en Get/Set-egenskapstyp, ändrar guiden Lägg till egenskap klassens dispatch-karta för att inkludera en DISP_PROPERTY_EX_ID CSampleCtrl-makroinmatning.
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
Makrot DISP_PROPERTY_EX associerar egenskapsnamnet HeadingFont med motsvarande CSampleCtrl metoder för get och set och GetHeadingFontSetHeadingFont. Typen av egenskapsvärde är också specificerad; i det här fallet är det VT_FONT.
Guiden Lägg till egenskap lägger också till en deklaration i kontrollhuvudfilen (. H) för GetHeadingFont funktionerna och SetHeadingFont och lägger till deras funktionsmallar i kontrollimplementeringsfilen (. 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();
}
Slutligen ändrar guiden Lägg till egenskap kontrollens .IDL-fil genom att lägga till en post för egenskapen HeadingFont:
[id(1)] IDispatch* HeadingFont;
Ändringar i kontrollkoden
Nu när du har lagt HeadingFont till egenskapen i kontrollen måste du göra några ändringar i kontrollhuvudet och implementeringsfilerna för att helt stödja den nya egenskapen.
I kontrollhuvudfilen (. H) lägger du till följande deklaration av en skyddad medlemsvariabel:
protected:
CFontHolder m_fontHeading;
I kontrollimplementeringsfilen (. CPP) gör du följande:
Initiera m_fontHeading i kontrollkonstruktorn.
CMyAxFontCtrl::CMyAxFontCtrl() : m_fontHeading(&m_xFontNotification) { InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents); }Deklarera en statisk FONTDESC-struktur som innehåller standardattribut för teckensnittet.
static const FONTDESC _fontdescHeading = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE(12), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE };I kontrollmedlemsfunktionen
DoPropExchange, lägg till ett anrop till funktionenPX_Font. Detta ger initiering och beständighet för din anpassade teckensnittsegenskap.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); }Slutför implementeringen av kontrollmedlemsfunktionen
GetHeadingFont.IDispatch* CMyAxFontCtrl::GetHeadingFont(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return m_fontHeading.GetFontDispatch(); }Slutför implementeringen av kontrollmedlemsfunktionen
SetHeadingFont.void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_fontHeading.InitializeFont(&_fontdescHeading, pVal); OnFontChanged(); //notify any changes SetModifiedFlag(); }Ändra kontrollmedlemsfunktionen
OnDrawför att definiera en variabel för att lagra det tidigare markerade teckensnittet.CFont* pOldHeadingFont;Ändra kontrollmedlemsfunktionen
OnDrawför att välja det anpassade teckensnittet i enhetskontexten genom att lägga till följande rad där teckensnittet ska användas.pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);Ändra kontrollmedlemsfunktionen
OnDrawför att välja det tidigare teckensnittet i enhetskontexten igen genom att lägga till följande rad efter att teckensnittet har använts.pdc->SelectObject(pOldHeadingFont);
När den anpassade teckensnittsegenskapen har implementerats bör standardegenskapssidan för teckensnitt implementeras så att kontrollanvändarna kan ändra kontrollens aktuella teckensnitt. Om du vill lägga till egenskapssidans ID för standardgenskapssidan för teckensnitt infogar du följande rad efter makrot BEGIN_PROPPAGEIDS:
PROPPAGEID(CLSID_CFontPropPage)
Du måste också öka antalsparametern för ditt BEGIN_PROPPAGEIDS makro med ett. Följande rad illustrerar detta:
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
När dessa ändringar har gjorts återskapar du hela projektet för att införliva ytterligare funktioner.
Bearbeta teckenmeddelanden
I de flesta fall måste kontrollen veta när egenskaperna för teckensnittsobjektet har ändrats. Varje teckensnittsobjekt kan ge meddelanden när det ändras genom att anropa en medlemsfunktion i IFontNotification gränssnittet som implementeras av COleControl.
Om kontrollen använder egenskapen standardfont hanteras dess meddelanden av OnFontChanged medlemsfunktionen i COleControl. När du lägger till anpassade teckensnittsegenskaper kan du låta dem använda samma implementering. I exemplet i föregående avsnitt utfördes detta genom att skicka &m_xFontNotification när m_fontHeading medlemsvariabeln initierades.
Implementera gränssnitt för flera teckensnittsobjekt
De solida linjerna i bilden ovan visar att båda teckensnittsobjekten använder samma implementering av IFontNotification. Detta kan orsaka problem om du vill skilja på vilket teckensnitt som har ändrats.
Ett sätt att skilja mellan kontrollens meddelanden om teckensnittsobjekt är att skapa en separat implementering av IFontNotification gränssnittet för varje teckensnittsobjekt i kontrollen. Med den här tekniken kan du optimera ritningskoden genom att endast uppdatera strängen eller strängarna som använder det nyligen ändrade teckensnittet. I följande avsnitt visas de steg som krävs för att implementera separata meddelandegränssnitt för en andra teckensnittsegenskap. Den andra teckensnittsegenskapen antas vara egenskapen HeadingFont som lades till i föregående avsnitt.
Implementera ett nytt teckensnittsmeddelandegränssnitt
För att skilja mellan meddelanden om två eller flera teckensnitt måste ett nytt meddelandegränssnitt implementeras för varje teckensnitt som används i kontrollen. I följande avsnitt beskrivs hur du implementerar ett nytt gränssnitt för teckensnittsmeddelanden genom att ändra kontrollhuvudet och implementeringsfilerna.
Tillägg till rubrikfilen
I kontrollhuvudfilen (. H) lägger du till följande rader i klassdeklarationen:
protected:
BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(HeadingFontNotify)
Detta skapar en implementering av IPropertyNotifySink gränssnittet med namnet HeadingFontNotify. Det här nya gränssnittet innehåller en metod som heter OnChanged.
Tillägg till implementeringsfilen
I koden som initierar rubrikteckensnittet (i kontrollkonstruktorn) ändrar du &m_xFontNotification till &m_xHeadingFontNotify. Lägg sedan till följande 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;
}
Metoderna AddRef och Release i IPropertyNotifySink gränssnittet håller reda på referensantalet för ActiveX-kontrollobjektet. När kontrollen får åtkomst till gränssnittspekaren anropar AddRef kontrollen för att öka referensantalet. När kontrollen är klar med pekaren anropas Release, på ungefär samma sätt som GlobalFree kan anropas för att frigöra ett globalt minnesblock. När referensantalet för det här gränssnittet går till noll kan gränssnittsimplementeringen frigöras. I det här exemplet QueryInterface returnerar funktionen en pekare till ett IPropertyNotifySink gränssnitt på ett visst objekt. Med den här funktionen kan en ActiveX-kontroll köra frågor mot ett objekt för att avgöra vilka gränssnitt som stöds.
När de här ändringarna har gjorts i projektet återskapar du projektet och använder testcontainern för att testa gränssnittet. Mer information om hur du kommer åt testcontainern finns i Testa egenskaper och händelser med testcontainern .
Se även
MFC ActiveX-kontroller
MFC ActiveX-kontroller: Använda bilder i en ActiveX-kontroll
MFC ActiveX-kontroller: Använda standardegenskapssidor