Bagikan melalui


Langkah 7. Menangani Pesan Jendela

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Ambil alih metode CBasePropertyPage::OnReceiveMessage untuk memperbarui kontrol dialog sebagai respons terhadap input pengguna. Jika Anda tidak menangani pesan tertentu, panggil metode OnReceiveMessage pada kelas induk. Setiap kali pengguna mengubah properti, lakukan hal berikut:

  • Atur variabel m_bDirty halaman properti ke TRUE.
  • Panggil metode IPropertyPageSite::OnStatusChange dari bingkai properti dengan bendera PROPPAGESTATUS_DIRTY. Bendera ini menginformasikan bingkai properti bahwa ia harus mengaktifkan tombol Terapkan . Anggota CBasePropertyPage::m_pPageSite memegang pointer ke antarmuka IPropertyPageSite .

Untuk menyederhanakan langkah ini, Anda bisa menambahkan fungsi pembantu berikut ke halaman properti Anda:

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

Panggil metode privat ini di dalam OnReceiveMessage setiap kali tindakan pengguna mengubah properti, seperti yang ditunjukkan dalam contoh berikut:

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

Halaman properti dalam contoh ini memiliki dua kontrol, bilah penggeler, dan tombol Kembali ke Default . Jika pengguna menggulir bilah penggeser, halaman properti mengatur nilai saturasi pada filter. Jika pengguna mengklik tombol , halaman properti memulihkan nilai saturasi default filter. Dalam setiap kasus, m_lNewVal menyimpan nilai saat ini dan m_lVal menyimpan nilai asli. Nilai m_lVal tidak diperbarui sampai pengguna melakukan perubahan, yang terjadi ketika pengguna mengklik tombol OK atau Terapkan pada bingkai properti.

Berikutnya: Langkah 8. Terapkan Perubahan Properti.

Membuat Halaman Properti Filter