1. 自定義CMyListCtrl:CListCtrl,並添加如下變量及函數:
int m_nRowHeight;
int m_nRowHeight; void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) { if (m_nRowHeight>0) { lpMeasureItemStruct->itemHeight = m_nRowHeight; } } void CMyListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } void CMyListCtrl::SetRowHeigt(int nHeight) { m_nRowHeight = nHeight; CRect rcWin; GetWindowRect(&rcWin); WINDOWPOS wp; wp.hwnd = m_hWnd; wp.cx = rcWin.Width(); wp.cy = rcWin.Height(); wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER; SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp); } void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) { CDC* pDC = CDC::FromHandle(lpMeasureItemStruct->hDC); LVITEM lvi = {0}; lvi.mask = LVIF_STATE;//|LVIF_IMAGE; lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ; lvi.iItem = lpMeasureItemStruct->itemID; BOOL bGet = GetItem(&lvi); //高亮顯示 BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||((lvi.state & LVIS_SELECTED) && ((GetFocus() == this)|| (GetStyle() & LVS_SHOWSELALWAYS)))); // 畫文本背景 CRect rcBack = lpMeasureItemStruct->rcItem; pDC->SetBkMode(TRANSPARENT); if( bHighlight ) //如果被選中 { pDC->SetTextColor(RGB(255,255,255)); //文本為白色 pDC->FillRect(rcBack, &CBrush(RGB(90,162,0))); } else { pDC->SetTextColor(RGB(0,0,0)); //文本為黑色 pDC->FillRect(rcBack, &CBrush(RGB(255,255,255))); } if (lpMeasureItemStruct->itemAction & ODA_DRAWENTIRE) { //寫文本 CString szText; int nCollumn = GetHeaderCtrl()->GetItemCount();//列數 for (int i = 0; i < GetHeaderCtrl()->GetItemCount(); i++) { //循環得到文本 CRect rcItem; if ( !GetSubItemRect(lpMeasureItemStruct->itemID, i, LVIR_LABEL, rcItem )) continue; szText = GetItemText( lpMeasureItemStruct->itemID, i ); rcItem.left += 5; rcItem.right -= 1; pDC->DrawText(szText, lstrlen(szText), &rcItem, DT_LEFT | DT_VCENTER | DT_NOPREFIX | DT_SINGLELINE); } } }
2. 添加消息:
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) //{{AFX_MSG_MAP(CMyListCtrl) // NOTE - the ClassWizard will add and remove mapping macros here. ON_WM_MEASUREITEM_REFLECT() ON_WM_MEASUREITEM() ON_WM_DRAWITEM() //}}AFX_MSG_MAP END_MESSAGE_MAP()
3. 在使用該控件的地方,設置該控件資源:
Report、Ower draw fixed
4. 初始化該控件測試。如:
m_list.InsertColumn( 0, "名稱"); m_list.InsertColumn( 1, "消息詳情"); m_list.SetColumnWidth( 0, 220); m_list.SetColumnWidth( 1,243); m_list.InsertItem(0,"檢查軸位");//插入行 m_list.InsertItem(1,"故障尺寸"); m_list.InsertItem(2,"尺寸單位"); m_list.InsertItem(3,"處理關門"); m_list.SetItemText(0,1,"L1");//默認顯示 m_list.SetItemText(1,1,"0"); m_list.SetItemText(2,1,"mm"); m_list.SetItemText(3,1,"是"); m_list.SetRowHeigt(50);//調用設置行高 m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);