Не перерисовываются линии в CListCtrl
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 05.03.19 06:44
Оценка:
Я создал класс 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 ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.