Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПОжалуйста помогите разобраться с CustomDraw для V 
:(
    Опции темы
Иван4444
Дата 19.12.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.8.2008

Репутация: нет
Всего: нет



Всем доброе время суток! столкнулся с проблемой, не знаю как ее решить.
 Суть проблемы: Имеется два массива - один массив со значениями из 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 сбиваются. 
 Помогите пожалуйста советом, как тут быть.
PM MAIL   Вверх
Earnest
Дата 19.12.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.