分享

CListCtrl改变行高

 3D建模仿真 2013-05-06

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

       } 
    } 
}
6、含有此列表控件的主对话框OnInitDialog里,
BOOL CListCtrlDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 //  执行此操作
 SetIcon(m_hIcon, TRUE);   // 设置大图标
 SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码
 InitDlg();//调用列表控件初始化InitDlg()

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
7、void CListCtrlDlg::InitDlg()(别忘了在.h里添加void InitDlg();)
{
 m_List.SetExtendedStyle( m_List.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );

 // determine the columns


 m_List.InsertColumn( 0, L"名称");
 m_List.InsertColumn( 1, L"消息详情");
 m_List.SetColumnWidth( 0, 220);
 m_List.SetColumnWidth( 1,243);

 m_List.InsertItem(0,L"检查轴位");//插入行
 m_List.InsertItem(1,L"故障尺寸");
 m_List.InsertItem(2,L"尺寸单位");
 m_List.InsertItem(3,L"处理关门"); 
 m_List.SetItemText(0,1,L"L1");//默认显示
 m_List.SetItemText(1,1,L"0");
 m_List.SetItemText(2,1,L"mm");
 m_List.SetItemText(3,1,L"是");

 m_List.SetRowHeigt(74);//调用设置行高

 m_List.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多