實現CListCtrl自定義行高


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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM