步骤 7. 处理窗口消息

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 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。应用属性更改

创建筛选器属性页