MSFlexGrid内嵌CheckBox问题:我有一个对话框,里面有一个组合框、MSFlexGrid等其他控件;组合框中的数据是从1-512的数,用来动态增加MSFlexGrid的行数和动态生成CheckBox的个数,我用一个数组来存放CheckBox的ID//front_count,back_count是int型的全局变量,当多次点击组合框时,用于分别记录前一次和后一次组合框中的数据void CDigitAlarm::OnSelchangeCombo1() //组合框处理
{
CString str,str1;
m_sizecomb.GetLBText(m_sizecomb.GetCurSel(),str);  //获得组合框中的数据

back_count=atoi(str);       //组合框中的数据
if(back_count>front_count)  //当后一次选择比前一次的数值大时
{
    m_flexgrid.SetRows(back_count+1); //设置控件的行数
    for(int i=front_count+1;i<back_count+1;i++)
    {
     m_check[i].Create(_T(""), WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 
         CRect(40,101,53,114), &m_flexgrid, i); //动态生成复选框控件,
      m_check[i].SetCheck(1);  //设置选择中状态
      m_flexgrid.SetRowHeight(i,350);     long y = m_flexgrid.GetRowPos(i)/nTwipsPerDotY;//nTwipsPerDotY在初始化时已经初始化
     long x = m_flexgrid.GetColPos(1)/nTwipsPerDotX; //nTwipsPerDotX在初始化时已经初始化     CRect rc(x+2,y+5,x+15,y+18);
     m_check[i].MoveWindow(rc);  //移动生成的复选框

}
     front_count=back_count;
}
  else if(back_count<front_count)      //当后一次选择比前一次的数值小时
 {
   for(int j=back_count+1;j<=front_count;j++)
   m_check[j].DestroyWindow();   //删除动态生成的控件
   m_flexgrid.SetRows(back_count+1); //设置控件的行数
   front_count=back_count;
   MessageBox("减少警报区大小将会丢失一些警报定义","警报",MB_ICONWARNING);
 }
}出现的问题是:(每个复选框的ID为MSFlexGrid的行号)
当我选择组合框的值较大,即添加的行数较多,MSFlexGrid出现滚动条时,当我点击滚动条,再点击由不可见部分变成可见部分的CheckBox的时候,发现由不可见部分变成可见部分的CheckBox的ID不等于MSFlexGrid的行号,而是都等于我没有点击滚动条前MSFlexGrid控件可见部分的最后一行的行号。这是什么问题?我觉得要添加滚动条的处理函数,但不知道该怎么处理才能使不管我是否点击了滚动条,当我点击任何一行中的CheckBox时,该CheckBox的ID应该和点击MSFlexGrid的行号相同;void CAnalogy::OnScrollMsflexgrid1() 
{
//该如何写
}

解决方案 »

  1.   

    to VsirSoft :
    简单的说就是:我动态生成CheckBox的个数是MSFlexGrid添加行数减1个。而这些动态生成的CheckBox的个数和添加MSFlexGrid的行数是由组合框控制的。我把CheckBox放在第一列,每行中的CheckBox的ID为MSFlexGrid的行号。比如MSFlexGrid最多可以显示10行,当我增加到20行时MSFlexGrid就会自动添加滚动条,11-20行的数据是看不见的,要拉动滚动条才能看见。出现的问题:我没有拉动滚动条是,我点击每行的CheckBox,单步调试得出它的ID和所在的行号相同。一旦我拉动或点击滚动条时,点击11-20行中的任何一行中的CheckBox时,单步调试得出它的ID都是10。为什么不是11-20之间的数呢?
      

  2.   

    检查:m_check[i].Create是否每个都成功.
      

  3.   

    to schlafenhamster:我调试过了,m_check[i].Create每个都创建成功了
      

  4.   

    刚又调试了一下,发现当我移动滚动条时,在MSFlexGrid可见部分从头开始的checkbox的ID又是重新从1开始排列。
      

  5.   

    to LBPeking :
    我觉得也是重绘了。但不知道怎么解决,弄了三四天了。烦呀!!!现在只能是一下加载滚动条控件试一下。谁知道的,帮帮忙,在此谢过!!!!!!
      

  6.   

    那么如何使MSFlexGrid随滚动条移动呢??
      

  7.   

    ID + POS/hEIGHT POS为滚动条的。
    hEIGHT 为一行的高度。
      

  8.   

    To csy8217:
    能否说具体点?
      

  9.   

    一般滚动条的SetScrollRange()里面参数MIN,MAX是用MIN=0,MAX为理论窗口大小-窗口大小(像素值)
    POS = GetScrollPos()为当前的滚动条位置,POS + 窗口大小为当前窗口左上角在理论窗口大小的坐标。height 为你窗口中显示一行的高度(像素)。
    POS/height+1就是你窗口中第一行在理论窗口中的行数。你选择的是窗口第2行就是理论窗口中的POS/height+1+2要注意由10行以上到10行以下滚动条消失的时候要SetScrollPos(0)
      

  10.   

    跟正 POS/height+1就是你窗口中第一行在理论窗口中的行数。你选择的是窗口第2行就是理论窗口中的POS/height+2
      

  11.   


    像这种问题我觉得你应该派生checkbox利用成员变量来存储他的ID值,你添加的时候无疑知道他的ID,你可以直接循环的添加并把这个ID赋值给成员变量.
    当取的时候 你可以响应单击事件 来传出checkbox的this指针.用this->成员变量值来得到这个ID.这样是可以解决的.具体你那个没有调试过 我也不知道什么问题.
      

  12.   

    to VsirSoft :
    我是用全局变量存放checkbox的ID值,也是用循环的添加ID值的,但发现当我移动滚动条时,在MSFlexGrid可见部分的checkbox的ID值总是从第一行开始从1开始排列。我现在还不知道怎么解决。
      

  13.   

    to:SummerHeart 
    就是找不到重排的地方。我单步调试,也找不到原因所在。
      

  14.   

    我没有写重排CheckBox的ID的 代码,所以很难找到是什么原因引起的。