/********************************** * 函数名称: SetColTextColor(int col,COLORREF color) * 函数类型: void * 参数说明: int col,COLORREF color:列号,颜色值 * 函数功能: 设置列表某一列的文本颜色 **********************************/ void CMyListCtrl::SetColTextColor(int col,COLORREF color) { COLORREF cr; stColor Color; Color.nCol=col; Color.rgb=color; int nRet=FindColTextColor(col,cr); if(nRet>=0) { if(color==cr) return; m_colTextColor.RemoveAt(nRet,1); } m_colTextColor.Add(Color); }
void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM ; lvi.iItem = lpDrawItemStruct->itemID ; lvi.iSubItem = 0; lvi.pszText = lpBuffer ; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); LV_COLUMN lvc, lvcprev ; ::ZeroMemory(&lvc, sizeof(lvc)); ::ZeroMemory(&lvcprev, sizeof(lvcprev)); lvc.mask = LVCF_WIDTH | LVCF_FMT; lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rtClient; GetClientRect(&rtClient); for ( int nCol=0; GetColumn(nCol, &lvc); nCol++) { if ( nCol > 0 ) { // Get Previous Column Width in order to move the next display item GetColumn(nCol-1, &lvcprev) ; lpDrawItemStruct->rcItem.left += lvcprev.cx ; lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; } CRect rcItem; if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem)) continue; ::ZeroMemory(&lvi, sizeof(lvi)); lvi.iItem = lpDrawItemStruct->itemID; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = nCol; lvi.pszText = lpBuffer; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CRect rcTemp; rcTemp = rcItem; if (nCol==0) { rcTemp.left -=2; } if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ; pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ; } else { COLORREF color; color = GetBkColor(); pDC->FillSolidRect(rcTemp,color); if (FindColColor(nCol,color)) { pDC->FillSolidRect(rcTemp,color); } if (FindItemColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->FillSolidRect(rcTemp,color); } //pDC->SetTextColor(m_color); } pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT)); UINT uFormat = DT_CENTER ; if (m_Header.m_Format[nCol]=='0') { uFormat = DT_LEFT; } else if (m_Header.m_Format[nCol]=='1') { uFormat = DT_CENTER; } else if (m_Header.m_Format[nCol]=='2') { uFormat = DT_RIGHT; } TEXTMETRIC metric; pDC->GetTextMetrics(&metric); int ofst; ofst = rcItem.Height() - metric.tmHeight; rcItem.OffsetRect(0,ofst/2); pDC->SetTextColor(m_color); COLORREF color; if (FindColTextColor(nCol,color)) { pDC->SetTextColor(color); } if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->SetTextColor(color); } CFont nFont ,* nOldFont; nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont); DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat) ; pDC->SelectStockObject(SYSTEM_FONT) ; } }
//CListCtrl控件的DrawItem消息 void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 TCHAR lpBuffer[CELL_MAXLEN]; int nRow=lpDrawItemStruct->itemID; LV_ITEM lvi; LV_COLUMN lvc, lvcprev ; ::ZeroMemory(&lvc, sizeof(lvc)); ::ZeroMemory(&lvcprev, sizeof(lvcprev)); lvc.mask = LVCF_WIDTH | LVCF_FMT; lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rtClient; GetClientRect(&rtClient); ////////////////////////////////////////////////////////////////////////// for ( int nCol=0; GetColumn(nCol, &lvc); nCol++) { HEADCELL* pHead=m_Head.FindHeadCell(nCol); CELLVALUE* pCell=m_val.GetAt(nRow,nCol); if ( nCol > 0 ) { // Get Previous Column Width in order to move the next display item GetColumn(nCol-1, &lvcprev) ; lpDrawItemStruct->rcItem.left += lvcprev.cx ; lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; } CRect rcItem; if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem)) continue; ::ZeroMemory(&lvi, sizeof(lvi)); lvi.iItem = lpDrawItemStruct->itemID; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = nCol; lvi.pszText = lpBuffer; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CRect rcTemp; rcTemp = rcItem; if (nCol==0) { rcTemp.left -=2; } //背景色 CRect rcBk,rct; GetCellRect(nRow,nCol,rct); rcBk=rct; ////////////////////////////////////////////////////////////////////////// if(nRow==0) rcBk.top-=1; else rcBk.top+=1; rcBk.bottom-=1; ////////////////////////////////////////////////////////////////////////// COLORREF color; color = GetBkColor(); pDC->FillSolidRect(rcBk,color); if(color==RGB(212,208,200)){ rct.top-=1; rct.right+=1; pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT); } //列 if(FindColColor(nCol,color)>-1) { pDC->FillSolidRect(rcBk,color); if(color==RGB(212,208,200)){ rct.top-=1; rct.right+=1; pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT); } } //行 if(FindRowColor(nRow,color)>-1) { pDC->FillSolidRect(rcBk,color); if(color==RGB(212,208,200)){ rct.top-=1; rct.right+=1; pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT); } } //单元格 if(FindItemColor(nCol,nRow,color)>-1) { pDC->FillSolidRect(rcBk,color); if(color==RGB(212,208,200)){ rct.top-=1; rct.right+=1; pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT); } } ////////////////////////////////////////////////////////////////////////// COLORREF colorBack=color; ////////////////////////////////////////////////////////////////////////// UINT uFormat = DT_CENTER; if (pHead && pHead->cFormat==0) { uFormat = DT_LEFT; } else if (pHead && pHead->cFormat==1) { uFormat = DT_CENTER; } else if (pHead && pHead->cFormat==2) { uFormat = DT_RIGHT; } TEXTMETRIC metric; pDC->GetTextMetrics(&metric); int ofst; ofst = rcItem.Height() - metric.tmHeight; rcItem.OffsetRect(0,ofst/2); //文本颜色! pDC->SetTextColor(RGB(0,0,0)); //列 if(FindColTextColor(nCol,color)>-1) { pDC->SetTextColor(color); } //行 if(FindRowTextColor(nRow,color)>-1) { pDC->SetTextColor(color); } //单元格 if(FindItemTextColor(nCol,nRow,color)>-1) { pDC->SetTextColor(color); } //////////////////////////////////////////////////////////////// //选中状态! //if ( lpDrawItemStruct->itemState & ODS_SELECTED )//选中状态! //////////////////////////////////////////////////////////////// //选中一列 if(m_bColSelectedMode) { if(nCol==m_nColSelected) { this->GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rct); pDC->FillSolidRect(&rct,RGB(234,236,245)); if(nRow==0) { pDC->FillSolidRect(rct.left+2,rct.top+1,rct.Width()-3,2,RGB(10,36,106)); pDC->FillSolidRect(rct.left+2,rct.top+1,2,rct.Height()+1,RGB(10,36,106)); pDC->FillSolidRect(rct.right-3,rct.top+1,2,rct.Height()+1,RGB(10,36,106)); } else if(nRow==GetItemCount()-1) { pDC->FillSolidRect(rct.left+2,rct.bottom-3,rct.Width()-3,2,RGB(10,36,106)); pDC->FillSolidRect(rct.left+2,rct.top+1,2,rct.Height()-2,RGB(10,36,106)); pDC->FillSolidRect(rct.right-3,rct.top+1,2,rct.Height()-2,RGB(10,36,106)); } else { pDC->FillSolidRect(rct.left+2,rct.top,2,rct.Height()+1,RGB(10,36,106)); pDC->FillSolidRect(rct.right-3,rct.top,2,rct.Height()+1,RGB(10,36,106)); } } } //行选中 if ( m_nCurSelected!=-1 && m_nCurSelected==nRow ) { //选中一行 if(m_bLineSelected) { CPen pen,*pOld; pen.CreatePen(PS_SOLID,2,RGB(10,36,106)); CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建空画刷,防止遮挡内容; CBrush *pOldBrush; //先是每个单元绘制背景,然后再画一个透明背景的一行矩形框 if(m_bLineSelectBkColor) { if(colorBack!=RGB(212,208,200) || nCol != 0){ this->GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rct); pDC->FillSolidRect(&rct,RGB(234,236,245)); } } pOld=pDC->SelectObject(&pen); pOldBrush=pDC->SelectObject(pBrush); CRect rct; this->GetItemRect(nRow,&rct,LVIR_BOUNDS); FindColColor(0,colorBack); if(colorBack==RGB(212,208,200)){ GetCellRect(nRow,0,rcBk); rct.left+=rcBk.Width(); } ////////////////////////////////////////////////// rct.top+=1; rct.left+=2; rct.bottom-=1; rct.right-=1; pDC->Rectangle(&rct); pDC->SetTextColor(RGB(0,0,255)); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOld); pen.DeleteObject(); } //选中某一个单元 else { if(m_nCurSelCol!=-1 && m_nCurSelCol==nCol) { CPen pen,*pOld; pen.CreatePen(PS_SOLID,2,RGB(10,36,106)); CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建空画刷,防止遮挡内容 CBrush *pOldBrush; pOld=pDC->SelectObject(&pen); pOldBrush=pDC->SelectObject(pBrush); CRect rct; rct=rcTemp; rct.top+=1; rct.left+=2; rct.bottom-=1; rct.right-=1; pDC->Rectangle(&rct); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOld); pen.DeleteObject(); } } } ///////////////////////////////////////////////////////////////// //贴位图! CBitmap bmp,*pOldBmp; CDC memDC; memDC.CreateCompatibleDC(pDC); if(pCell) { CRect rect; GetCellRect(pCell->dwRow,pCell->dwCol,rect); if(pCell->nIDResource>0 && bmp.LoadBitmap(pCell->nIDResource)) { BITMAP bm; bmp.GetBitmap(&bm); pOldBmp=memDC.SelectObject(&bmp); int offH=rect.Height()-bm.bmHeight; int offW=rect.Width()-bm.bmWidth; if(offH>0) { rect.top+=offH/2; rect.bottom-=(offH-offH/2); } if(offW>0) { rect.left+=offW/2; rect.right-=(offW-offW/2); } //显示 pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,\ bm.bmWidth,bm.bmHeight,SRCCOPY); //Clean memDC.SelectObject(pOldBmp); bmp.DeleteObject(); } } //Clean memDC.DeleteDC(); /////////////////////////////////////////////// //文本字体 CFont * pOldFont=NULL; if(m_pFont!=NULL) pOldFont = pDC->SelectObject(m_pFont); int nFontID=FindColFont(nCol); if(nFontID>=0) { pDC->SelectObject(pOldFont); pOldFont=pDC->SelectObject(&m_pItemFont[nFontID].font); } nFontID=FindItemFont(nRow,nCol); if(nFontID>=0) { pDC->SelectObject(pOldFont); pOldFont=pDC->SelectObject(&m_pItemFont[nFontID].font); } //输出文本 pDC->DrawText(lpBuffer,&rcItem,uFormat); //恢复字体 if(pOldFont!=NULL) pDC->SelectObject(pOldFont); /////////////////////////////////////////////// //更新 if(pCell) { Update(nRow,nCol,lpBuffer); } /////////////////////////////////////////////// //控件 } }