Compartir a través de


Paso 7. Controlar mensajes de ventana

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Invalide el método CBasePropertyPage::OnReceiveMessage para actualizar los controles de diálogo en respuesta a la entrada del usuario. Si no controla un mensaje determinado, llame al método OnReceiveMessage en la clase primaria. Siempre que el usuario cambie una propiedad, haga lo siguiente:

  • Establezca la variable m_bDirty de la página de propiedades en TRUE.
  • Llame al método IPropertyPageSite::OnStatusChange del marco de propiedad con la marca PROPPAGESTATUS_DIRTY. Esta marca informa al marco de propiedad de que debe habilitar el botón Aplicar . El miembro CBasePropertyPage::m_pPageSite contiene un puntero a la interfaz IPropertyPageSite .

Para simplificar este paso, puede agregar la siguiente función auxiliar a la página de propiedades:

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

Llame a este método privado dentro de OnReceiveMessage cada vez que una acción del usuario cambie una propiedad, como se muestra en el ejemplo siguiente:

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 página de propiedades de este ejemplo tiene dos controles, una barra deslizante y un botón Revertir al valor predeterminado . Si el usuario desplaza la barra deslizante, la página de propiedades establece el valor de saturación en el filtro. Si el usuario hace clic en el botón, la página de propiedades restaura el valor de saturación predeterminado del filtro. En cada caso, m_lNewVal contiene el valor actual y m_lVal contiene el valor original. El valor de m_lVal no se actualiza hasta que el usuario confirma el cambio, lo que sucede cuando el usuario hace clic en el botón Aceptar o Aplicar en el marco de la propiedad.

Siguiente: Paso 8. Aplicar cambios de propiedad.

Crear una página de propiedades de filtro