Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.54.103.76] |
|
Сообщ.
#1
,
|
|
|
Я создал класс 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 ? |
Сообщ.
#2
,
|
|
|
Цитата erslgoeirjh @ рисуются только вертикальные линии, а горизонтальные линии не рисуются. В чём причина этого? Наверное в том ты сначала рисуешь вертикальные линии, потом вызываешь UpdateWindow/RedrawWindow, которые стирают то, что ты нарисовал и посылают сообщение WM_PAINT, по которому отрисовываются горизонтальные линии. Рисуй вертикальные тоже в OnPaint. |