我正在Visual Studio资源编辑器中设计一个对话框,问题是我不知道如何监听 slider 控件发送的消息,下面的图像是一个对话框程序。
我知道我需要监听 WM_NOTIFY
消息,但我不知道控件向我发送了什么代码...我在 WM_NOTIFY
部分添加了 2 条注释下面的过程显示问题出在哪里...
这是对话框程序:
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
都被命中,我需要在这里监听什么消息?
最佳答案
WM_HSCROLL
和 WM_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/