[抓狂中!!!]高分悬赏单选按钮的诡异问题!!!!!
请按以下步骤建立一个测试工程,有不出错的,把你的工程整个发给我,如果确实没有问题的,我单独给分!
好了,闲话少说,现在开始:
1、用VC6建立一个基于对话框的MFC程序。
2、在对话框上放三个Radio Button,不用改它们的ID,用默认的就成,记得把第一个Radio Button的Group属性勾上。
3、用类向导添加一个int型的成员变量m_nSel,用来接收这组Radio的选择结果。
3、响应每个单选按钮的BN_CLICKED消息。
4、在每个消息响应函数中写入以下代码:
//-----------------------
UpdateData();
CString s;
s.Format("你选中了第 %d 项!",m_nSel);
MessageBox(s);
return;//如果在这里就返回,则一切正常。
//如果继续执行下去,下一次UpdateData()就得不到正确结果!!
CRect rt;
GetDlgItem(IDC_RADIO1)->GetWindowRect(&rt);
ScreenToClient(&rt);
int h=rt.Height();//每一个Radio的高度
switch(m_nSel)
{
case 0:
GetDlgItem(IDC_RADIO2)->SetWindowPos(0,rt.left,rt.bottom+5+15,0,0,SWP_NOSIZE);
GetDlgItem(IDC_RADIO3)->SetWindowPos(0,rt.left,rt.bottom+5+h+15,0,0,SWP_NOSIZE);
break;
case 1:
rt.top=rt.bottom;
rt.bottom=rt.top+h;
GetDlgItem(IDC_RADIO2)->SetWindowPos(0,rt.left,rt.bottom,0,0,SWP_NOSIZE);
GetDlgItem(IDC_RADIO3)->SetWindowPos(0,rt.left,rt.bottom+5+20+15,0,0,SWP_NOSIZE);
break;
case 2:
rt.top=rt.bottom;
rt.bottom=rt.top+h;
GetDlgItem(IDC_RADIO2)->SetWindowPos(0,rt.left,rt.bottom,0,0,SWP_NOSIZE);
rt.top=rt.bottom;
rt.bottom=rt.top+h;
GetDlgItem(IDC_RADIO3)->SetWindowPos(0,rt.left,rt.bottom,0,0,SWP_NOSIZE);
break;
}
//这些代码的目的是:点击不同的选项,要显示不同的控件出来,但是需要移动一下这些单选按钮的位置以显示别的东西。结果代码写好了,就出来这么个诡异的问题!见下述。
//----------------------
现在可以编译运行了。
但此时问题也就出现了!!!
用鼠标点选某个选项,无论是第几个,第一次点击所弹出的消息框中的结果总是正确的。
在此之后的点击,全部无法得到正确的值!
请各位大人指正或给个说法,在下谢谢,先!!!
(继续抓ing~~~~)
问题点数:80、回复次数:7Top
1 楼hijack(Time timeIsMoney)回复于 2006-07-04 20:39:26 得分 0
SetWindowPos中你改变了Radio的顺序。设置成原来的顺序就可以了
CWnd * pr1 = GetDlgItem(IDC_RADIO1);
CWnd * pr2 = GetDlgItem(IDC_RADIO2);
switch(m_nSel)
{
case 0:
GetDlgItem(IDC_RADIO2)->SetWindowPos(pr1,rt.left,rt.bottom+5+15,0,0,SWP_NOSIZE);
GetDlgItem(IDC_RADIO3)->SetWindowPos(pr2,rt.left,rt.bottom+5+h+15,0,0,SWP_NOSIZE);
break;
case 1:
rt.top=rt.bottom;
rt.bottom=rt.top+h;
GetDlgItem(IDC_RADIO2)->SetWindowPos(pr1,rt.left,rt.bottom,0,0,SWP_NOSIZE);
GetDlgItem(IDC_RADIO3)->SetWindowPos(pr2,rt.left,rt.bottom+5+20+15,0,0,SWP_NOSIZE);
break;
case 2:
rt.top=rt.bottom;
rt.bottom=rt.top+h;
GetDlgItem(IDC_RADIO2)->SetWindowPos(pr1,rt.left,rt.bottom,0,0,SWP_NOSIZE);
rt.top=rt.bottom;
rt.bottom=rt.top+h;
GetDlgItem(IDC_RADIO3)->SetWindowPos(pr2,rt.left,rt.bottom,0,0,SWP_NOSIZE);
break;
}
Top
2 楼BoweirrKing(忽然变傻)回复于 2006-07-04 21:53:39 得分 0
“SetWindowPos中你改变了Radio的顺序。”怎么理解????
哪一句改变了Radio的顺序啊?
在程序中,我也是绝对保证Radio1、Radio2、Radio3是从上至下的顺序的~Top
3 楼seu07201213(【_】〖汪洋中的一片叶子〗≈^︵^≈)回复于 2006-07-04 22:18:50 得分 20
BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );
关键在于SetWindowPos的第一个参数:pWndInsertAfter
Identifies the CWnd object that will precede this CWnd object in the Z-order.
它管理着子窗体之间的Z-order,把上面所有SetWindowPos函数的第一个参数0换成&wndBottom
就好了Top
4 楼hijack(Time timeIsMoney)回复于 2006-07-04 22:24:21 得分 60
楼主可以在MSDN看看CWnd::SetWindowPos的第一个参数是什么意思:
pWndInsertAfter
Identifies the CWnd object that will precede this CWnd object in the Z-order. This parameter can be a pointer to a CWnd or a Pointer to one of the following values:...
SetWindowPos的第一个参数是0,虽然MSDN没写0是什么意思,但看SetWindowPos的代码,其实是转调SDK的SetWindowPos,使用HWND_TOP参数。
Top
5 楼hijack(Time timeIsMoney)回复于 2006-07-04 22:41:40 得分 0
返回值的顺序与Radio Button窗口的Z-order顺序有关系
当这几个Radio Button顺序连续,并且Group属性的Radio排第一个位时,才能返回正确的值。Top
6 楼BoweirrKing(忽然变傻)回复于 2006-07-05 09:35:51 得分 0
啊,怪不得啊,我跟踪了一下,发现总是在DDX函数中的GetWindow()处出错。Top
7 楼BoweirrKing(忽然变傻)回复于 2006-07-05 09:39:38 得分 0
现在好了,给SetWindowPos加上SWP_NOZORDER参数就一切正常了 :)Top




