다음을 통해 공유


7단계. 창 메시지 처리

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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단계. 속성 변경 내용을 적용합니다.

필터 속성 페이지 만들기