这个代码可以实现StringGird里的数据自动换行,并隔行显示不同的颜色,但是出现了死循环,导致cpu全占用,如何该呢?     if (State.Contains(gdFixed))
          return ;
     if(ARow %2==0)
     {//变色
        sg1->Canvas->Brush->Color=clSkyBlue;
     }
     //if (ACol != 4)
        //  return ;     AnsiString s = sg1->Cells[ACol][ARow];
     if (s.Length() == 0)
          return ;
     TRect r;     sg1->Canvas->FillRect(Rect);     int q = DrawText(sg1->Canvas->Handle, s.c_str(), s.Length(), &Rect, DT_WORDBREAK); // 自动换行
     sg1->RowHeights[ARow] = q + 5;

解决方案 »

  1.   

     sg1->RowHeights[ARow] = q + 5;
    这个导致重绘,结果就是cpu全占用
      

  2.   

    版主同志,好像就是上面的代码有问题,把sg1->RowHeights[ARow] = q + 5;注释掉就不闪烁了,但是也就没办法调整行高了:(
      

  3.   

    但是我单独测试你的这段代码,在CB6和2009里面都没有你说的情况发生。虽然在自画函数中更改RowHeights确实疑似会再次触发自画。你试试在自画中更改Rect的大小吧。这个值是可以改变的。
      

  4.   

    在CB2009, windowsXpSp2下没出现你说的情况,除了自动换行没看出来,其他功能也都实现了
      

  5.   

    加上doublebuffered = true后cell不闪,但是输入的字闪。
    另外, sg1->RowHeights[ARow] = q + 5;
    不能完全起到你想要的作用,因为你设置row的height时取的是最新的row的所有字的高度+5,但是可能这一row的前几列的高度比这个大。会截断前面的高度。另外,不是很清楚,drawcell哪些事件会触发它,哪位指点一下。还有gdstate=gdfixed是什么状态,另外两种容易理解
      

  6.   

    加上doublebuffered = true后cell不闪,但是输入的字闪。 
    另外, sg1->RowHeights[ARow] = q + 5; 
    不能完全起到你想要的作用,因为你设置row的height时取的是最新的row的所有字的高度+5,但是可能这一row的前几列的高度比这个大。会截断前面的高度。 另外,不是很清楚,drawcell哪些事件会触发它,哪位指点一下。 还有gdstate=gdfixed是什么状态,另外两种容易理解
    ------------------------------------------------------
    我这里doublebuffered=true,还是闪烁,gdfixed就是标头的样式
      

  7.   

     Rect.Bottom  =Rect.top + q+5;
    这样算不算更改了rect的高度?不过我这里没效果哦
      

  8.   

    我这边加上doublebuffer后,cell不闪烁,但是输入字的时候,字会闪烁。我这里doublebuffered=true,还是闪烁,gdfixed就是标头的样式--谢谢。
      

  9.   

    另外有几个问题,如果你输入的字符只有一两行,就是不比默认的高,则不会不停的刷新
    而且在我电脑上,输入前几个cell的时候是没有问题,每当到第4,5个cell时闪烁了。用了InvalidateRect(sg1->Canvas->Handle, &Rect, False);也没用
      

  10.   

    好像是DRAWTEXT闪,fillrect不闪。
      

  11.   

    转到delphi看看,有没有朋友有办法?
      

  12.   

    【自动换行,并自动调整行高】能否在修改完毕(Exit或结束编辑)或滚动(可见的第一行的行号变化)的时候进行?
      

  13.   

    双缓冲没用的
    他这个是个死循环
    sg1->RowHeights[ARow] = q + 5;
    你每次改边,StringGrid 都会重绘,你每次都在改变高度,他就不停在绘 
      

  14.   

    去买包烟先,等下给你用DELPHI写个哈 
      

  15.   

    把StringGrid.DoubleBuffer打开就不闪了
    另外看不懂C++的代码,手头上只有Delphi的
      

  16.   

    判断Cell字符串长度、设置行高的代码不要写在重画相关事件中。这是两件事情,前者应放入Cell值更改事件中。
      

  17.   

    我说怎么找不到这帖了,原来跑Delphi来了。
    双缓冲打开也是闪地。奇怪第一次我试的时候不曾闪过,忘了是哪里设置了一下。
      

  18.   

    晕,这跟双缓冲有关吗?
    他这个每次都是在不停地改变高度,STRINGGRID每次都会重绘,如此循环
      

  19.   

    我刚试过了,把stringgrid的双缓冲打开就不闪了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    太奇怪了!!!!!!
      

  20.   

    想问问楼主最后是怎么实现 自动换行并自动调整行高的?
     sg1->RowHeights[ARow] = q + 5;会使程序陷入死循环!