Я создал класс 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 ?
1613 г. = 2024 г.