C++ 旋转控制位置问题(Windows)

C++ 旋转控制位置问题(Windows),c++,windows,winapi,C++,Windows,Winapi,我的旋转(向上/向下)控制有问题。在spin控件的属性中,我将“Set Buddy Integer”设置为true 在我的dialogboxproc的WM_INITDIALOG中,我将其伙伴设置为静态文本控件: SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETBUDDY, (WPARAM)GetDlgItem(hDlg, IDC_STATIC1), 0); 我还设置了最小/最大范围和起始位置: SendMessage(GetDlgItem(hDl

我的旋转(向上/向下)控制有问题。在spin控件的属性中,我将“Set Buddy Integer”设置为true

在我的dialogboxproc的WM_INITDIALOG中,我将其伙伴设置为静态文本控件:

SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETBUDDY, (WPARAM)GetDlgItem(hDlg, IDC_STATIC1), 0);
我还设置了最小/最大范围和起始位置:

SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(1, 1));
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETPOS, 0, 1);
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(2, 1));
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETPOS, 0, 2);
当在对话框中点击某个按钮时,我正在更新范围和位置:

SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(1, 1));
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETPOS, 0, 1);
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(2, 1));
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETPOS, 0, 2);
(我使用了一个变量来设置范围和位置,但由于我遇到了问题,我正在手动设置它,正如我刚刚发布的那样。)

设置好位置后,我会再次检查以确认:

LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);
WORD pos = LOWORD(lr);
事实上,情况是2

接下来,单击“旋转”控件上的向下箭头。静态文本好友从2变为1。下面是我的WM_NOTIFY代码在dialogboxproc中的样子:

case WM_NOTIFY:
        ncode = ((LPNMHDR)lParam)->code;

        switch(ncode)
        {
        case UDN_DELTAPOS:
            {
                LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);

                if(HIWORD(lr) == 0)
                {
                    WORD pos = LOWORD(lr);

                    //Other stuff here
                    return TRUE;
                }

按下向下箭头并检查pos值后,位置仍然为2。我之前将位置设置为2并按下向下箭头。这个位置不是应该是1吗?问题出在哪里?

我找到了一个解决方案,但我不确定这是否是做事情的最佳方式。如果将LPRAM强制转换为键入LPNMUPDOWN:

LPNMUPDOWN lpnmud  = (LPNMUPDOWN)lParam;
您可以获得当前位置和建议的位置更改。通过添加当前职位和提议的变更,您可以获得新职位:

int newPos = lpnmud->iPos + lpnmud->iDelta;

然后,您必须手动获取范围,并检查新位置是否在范围的边界内。这看起来需要做很多工作,但我想这是通常的做法。

您在
UDN\u DELTAPOS
处理程序中返回
TRUE
,该处理程序指示控件忽略更改。相反,您应该返回
FALSE

我尝试了您的代码,在这一行之后:

LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);
我发现HIWORD(lr)总是1,而不是0。MSDN说正确的结果是0,我也不知道为什么

如果您想获得旋转控制的位置,可以尝试:

LPNMUPDOWN *lpnm;
lpnm=(LPNMUPDOWN)lParam;
WORD pos;
pos=lpnm->iPos;
顺便说一下,通过判断lpnm->iDelta的符号,您可以知道按下了旋转控制的哪个键