步骤 7. 处理窗口消息
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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。应用属性更改。
相关主题