Contrôles ActiveX MFC : Utilisation de polices
Si les affichages de contrôle ActiveX du texte, vous pouvez permettre à l'utilisateur de contrôle pour modifier l'apparence de texte en modifiant une propriété de police.Les propriétés Font sont implémentées en tant qu'objets de police et peuvent être de deux types : actions ou personnalisé.Les propriétés stock Font sont des propriétés preimplemented de police que vous pouvez ajouter l'Assistant Ajout de propriété.Les propriétés personnalisées Font pas preimplemented et le développeur de contrôle détermine le comportement et l'utilisation de la propriété.
Cet article décrit les rubriques suivantes :
À l'aide de la propriété boursières
Utilisation des propriétés Font personnalisées dans votre contrôle
À l'aide de la propriété boursières
Les propriétés stock Font preimplemented par la classe COleControl.En outre, une page de propriétés de polices standard est également disponible, qui autorise l'utilisateur à divers attributs de l'objet de la police, tels que le nom, la taille, et style.
Accédez à l'objet de la police via les fonctions de GetFont, de SetFont, et d' InternalGetFont d' COleControl.L'utilisateur du contrôle personnalisé accède à l'objet de la police via GetFont et SetFont fonctionne de la même manière que toute autre propriété get/set.Lorsque l'accès à l'objet de police est requis d'un contrôle, utilisez la fonction d' InternalGetFont .
Comme indiqué dans Contrôles ActiveX MFC : propriétés, ajouter des propriétés stock est facile avec L'Assistant Ajout de propriété.Vous choisissez la propriété Font, et Assistant Ajout de propriété insère automatiquement l'entrée de cotations boursières de la police dans la table de dispatch du contrôle.
Pour ajouter la propriété boursières l'Assistant Ajout de propriété
Chargez le projet de votre contrôle.
Dans l'Affichage de classes, développez le nœud de la bibliothèque de votre contrôle.
Cliquez avec le bouton droit sur le nœud de l'interface pour votre contrôle (le deuxième nœud du nœud de bibliothèque) pour ouvrir le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter puis cliquez sur Ajouter une propriété.
Cela ouvre l'Assistant Ajout de propriété.
Dans la zone de Nom de la propriété , cliquez sur Font.
Cliquez sur Terminer.
L'Assistant Ajout de propriété ajoutez la ligne suivante à la table de dispatch du contrôle, située dans le fichier de contrôle d'implémentation de classe :
DISP_STOCKPROP_FONT()
En outre, l'Assistant Ajout de propriété ajoutez la ligne suivante au fichier .IDL de contrôle :
[id(DISPID_FONT)] IFontDisp*Font;
La propriété de cotations boursières de légende est un exemple de propriété Text qui peut être dessinée à l'aide de les informations de propriété boursières.Ajout de la propriété de cotations boursières de légende au contrôle utilise des étapes similaires à celles utilisées pour la propriété boursières.
Pour ajouter la propriété de cotations boursières de légende l'Assistant Ajout de propriété
Chargez le projet de votre contrôle.
Dans l'Affichage de classes, développez le nœud de la bibliothèque de votre contrôle.
Cliquez avec le bouton droit sur le nœud de l'interface pour votre contrôle (le deuxième nœud du nœud de bibliothèque) pour ouvrir le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter puis cliquez sur Ajouter une propriété.
Cela ouvre l'Assistant Ajout de propriété.
Dans la zone de Nom de la propriété , cliquez sur Caption.
Cliquez sur Terminer.
L'Assistant Ajout de propriété ajoutez la ligne suivante à la table de dispatch du contrôle, située dans le fichier de contrôle d'implémentation de classe :
DISP_STOCKPROP_CAPTION()
Modifier la fonction d'OnDraw
L'implémentation par défaut d' OnDraw utilise la police système Windows pour tout le texte affiché dans le contrôle.Cela signifie que vous devez modifier le code d' OnDraw en sélectionnant l'objet de police dans le contexte de périphérique.Pour ce faire, appelez COleControl::SelectStockFont et passez le contexte du périphérique de contrôle, comme le montre l'exemple suivant :
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);
Une fois que la fonction d' OnDraw a été modifiée pour utiliser l'objet de police, tout le texte dans le contrôle est affiché avec des caractéristiques de la propriété boursières du contrôle.
Utilisation des propriétés Font personnalisées dans votre contrôle
En plus de la propriété boursières, le contrôle ActiveX peut avoir des propriétés Font personnalisées.Pour ajouter une propriété de police à la carte vous devez :
Utilisez l'Assistant Ajout de propriété pour implémenter la propriété Font personnalisée.
Gérer les notifications de police.
implémenter une interface de notification de la nouvelle police.
Implémenter une propriété Font personnalisée
Pour implémenter une propriété Font personnalisée, vous utilisez l'Assistant Ajout de propriété pour ajouter la propriété et d'apporter des modifications au code.Les sections suivantes décrivent comment ajouter une propriété personnalisée d' HeadingFont au contrôle d'exemple.
Pour ajouter la propriété Font personnalisée à l'aide de l'Assistant Ajout de propriété
Chargez le projet de votre contrôle.
Dans l'Affichage de classes, développez le nœud de la bibliothèque de votre contrôle.
Cliquez avec le bouton droit sur le nœud de l'interface pour votre contrôle (le deuxième nœud du nœud de bibliothèque) pour ouvrir le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter puis cliquez sur Ajouter une propriété.
Cela ouvre l'Assistant Ajout de propriété.
Dans la zone de Nom de la propriété , tapez un nom pour la propriété.Pour cet exemple, utilisez HeadingFont.
Pour Implementation Type, cliquez sur Get/Set Methods.
Dans la zone de Type de propriété , sélectionnez IDispatch* pour le type de propriété.
Cliquez sur Terminer.
L'Assistant Ajout de propriété crée le code pour ajouter la propriété personnalisée d' HeadingFont à la classe d' CSampleCtrl et le fichier de SAMPLE.IDL.Étant donné qu' HeadingFont est un type de propriété get/set, l'Assistant Ajout de propriété modifie la table de dispatch de la classe d' CSampleCtrl pour inclure uneDISP_PROPERTY_EX macro entrée d' DISP_PROPERTY_EX_ID:
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
La macro d' DISP_PROPERTY_EX associe le nom de la propriété d' HeadingFont avec son get et Set correspondants méthodes de classe d' CSampleCtrl , GetHeadingFont et SetHeadingFont.Le type de la valeur de propriété est également spécifié ; dans ce cas, VT_FONT.
L'Assistant Ajout de propriété ajoute également une déclaration dans le fichier d'en-tête du contrôle (. H) pour GetHeadingFont et SetHeadingFont s'exécute et ajoute leurs modèles de fonction dans le fichier d'implémentation du contrôle (.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();
}
Enfin, l'Assistant Ajout de propriété modifie le fichier .IDL de contrôle en ajoutant une entrée pour la propriété d' HeadingFont :
[id(1)] IDispatch* HeadingFont;
Modifications apportées au code de contrôle
Maintenant que vous avez ajouté la propriété d' HeadingFont au contrôle, vous devez apporter des modifications à l'en-tête et les fichiers d'implémentation du contrôle pour prendre entièrement en charge la nouvelle propriété.
Dans le fichier d'en-tête du contrôle (. H), ajoutez la déclaration suivante d'une variable membre protégée :
protected:
CFontHolder m_fontHeading;
Dans le fichier d'implémentation du contrôle (.CPP), procédez comme suit :
Initialisez m_fontHeading dans le constructeur du contrôle.
CMyAxFontCtrl::CMyAxFontCtrl() : m_fontHeading(&m_xFontNotification) { InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents); }
Déclarez une structure statique de FONTDESC contenant des attributs par défaut de la police.
static const FONTDESC _fontdescHeading = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE };
Dans la fonction membre de contrôle d' DoPropExchange , ajoutez un appel à la fonction d' PX_Font .Cela fournit l'initialisation et la persistance pour votre propriété Font personnalisée.
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); }
Terminez l'implémentation de la fonction membre de contrôle d' GetHeadingFont .
IDispatch* CMyAxFontCtrl::GetHeadingFont(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return m_fontHeading.GetFontDispatch(); }
Terminez d'implémenter la fonction membre de contrôle d' SetHeadingFont .
void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_fontHeading.InitializeFont(&_fontdescHeading, pVal); OnFontChanged(); //notify any changes SetModifiedFlag(); }
Modifiez la fonction membre de contrôle d' OnDraw pour définir une variable pour stocker la police précédemment sélectionnée.
CFont* pOldHeadingFont;
Modifiez la fonction membre de contrôle d' OnDraw pour sélectionner la police au mappage dans le contexte de périphérique en ajoutant la ligne suivante partout où la police doit être utilisée.
pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
Modifiez la fonction membre de contrôle d' OnDraw pour sélectionner la police précédente dans le contexte de périphérique en ajoutant la ligne suivante après la police a été utilisée.
pdc->SelectObject(pOldHeadingFont);
Après que la propriété Font personnalisée a été implémentée, la page de propriétés de police standard doit être implémentée, ce qui permet aux utilisateurs de contrôle pour modifier la police actuelle du contrôle.Pour ajouter l'ID de page de propriétés pour la page de propriétés de police standard, insérez la ligne suivante après la macro d' BEGIN_PROPPAGEIDS :
PROPPAGEID(CLSID_CFontPropPage)
Vous devez aussi incrémenter le paramètre de nombre de votre macro d' BEGIN_PROPPAGEIDS par une.La ligne suivante illustre ce comportement :
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
Une fois ces modifications ont été effectuées, régénérez le projet entier d'incorporer des fonctionnalités supplémentaires.
Gérer les notifications de police
Dans la plupart des cas le contrôle de savoir quand les caractéristiques de l'objet de police ont été modifiées.Chaque objet de police est capable de donner notifications lorsque celle-ci change en appelant une fonction membre d'interface d' IFontNotification , implémenté par COleControl.
Si le contrôle utilise la propriété boursières, ses notifications sont traitées par la fonction membre d' OnFontChanged d' COleControl.Lorsque vous ajoutez des propriétés de police à mapper, vous pouvez les faire utiliser la même implémentation.Dans l'exemple de la section précédente, cela a été accompli en passant le &m_xFontNotification en initialisant la variable membre m_fontHeading.
Implémentation des interfaces multipolices d'objet
Les traits pleins dans l'illustration ci-dessus montrent les deux objets de police utilisent la même implémentation d' IFontNotification.Cela peut provoquer des problèmes si vous voulez distinguer de la police a modifié.
Une façon de faire la distinction entre les notifications d'objet de la police du contrôle est de créer une implémentation distincte de l'interface d' IFontNotification pour chaque objet de la police dans le contrôle.Cette technique permet d'optimiser votre code de dessin en mettant à jour uniquement la chaîne, ou en chaînes, qui utilisent la police récemment modifiée.Les sections suivantes indiquent les étapes nécessaires pour implémenter des interfaces distinctes de notification pour une deuxième propriétés de police.Il est supposé que la propriété de police est la propriété d' HeadingFont ajoutée dans la section précédente.
Implémenter une interface de notification de la nouvelle police
Pour distinguer les notifications de deux polices ou plus, une nouvelle interface de notification doit être implémentée pour chaque police utilisée dans le contrôle.Les sections suivantes décrivent comment implémenter une interface de notification de la nouvelle police en modifiant l'en-tête et les fichiers d'implémentation du contrôle.
Ajouts apportés au fichier d'en-tête
Dans le fichier d'en-tête du contrôle (. H), ajoutez les lignes suivantes à la déclaration de classe :
protected:
BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(HeadingFontNotify)
Cela crée une implémentation de l'interface d' IPropertyNotifySink appelée HeadingFontNotify.Cette nouvelle interface contient une méthode appelée OnChanged.
Ajouts apportés au fichier d'implémentation
Dans le code qui initialise la police de titre (dans le constructeur de contrôle), modifiez &m_xFontNotification à &m_xHeadingFontNotify.Ajoutez le code suivant :
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;
}
Les méthodes d' AddRef et d' Release dans l'interface d' IPropertyNotifySink conservent le décompte de références que l'objet contrôle ActiveX.Lorsque le contrôle obtient l'accès au pointeur d'interface, le contrôle appelle AddRef pour incrémenter le décompte de références.Lorsque le contrôle est terminé avec le pointeur, il appelle Release, pratiquement de la même façon que GlobalFree peut être appelé pour libérer un bloc de mémoire global.Quand le décompte de références pour cette interface accède à zéro, l'implémentation de l'interface peut être libérée.Dans cet exemple, la fonction d' QueryInterface retourne un pointeur vers une interface d' IPropertyNotifySink sur un objet particulier.Cette fonction permet à un contrôle ActiveX pour interroger un objet pour déterminer les interfaces il prend en charge.
Une fois ces modifications ont été apportées à votre projet, régénérez le projet et utilisez Test Container pour tester l'interface.Pour plus d'informations sur la manière d'accéder à Test Container, consultez Test des propriétés et des événements à l'aide de Test Container.
Voir aussi
Référence
Contrôles ActiveX MFC : Utilisation des images dans un contrôle ActiveX
Contrôles ActiveX MFC : Utilisation des pages de propriétés stock