Steg 1. Definiera en mekanism för att ange egenskapen
[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]
Filtret måste ha stöd för ett sätt för egenskapssidan att kommunicera med den, så att egenskapssidan kan ange och hämta egenskaper i filtret. Möjliga mekanismer omfattar följande:
- Exponera ett anpassat COM-gränssnitt.
- Stöd för Automationegenskaper via IDispatch.
- Exponera gränssnittet IPropertyBag och definiera en uppsättning namngivna egenskaper.
I det här exemplet används ett anpassat COM-gränssnitt med namnet ISaturation. Det här är inte ett verkligt DirectShow-gränssnitt. det definieras endast för det här exemplet. Börja med att deklarera gränssnittet i en rubrikfil, tillsammans med gränssnittsidentifieraren (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;
};
Du kan också definiera gränssnittet med IDL och använda MIDL-kompilatorn för att skapa huvudfilen. Implementera sedan det anpassade gränssnittet i filtret. I det här exemplet används metoderna "Get" och "Set" för filtrets mättnadsvärde. Observera att båda metoderna skyddar medlemsvariabeln m_lSaturation med en kritisk sektion.
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;
}
};
Naturligtvis skiljer sig informationen om din egen implementering från exemplet som visas här.
Nästa: steg 2. Implementera ISpecifyPropertyPages.
Relaterade ämnen