我遇到旋转(向上/向下)控制问题。在旋转控件的属性中,我将“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吗?有什么问题?
答案 0 :(得分:2)
我找到了一个解决方案,但我不确定这是最好还是有意做的事情。如果将lParam强制转换为类型LPNMUPDOWN:
LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam;
您可以获得当前位置和建议的位置变化。通过添加当前位置和建议的更改,您可以获得新职位:
int newPos = lpnmud->iPos + lpnmud->iDelta;
然后,您必须手动获取范围并检查新位置是否在范围的边界内。这似乎是很多工作,但我想这是通常的做法。
答案 1 :(得分:1)
您正在TRUE
处理程序中返回UDN_DELTAPOS
,该处理程序指示控件忽略更改。相反,您应该返回FALSE
。
答案 2 :(得分:0)
我尝试了你的代码,在这一行之后:
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的符号,你可以知道按下旋转控制的按键。