Я использовал сообщение WM_NOTIFY_REFLECT и функцию CListCtrl::OnCustomDraw . Вот код:
Код | void CMyListCtrl::PreSubclassWindow() { pBrush = new CBrush(RGB(128,128,128)); LOGFONT lf; memset(&lf.0,sizeof(LOGFONT)); lf.lfHeight = 10; lf.lfWidth = 6; lf.lfWeight = FW_NORMAL; wcscpy(lf.lfFaceName,L"MS Sans Serif"); m_MyFont.CreateFontIndirect(&lf); CListCtrl::PreSubclassWindow(); }
void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { int i, n; CRect rect, rect2, rect3; cellinfo mycellinfo; CString myString; NMLVCUSTOMDRAW* pLVCustomDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); NMCUSTOMDRAW pLV = (NMCUSTOMDRAW)pLVCustomDraw->nmcd; *pResult = CDRF_DODEFAULT; switch (pLVCustomDraw->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult |= CDRF_NOTIFYITEMDRAW; break; case ITEMPREPAINT: SelectObject(pLVCustomDraw->nmcd.hdc,m_MyFont); if (typeofdraw==1) { n = pLVCustomDraw->nmcd.dwItemSpec; myStringm = GetItemText(n,0); if (myString!=L"") { GetSubItemRect(n,0,LVIR_LABEL,rect3); SetItemText(n,0,L""); GetDC()->TextOut(rect3.left+3,rect3.top+1,myString); } if (i=1;i<25;i++) { myString = GetItemText(n,i); if (myString!=L"") { GetSubItemRect(n,i,LVIR_LABEL,rect3); GetDC()->TextOut(rect3.left+3,rect3.top+1,myString); } GetSubItemRect(n,i,LVIR_BOUNDS,rect); mycellinfo = (cellinfo)(cellattributes.at(n*25+i)); if (mycellinfo.cellstate==1) { rect2.top = rect.top + 2; rect2.bottom = rect.bottom + 2; rect2.left = rect.left + mycellinfo.beginpos; rect2.right = rect.right; GetDC()->FillRect(&rect2,pBrush); } if (mycellinfo.cellstate==2) { rect2.top = rect.top + 2; rect2.left = rect.left; rect2.right = rect.right; rect2.bottom = rect.bottom + 2; GetDC()->FillRect(&rect2,pBrush); } if (mycellinfo.cellstate==3) { rect2.top = rect.top + 2; rect2.bottom = rect.bottom + 2; rect2.left = rect.left; rect2.right = rect.left + mycellinfo.endpos; GetDC()->FillRect(&rect2,pBrush); } if (mycellinfo.cellstate==4) { rect2.top = rect.top + 2; rect2.bottom = rect.bottom + 2; rect2.left = rect.left + mycellinfo.beginpos; rect2.right = rect.left + mycellinfo.endpos; GetDC()->FillRect(&rect2,pBrush); } } } break; } }
|
Строки с закрашиваемыми зонами и с текстом отображаются. Но есть одна проблема: при прокрутке вертикального скроллбара таблицы вниз, а потом вверх не отображается содержимое (текстовое) самого первого (т.е. нулевого) столбца таблицы у первых строк таблицы, которые отображались нормально перед первоначальной прокруткой таблицы вниз. В чём причина этого? Как сделать так, чтобы при возвращения вертикального скроллбара таблицы к её первым строкам содержимое этих первых строк, в том числе текстовое содержимое их нулевого столбца нормально отображалось? |