MFC-CListCtrl设置行高

5 篇文章 0 订阅

CListCtrl改变行高:

1. 表的修改
  新建一个MFC类CMyListCtrl,其基类为CListCtrl,属性Owner Draw Fixed设置为TRUE;
添加变量CMyListCtrl m_List;MyListCtrl.h文件里,添加变量int m_nRowHeight;

2、重载DrawItem()实现自绘,实现请参照以下代码。
   手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。
void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (m_nRowHeight>0)
{
   lpMeasureItemStruct->itemHeight = m_nRowHeight;
}
}
3、添加ON_WM_MEASUREITEM,响应消息处理OnMeasureItem()
void CMyListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

4、void CMyListCtrl::SetRowHeigt(int nHeight) //高置行高(别忘了在.h里添加void 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);
}
5、重画列表控件,重载DrawItem,添加ON_WM_DRAWITEM();
(别忘了在.h里添加void DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) ;)
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);

       }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值