Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > ПОжалуйста помогите разобраться с CustomDraw для V


Автор: Иван4444 19.12.2008, 16:17
Всем доброе время суток! столкнулся с проблемой, не знаю как ее решить.
 Суть проблемы: Имеется два массива - один массив со значениями из 0 и 1. Где 0 - означает что строка должна быть закрашена цветом по умолчанию, а 1 - означает что строка должна быть закрашена пользовательским цветом.

 вот пример Кода:
Код


        byte color_check = 0;   // Проверка на вызов соощения CDRF_NEWFONT;
    byte col_count    = 0;   // Сколько уже строк заполненно

    col_count             = ListView_GetCountPerPage(pwt.Grid);   // Узнаю сколько всего строк моет быть отраженно в моей табличной части

     LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;
      if (!pnm)
        return 0;


      if(pwt.cl_count != ListView_GetTopIndex(pwt.Grid))         // Проверяю изменился ли итем (когда скролл двигаешь по гор-и, скролл не                  /                                                                                                  //  изменяется, и поэтому накручивать col_count не нужно
      {
         pwt.cl_count       = ListView_GetTopIndex(pwt.Grid);     // Получаю верхний индекс видимого Itema (строки)                                                                                     
         pwt.ColorItem      = pwt.cl_count;    
      }
      else
      {
      }

      switch (pnm->hdr.code)
      {
        case NM_CUSTOMDRAW:
        {
          LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)lParam;                     

          if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
            return CDRF_NOTIFYITEMDRAW;

          if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
          {

            switch(lplvcd->iSubItem)
            {                            
                case 0:
                {                                                    
                    if(pwt.col_item  >= col_count)
                    {
                        pwt.ColorItem = pwt.cl_count;
                        pwt.col_item  = 0;
                    }                                

                    if(colLin.ColorLine[pwt.ColorItem] == 1)
                    {
                        SelectObject(lplvcd->nmcd.hdc, pwt.Grid);
                        color_check = 1;
                    }
                    else
                    {
                        color_check = 0;
                    }    

                    pwt.ColorItem++;        
                    pwt.col_item++;


                }
                break;                            
                                
                default:
                    return CDRF_DODEFAULT;
            }//END: switch(lplvcd->iSubItem)
            
            if(color_check == 1)
            {
                lplvcd->clrTextBk = RGB(0,230,0);

                return CDRF_NEWFONT;
            }
            
          }
        }

        default:
          break;
      }

      return 0;


Раннее преполагалость что перерисовка вызывается ровно столько раз, сколько строк видно в видимой части ( использую virtual list view).
Но как показала практика , при смещении VSCROLL'а (вертикальной прокрутки ) вниз на одну строку , перерисовка вызываектся только два раза, тоесть я так понял он в первый раз сдвигает все словно BITMAP , а второй раз выводит последнююстроку) и все, прорисовка на этом заканчивается, и на этом месте индексы pwt.col_item сбиваются. 
 Помогите пожалуйста советом, как тут быть.

Автор: Earnest 19.12.2008, 17:11
Рецепт один: цвте строки (или этот самый 0-1) должен быть жестко привязан к номеру строки ListView. Где тыэто хранить будешь - дело твое. Можно прямо в UserData, если туда больше нечего сунуть. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)