Dela via


Steg 7. Hantera fönstermeddelanden

[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.]

Åsidosätt metoden CBasePropertyPage::OnReceiveMessage för att uppdatera dialogrutekontrollerna i respons på användarindata. Om du inte hanterar ett visst meddelande anropar du metoden OnReceiveMessage i den överordnade klassen. När användaren ändrar en egenskap gör du följande:

  • Ange m_bDirty-variabeln för egenskapssidan till TRUE.
  • Anropa metoden IPropertyPageSite::OnStatusChange för egenskapsramen med flaggan PROPPAGESTATUS_DIRTY. Den här flaggan informerar egenskapsramen om att den ska aktivera knappen Använd. CBasePropertyPage::m_pPageSite-variabeln har en pekare till IPropertyPageSite--gränssnittet.

För att förenkla det här steget kan du lägga till följande hjälpfunktion på egenskapssidan:

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

Anropa den här privata metoden i OnReceiveMessage när en användaråtgärd ändrar en egenskap, som du ser i följande exempel:

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);
} 

Egenskapssidan i det här exemplet har två kontroller: ett skjutreglage och en Återställ till standard-knapp. Om användaren rullar skjutreglaget anger egenskapssidan mättnadsvärdet i filtret. Om användaren klickar på knappen återställer egenskapssidan filtrets standardmättnadsvärde. I varje fall innehåller m_lNewVal det aktuella värdet och m_lVal innehåller det ursprungliga värdet. Värdet för m_lVal uppdateras inte förrän användaren checkar in ändringen, vilket händer när användaren klickar på OK- eller knappen Använd i egenskapsramen.

Nästa: steg 8. Tillämpa egenskapsändringar.

Skapa en egenskapssida för filter