Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2019, 09:52   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Не перерисовываются линии в CListCtrl

Я создал класс ClistCtrlEx2, который является потомком класса CListCtrl.
В этом классе я переопределил метод OnPaint--в нём рисуются только вертикальные линии в таблице:

Код:
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, которая устанавливает значения элементов этого вектора:

Код:
void  CListCtrlEx2::setFlagsVector(vector<int> flagsVector)
{
    this->flagsVector = flagsVector;
}

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

Код:
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();
}

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

Код:
m_IDC_LIST1.setFlagsVector(flagsVector);
m_IDC_LIST1.PaintLines();
m_IDC_LIST1.UpdateWindow();
m_IDC_LIST1.RedrawWindow();

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть макет photoshop psd, на нем линии(разметка). Как узнать, сколько пиксилей до сторон(от указанной линии)? Gefo HTML и CSS 1 17.01.2013 07:54
MFC, CListCtrl и Колбэки psycho-coder Visual C++ 2 13.01.2013 16:43
Получение указателя на CListCtrl Kh_Shad Visual C++ 13 22.10.2011 17:57
Иногда не перерисовываются Label'ы bro Компоненты Delphi 2 16.12.2010 14:32
Delphi: не перерисовываются окна. chaostalker Помощь студентам 4 20.01.2010 09:19