[抓狂中!!!]高分悬赏单选按钮的诡异问题!!!!!

BoweirrKing 2006-07-04 08:24:39
请按以下步骤建立一个测试工程,有不出错的,把你的工程整个发给我,如果确实没有问题的,我单独给分!

好了,闲话少说,现在开始:
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~~~~)
...全文
278 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BoweirrKing 2006-07-05
  • 打赏
  • 举报
回复
现在好了,给SetWindowPos加上SWP_NOZORDER参数就一切正常了 :)
BoweirrKing 2006-07-05
  • 打赏
  • 举报
回复
啊,怪不得啊,我跟踪了一下,发现总是在DDX函数中的GetWindow()处出错。
hijack 2006-07-04
  • 打赏
  • 举报
回复
返回值的顺序与Radio Button窗口的Z-order顺序有关系
当这几个Radio Button顺序连续,并且Group属性的Radio排第一个位时,才能返回正确的值。
hijack 2006-07-04
  • 打赏
  • 举报
回复
楼主可以在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参数。
折腾_苏州 2006-07-04
  • 打赏
  • 举报
回复
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

就好了
BoweirrKing 2006-07-04
  • 打赏
  • 举报
回复
“SetWindowPos中你改变了Radio的顺序。”怎么理解????
哪一句改变了Radio的顺序啊?
在程序中,我也是绝对保证Radio1、Radio2、Radio3是从上至下的顺序的~
hijack 2006-07-04
  • 打赏
  • 举报
回复
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;
}

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧