c++ - slider 控件(Trackbar)在对话框程序中接收消息

标签 c++ winapi win32gui

我正在Visual Studio资源编辑器中设计一个对话框,问题是我不知道如何监听 slider 控件发送的消息,下面的图像是一个对话框程序。

我知道我需要监听 WM_NOTIFY 消息,但我不知道控件向我发送了什么代码...我在 WM_NOTIFY 部分添加了 2 条注释下面的过程显示问题出在哪里...

这是我如何排列此对话框的图像: 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_HSCROLLTRBN_THUMBPOSCHANGING 都被命中,我需要在这里监听什么消息?

最佳答案

WM_HSCROLLWM_VSCROLL是它们自己的消息,它们没有包装在 WM_NOTIFY 中。

TB_... 值也不是 WM_NOTIFY 通知代码。它们是 NMTRBTHUMBPOSCHANGING 中报告的原因代码TRBN_THUMBPOSCHANGING 的结构通知。

the documentation ,轨迹栏发送的唯一 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;
}

关于c++ - slider 控件(Trackbar)在对话框程序中接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56389049/

相关文章:

javascript - 使用 GTK+ Webkit Webview(和 Qt WebKit 桥)从 JavaScript/HTML 调用 C++

c++ - c++ delete 是否需要指针或对象?

c++ - 在 Vista/7 (C++) 上获取音量变化通知

c++ - Windows 特定类型和 native 类型 C++

winapi - 如何使用 win32 在 D 中创建 Windows?

c++ - 在哪里编码 Win32 菜单

c++ - 停止并等待文件传输协议(protocol),什么时候停止监听?

c++ - 如何在不暂停执行的情况下获取 X 窗口系统中的事件?

c++ - 在属于我的进程的 z 顺序中找到最高的非子窗口

无法将全局变量从 dll 导入到应用程序中?