共用方式為


步驟 7: 處理視窗訊息

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

覆寫 CBasePropertyPage::OnReceiveMessage 方法,以更新對話方塊控制項以回應使用者輸入。 如果您未處理特定訊息,請在父類別上呼叫 OnReceiveMessage 方法。 每當使用者變更屬性時,請執行下列動作:

  • 將屬性頁 的m_bDirty 變數設定為 TRUE
  • 使用 PROPPAGESTATUS_DIRTY 旗標呼叫屬性框架的 IPropertyPageSite::OnStatusChange 方法。 此旗標會通知屬性框架應該啟用 [ 套用 ] 按鈕。 CBasePropertyPage::m_pPageSite成員會保存IPropertyPageSite介面的指標。

若要簡化此步驟,您可以將下列協助程式函式新增至屬性頁:

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

每當使用者動作變更屬性時,請在 OnReceiveMessage 內呼叫這個私用方法,如下列範例所示:

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

此範例中的屬性頁有兩個控制項:滑杆列和 [還原為預設] 按鈕。 如果使用者捲動滑杆列,屬性頁會在篩選上設定飽和度值。 如果使用者按一下按鈕,屬性頁會還原篩選準則的預設飽和度值。 在每個案例中,m_lNewVal保留目前的值,而m_lVal保留原始值。 除非使用者認可變更,否則不會更新m_lVal的值,當使用者按一下屬性框架上的 [ 確定 ] 或 [ 套用 ] 按鈕時,就會發生這種情況。

下一 步:步驟 8。套用屬性變更

建立篩選屬性頁