Étape 1. Définir un mécanisme pour définir la propriété
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
Le filtre doit prendre en charge un moyen pour la page de propriétés de communiquer avec elle, afin que la page de propriétés puisse définir et récupérer des propriétés sur le filtre. Les mécanismes possibles sont les suivants :
- Exposer une interface COM personnalisée.
- Prise en charge des propriétés Automation, via IDispatch.
- Exposez l’interface IPropertyBag et définissez un ensemble de propriétés nommées.
Cet exemple utilise une interface COM personnalisée, nommée ISaturation. Il ne s’agit pas d’une interface DirectShow réelle ; elle est définie uniquement pour cet exemple. Commencez par déclarer l’interface dans un fichier d’en-tête, ainsi que l’identificateur d’interface (IID) :
// Always create new GUIDs! Never copy a GUID from an example.
DEFINE_GUID(IID_ISaturation, 0x19412d6e, 0x6401,
0x475c, 0xb0, 0x48, 0x7a, 0xd2, 0x96, 0xe1, 0x6a, 0x19);
interface ISaturation : public IUnknown
{
STDMETHOD(GetSaturation)(long *plSat) = 0;
STDMETHOD(SetSaturation)(long lSat) = 0;
};
Vous pouvez également définir l’interface avec IDL et utiliser le compilateur MIDL pour créer le fichier d’en-tête. Ensuite, implémentez l’interface personnalisée dans le filtre. Cet exemple utilise les méthodes « Get » et « Set » pour la valeur de saturation du filtre. Notez que les deux méthodes protègent le membre m_lSaturation avec une section critique.
class CGrayFilter : public ISaturation, /* Other inherited classes. */
{
private:
CCritSec m_csShared; // Protects shared data.
long m_lSaturation; // Saturation level.
public:
STDMETHODIMP GetSaturation(long *plSat)
{
if (!plSat) return E_POINTER;
CAutoLock lock(&m_csShared);
*plSat = m_lSaturation;
return S_OK;
}
STDMETHODIMP SetSaturation(long lSat)
{
CAutoLock lock(&m_csShared);
if (lSat < SATURATION_MIN || lSat > SATURATION_MAX)
{
return E_INVALIDARG;
}
m_lSaturation = lSat;
return S_OK;
}
};
Bien entendu, les détails de votre propre implémentation diffèrent de l’exemple présenté ici.
Suivant : Étape 2. Implémentez ISpecifyPropertyPages.
Rubriques connexes