Condividi tramite


Passaggio 7. Gestire i messaggi della finestra

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Eseguire l'override del metodo CBasePropertyPage::OnReceiveMessage per aggiornare i controlli della finestra di dialogo in risposta all'input utente. Se non si gestisce un messaggio specifico, chiamare il metodo OnReceiveMessage nella classe padre. Ogni volta che l'utente modifica una proprietà, eseguire le operazioni seguenti:

  • Impostare la variabile m_bDirty della pagina delle proprietà su TRUE.
  • Chiamare il metodo IPropertyPageSite::OnStatusChange del frame di proprietà con il flag di PROPPAGESTATUS_DIRTY. Questo flag informa il frame della proprietà che deve abilitare il pulsante Applica . Il membro CBasePropertyPage::m_pPageSite contiene un puntatore all'interfaccia IPropertyPageSite .

Per semplificare questo passaggio, è possibile aggiungere la funzione helper seguente alla pagina delle proprietà:

private:
    void SetDirty()
    {
        m_bDirty = TRUE;
        if (m_pPageSite)
        {
            m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
        }
    }

Chiamare questo metodo privato all'interno di OnReceiveMessage ogni volta che un'azione utente modifica una proprietà, come illustrato nell'esempio seguente:

BOOL CGrayProp::OnReceiveMessage(HWND hwnd,
    UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_DEFAULT)
        {
            // User clicked the 'Revert to Default' button.
            m_lNewVal = SATURATION_DEFAULT;
            m_pGray->SetSaturation(m_lNewVal);

            // Update the slider control.
            SendDlgItemMessage(m_Dlg, IDC_SLIDER1, TBM_SETPOS, 1,
                m_lNewVal);
            SetDirty();
            return (LRESULT) 1;
        }
        break;

    case WM_HSCROLL:
        {
            // User moved the slider.
            switch(LOWORD(wParam))
            {
            case TB_PAGEDOWN:
            case SB_THUMBTRACK:
            case TB_PAGEUP:
                m_lNewVal = SendDlgItemMessage(m_Dlg, IDC_SLIDER1,
                    TBM_GETPOS, 0, 0);
                m_pGray->SetSaturation(m_lNewVal);
                SetDirty();
            }
            return (LRESULT) 1;
        }
    } // Switch.
    
    // Let the parent class handle the message.
    return CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);
} 

La pagina delle proprietà in questo esempio include due controlli, una barra del dispositivo di scorrimento e un pulsante Revert to Default .La pagina delle proprietà in questo esempio include due controlli, una barra del dispositivo di scorrimento e un pulsante Revert to Default .The property page in this example has two controls, a slider bar Se l'utente scorre la barra del dispositivo di scorrimento, la pagina della proprietà imposta il valore di saturazione nel filtro. Se l'utente fa clic sul pulsante, la pagina delle proprietà ripristina il valore di saturazione predefinito del filtro. In ogni caso, m_lNewVal contiene il valore corrente e m_lVal contiene il valore originale. Il valore di m_lVal non viene aggiornato finché l'utente esegue il commit della modifica, che si verifica quando l'utente fa clic sul pulsante OK o Applica nel frame della proprietà.

Avanti: Passaggio 8. Applica modifiche alle proprietà.

Creazione di una pagina delle proprietà Filter