c++ - 自旋控制位置问题 (Windows)

标签 c++ windows winapi

我在旋转(上/下)控件时遇到问题。在旋转控件的属性中,我将“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的值,position还是2,我之前设置position为2,按向下箭头。此时位置不应该是1吗?有什么问题?

最佳答案

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

LPNMUPDOWN lpnmud  = (LPNMUPDOWN)lParam;

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

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

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

关于c++ - 自旋控制位置问题 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434945/

相关文章:

javascript - 在 QML 中加入 2 个字符串

python - 文件在 Python 3.4 中存在于 Windows 与 Linux 上

c++ - 如何创建没有任何窗口的任务栏按钮?

c++ - 启动程序

c - 将命令行参数作为一个大字符串获取

c++ - 如何在多个函数中使用结构

c++ - 求和特定数字以获得 100 的不同方法

c++ - 如何知道 EnumWindows 何时完成其窗口列表?

windows - 如何让 Standard EXE 和 WinService EXE 相互通信?

c++ - GetQueuedCompletionStatus 停止读取串口