На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Не перерисовываются линии в CListCtrl
    Я создал класс ClistCtrlEx2, который является потомком класса CListCtrl.
    В этом классе я переопределил метод OnPaint--в нём рисуются только вертикальные линии в таблице:

    ExpandedWrap disabled
      void CListCtrlEx2::OnPaint()
      {
          int  i, n, m, nItem;
          RECT  rect;
       
          const MSG *msg = GetCurrentMessage();
          DefWindowProc(msg->message,msg->wParam,msg->lParam);
          if ((GetStyle() & LVS_TYPEMASK)==LVS_REPORT)
          {
              CClientDC  dc(this);
              dc.SetDCBrushColor(RGB(255,0,0));
              CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
              int  nColumnCount = pHeader->GetItemCount();
              RECT  rect;
              pHeader->GetClientRect(&rect);
              int  top = rect.bottom;
              GetClientRect(&rect);
              int  borderx = 0 - GetScrollPos(SB_HORZ);
              for (int i=0; i<nColumnCount; i++)
              {
                  borderx += GetColumnWidth(i);
                  if (borderx>=rect.right)  break;
                  dc.MoveTo(borderx-1,top);
                  dc.LineTo(borderx-1,rect.bottom);
              }
              if (!GetItemRect(0,&rect,LVIR_BOUNDS))
                  return;
              int  height = rect.bottom - rect.top;
              GetClientRect(&rect);
              int  width = rect.right;
          }
          //CListCtrl::OnPaint();
      }



    Также в этом классе есть поле flagsVector, являющееся вектором (динамическим массивом) типа int (то есть std::vector<int> flagsvector), элементы которого имеют значения 0 или 1.
    Есть и функция setFlagsVector, которая устанавливает значения элементов этого вектора:

    ExpandedWrap disabled
      void  CListCtrlEx2::setFlagsVector(vector<int> flagsVector)
      {
          this->flagsVector = flagsVector;
      }



    Есть также функция PaintLines, которая рисует вертикальные линии всегда и горизонтальные линии в зависимости от того, чему равно значение соответствующего элемента в векторе flagsVector--если значение элемента вектора равно 0, то горизонтальная линия рисуется, если же она равна 1, то горизонтальная линия не рисуется:

    ExpandedWrap disabled
      void CListCtrlEx2::PaintLines()
      {
          int  i, n, m, nItem;
          RECT  rect;
       
          const MSG *msg = GetCurrentMessage();
          DefWindowProc(msg->message,msg->wParam,msg->lParam);
          if ((GetStyle() & LVS_TYPEMASK)==LVS_REPORT)
          {
              CClientDC  dc(this);
              dc.SetDCBrushColor(RGB(255,0,0));
              CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
              int  nColumnCount = pHeader->GetItemCount();
              RECT  rect;
              pHeader->GetClientRect(&rect);
              int  top = rect.bottom;
              GetClientRect(&rect);
              int  borderx = 0 - GetScrollPos(SB_HORZ);
              for (int i=0; i<nColumnCount; i++)
              {
                  borderx += GetColumnWidth(i);
                  if (borderx>=rect.right)  break;
                  dc.MoveTo(borderx-1,top);
                  dc.LineTo(borderx-1,rect.bottom);
              }
              if (!GetItemRect(0,&rect,LVIR_BOUNDS))
                  return;
              int  height = rect.bottom - rect.top;
              GetClientRect(&rect);
              int  width = rect.right;
              m = flagsVector.size();
              if (m==0)
              {
                  for (int i=1; i<=GetCountPerPage();i++)
                  {
                  dc.MoveTo(0,top+height*i);
                  dc.LineTo(width,top+height*i);
                      }
              }
              else
              {
                  for (int i=1; i<=GetCountPerPage();i++)
                  {
                      if (i<=m)
                                  // если i не превышает m--число элементов в векторе flagsVector
                      {
                      if ((int)(flagsVector.at(i-1))==0)
                      {
                          dc.MoveTo(0,top+height*i);
                              dc.LineTo(width,top+height*i);
                          }
                      }
                      else
                                  // если i больше m, то рисуется горизонтальная линия без всяких условий
                      {
                      dc.MoveTo(0,top+height*i);
                          dc.LineTo(width,top+height*i);
                      }
                  }
              }
          }
          //CListCtrl::OnPaint();
      }



    В вызывающей функции код выглядит так:

    ExpandedWrap disabled
      m_IDC_LIST1.setFlagsVector(flagsVector);
      m_IDC_LIST1.PaintLines();
      m_IDC_LIST1.UpdateWindow();
      m_IDC_LIST1.RedrawWindow();



    Но в программе почему-то не происходит перерисовка линий в этом m_IDC_LIST1 (типа CListCtrlEx2)--в таблице рисуются только вертикальные линии, а горизонтальные линии не рисуются. В чём причина этого? Как сделать так, чтобы работала перерисовка линий в CListCtrlEx2 ?
      Цитата erslgoeirjh @
      рисуются только вертикальные линии, а горизонтальные линии не рисуются. В чём причина этого?

      Наверное в том ты сначала рисуешь вертикальные линии, потом вызываешь UpdateWindow/RedrawWindow, которые стирают то, что ты нарисовал и посылают сообщение WM_PAINT, по которому отрисовываются горизонтальные линии.
      Рисуй вертикальные тоже в OnPaint.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0302 ]   [ 17 queries used ]   [ Generated: 28.03.24, 11:53 GMT ]