Slider Control (Trackbar) получение сообщений в диалоговом окне - PullRequest
0 голосов
/ 31 мая 2019

Я проектирую диалоговое окно в редакторе ресурсов Visual Studio, и проблема в том, что я не знаю, как прослушивать сообщения, отправленные с помощью ползунка, под изображением находится диалоговая процедура.

Я знаю, что мне нужно прослушать сообщение WM_NOTIFY, но я не знаю, какой код отправляет мне элемент управления ... Я добавил 2 комментария в WM_NOTIFY части процедуры ниже, чтобы показать, в чем проблема ...

вот изображение, как я расположил это диалоговое окно: enter image description here

А вот процедура диалогового окна:

INT_PTR CALLBACK SettingsSoundProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static MainWindow* main_win = nullptr;

    switch (uMsg)
    {
    case WM_INITDIALOG:
    {
        main_win = reinterpret_cast<MainWindow*>(lParam);

        SetWindowText(GetDlgItem(hDlg, IDC_VOLUME_LABEL), TEXT("Music"));
        SendMessage(GetDlgItem(hDlg, IDC_VOLUME_SLIDER), TBM_SETRANGE, (WPARAM)FALSE, MAKELPARAM(0, 100));
        SendMessage(GetDlgItem(hDlg, IDC_VOLUME_SLIDER), TBM_SETPOS, (WPARAM)TRUE, (LPARAM)20);

        return TRUE;
    }
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:

            EndDialog(hDlg, 0);
            return TRUE;

        case IDCANCEL:
            EndDialog(hDlg, 0);
            return TRUE;

        default:
            break;
        }

    case WM_NOTIFY:
    {
        LPNMHDR nmhdr = (LPNMHDR)lParam;

        if (nmhdr->idFrom == IDC_VOLUME_SLIDER)
        {
            switch (nmhdr->code)
            {
            // what message do I listen for here?
            case TB_THUMBTRACK:
            case WM_HSCROLL:
            case WM_VSCROLL:
            case TRBN_THUMBPOSCHANGING:
            case TB_PAGEUP:
            case TB_PAGEDOWN:
            case TB_THUMBPOSITION:
            case TB_TOP:
            case TB_BOTTOM:
            case TB_ENDTRACK:

                // this is never hit
                MessageBox(nullptr, TEXT("Message"), TEXT("Info"), MB_OK);
                break;

            default:
                // this is hit!
                abort();
            }
        }

        return TRUE;
    }
    case WM_DESTROY:
        EndDialog(hDlg, 0);
        return TRUE;

    default:
        break;
    }

    return FALSE;
}

Как вы можетесм. WM_HSCROLL ни TRBN_THUMBPOSCHANGING не ударили, какое сообщение мне нужно прослушать здесь?

1 Ответ

1 голос
/ 31 мая 2019

WM_HSCROLL и WM_VSCROLL являются их собственными сообщениями, они не переносятся в WM_NOTIFY.

Значения TB_... также не являются WM_NOTIFY кодами уведомлений. Это коды причин, указанные в структуре NMTRBTHUMBPOSCHANGING уведомления TRBN_THUMBPOSCHANGING.

За документацию , единственные WM_NOTIFY уведомления, которые посылает трекбар:

Попробуйте это:

INT_PTR CALLBACK SettingsSoundProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static MainWindow* main_win = nullptr;
    static HWND hSlider = nullptr;

    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            main_win = reinterpret_cast<MainWindow*>(lParam);
            hSlider = GetDlgItem(hDlg, IDC_VOLUME_SLIDER);
            SetWindowText(GetDlgItem(hDlg, IDC_VOLUME_LABEL), TEXT("Music"));
            SendMessage(hSlider, TBM_SETRANGE, FALSE, MAKELPARAM(0, 100));
            SendMessage(hSlider, TBM_SETPOS, TRUE, 20);
            return TRUE;
        }

        case WM_DESTROY:
        {
            EndDialog(hDlg, 0);
            return TRUE;
        }

        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDOK:
                    EndDialog(hDlg, 0);
                    return TRUE;

                case IDCANCEL:
                    EndDialog(hDlg, 0);
                    return TRUE;
            }
            break;
        }

        case WM_NOTIFY:
        {
            LPNMHDR nmhdr = reinterpret_cast<LPNMHDR>(lParam);
            if ((nmhdr->code == TRBN_THUMBPOSCHANGING) &&
                (nmhdr->hwndFrom == hSlider))
            {
                NMTRBTHUMBPOSCHANGING *nmtrb = reinterpret_cast<NMTRBTHUMBPOSCHANGING*>(lParam);
                switch (nmtrb->nReason)
                {
                    case TB_THUMBTRACK:
                    case TB_PAGEUP:
                    case TB_PAGEDOWN:
                    case TB_THUMBPOSITION:
                    case TB_TOP:
                    case TB_BOTTOM:
                    case TB_ENDTRACK:
                        MessageBox(nullptr, TEXT("Thumb Pos Changing"), TEXT("Info"), MB_OK);
                        break;
                }
            }
            break;
        }

        case WM_HSCROLL:
        {
            if ((lParam != 0) &&
                (reinterpret_cast<HWND>(lParam) == hSlider))
            {
                switch (LOWORD(wParam))
                {
                    case SB_ENDSCROLL:
                    case SB_LEFT:
                    case SB_RIGHT:
                    case SB_LINELEFT:
                    case SB_LINERIGHT:
                    case SB_PAGELEFT:
                    case SB_PAGERIGHT:
                    case SB_THUMBPOSITION:
                    case SB_THUMBTRACK:
                        MessageBox(nullptr, TEXT("Horz Scroll"), TEXT("Info"), MB_OK);
                        break;
                }
            }
            break;
        }

        case WM_VSCROLL:
        {
            if ((lParam != 0) &&
                (reinterpret_cast<HWND>(lParam) == hSlider))
            {
                switch (LOWORD(wParam))
                {
                    case SB_BOTTOM:
                    case SB_ENDSCROLL:
                    case SB_LINEDOWN:
                    case SB_LINEUP:
                    case SB_PAGEDOWN:
                    case SB_PAGEUP:
                    case SB_THUMBPOSITION:
                    case SB_THUMBTRACK:
                    case SB_TOP:
                        MessageBox(nullptr, TEXT("Vert Scroll"), TEXT("Info"), MB_OK);
                        break;
                }
            }
            break;
        }
    }

    return FALSE;
}
...