2012-11-17 21 views
3

我遇到了旋转(上/下)控件的问题。在旋转控制的属性中,我将“Set Buddy Integer”设置为true。旋转控制位置问题(Windows)

在我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吗?问题是什么?

回答

2

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

LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam; 

您可以获取当前位置和建议的位置更改。通过将当前的位置和所提出的变化,就可以得到新的位置会是什么:

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

然后,你必须手动得到的范围内,并检查新位置是否会在边界内的范围内。这似乎很多工作,但我想这是它通常完成的方式。

1

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

0

我想你的代码,这行后:

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

我发现HIWORD(LR)始终是1,而不是0 MSDN说,正确的结果是0,我不知道是什么原因了。

如果你想获得旋转控制的POS,你可以尝试:

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

顺便说一句,通过判断的lpnm-> iDelta符号,你可以知道whick旋的关键是控制按下。