【问题标题】:Spin Control Position Issue (Windows)旋转控制位置问题 (Windows)
【发布时间】:2012-11-17 21:27:56
【问题描述】:

我遇到了旋转(上/下)控件的问题。在旋转控件的属性中,我将“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);

(我使用一个变量来设置范围和位置,但因为我遇到问题,所以我手动设置它,就像我刚刚发布的那样。)

设置好位置后,我再次检查它只是为了确认:

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吗?有什么问题?

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    我找到了一个解决方案,但我不确定这是否是最好的或预期的做事方式。如果您将 lParam 转换为 LPNMUPDOWN 类型:

    LPNMUPDOWN lpnmud  = (LPNMUPDOWN)lParam;
    

    您可以获得当前位置和建议的位置变化。通过添加当前位置和建议的更改,您可以获得新位置:

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

    然后,您必须手动获取范围并检查新位置是否在范围的边界内。看起来工作量很大,但我想这是它通常的工作方式。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我在这行之后尝试了你的代码:

        LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);
        

        我发现HIWORD(lr)总是1,而不是0。MSDN说正确的结果是0,我也不知道为什么。

        如果你想得到 Spin Control 的 pos,你可以试试:

        LPNMUPDOWN *lpnm;
        lpnm=(LPNMUPDOWN)lParam;
        WORD pos;
        pos=lpnm->iPos;
        

        顺便说一下,通过判断lpnm->iDelta的符号,你可以知道Spin Control的whick键被按下了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-15
          • 2012-09-15
          • 2011-02-27
          • 1970-01-01
          相关资源
          最近更新 更多