CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

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

楼主BoweirrKing(忽然变傻)2006-07-04 20:24:39 在 VC/MFC / 基础类 提问

请按以下步骤建立一个测试工程,有不出错的,把你的工程整个发给我,如果确实没有问题的,我单独给分!  
   
  好了,闲话少说,现在开始:  
  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

相关问题

关键词

得分解答快速导航

  • 帖主:BoweirrKing
  • seu07201213
  • hijack

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo