自绘ListCtrl -- 设置行高

以下是通过重载DramItem()方法来实现自绘,

故需要设置ListCtrl控件属性"Owner DrawFixed"TRUE,"Owner Data"FALSE(默认为FLASE);

 

1.  准备工作
(1).
新建一个MFCCMyListCtrl,其基类为CListCtrl
(2).
ListCtrl控件属性"Owner DrawFixed"设置为TRUE,"Owner Data"设置为FALSE(默认为FLASE);
(3).
ListCtrl控件所在对话框类声明中,修改控件变量声明为CMyListCtrl m_List;
(4).
MyListCtrl.h文件里,添加变量int m_nRowHeight;

2. 手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),并添加下面的函数,实现修改行高 

[cpp] view plain copy

1.  void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)  

2.  {  

3.      if (m_nRowHeight>0)  

4.      {  

5.          lpMeasureItemStruct->itemHeight = m_nRowHeight;  

6.      }  

7.  }  


3.
手动添加消息宏ON_WM_MEASUREITEM,响应消息处理OnMeasureItem() 

[cpp] view plain copy

1.  void CMyListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)  

2.  {  

3.      // TODO: 在此添加消息处理程序代码和/或调用默认值  

4.      CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);  

5.  }  


4.
添加成员变量int m_nRowHeight,并且添加对外修改接口

[cpp] view plain copy

1.  void CMyListCtrl::SetRowHeigt(int nHeight)  

2.  {  

3.      m_nRowHeight = nHeight;  

4.        

5.      CRect rcWin;  

6.      GetWindowRect(&rcWin);  

7.      WINDOWPOS wp;  

8.      wp.hwnd = m_hWnd;  

9.      wp.cx = rcWin.Width();  

10.     wp.cy = rcWin.Height();  

11.     wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;  

12.     SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);  

13. }  


5.
手动添加消息宏ON_WM_DRAWITEM(),重载DrawItem()重画列表控件

[cpp] view plain copy

1.  void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  

2.  {  

3.    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);      

4.    LVITEM lvi = {0};   

5.    lvi.mask = LVIF_STATE;//|LVIF_IMAGE;   

6.    lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;   

7.    lvi.iItem = lpDrawItemStruct->itemID;   

8.    BOOL bGet = GetItem(&lvi);   

9.      

10.   //高亮显示    

11.   BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||((lvi.state & LVIS_SELECTED)   

12.   && ((GetFocus() == this)|| (GetStyle() & LVS_SHOWSELALWAYS))));  

13.     

14.   //画文本背景   

15.   CRect rcBack = lpDrawItemStruct->rcItem;   

16.   pDC->SetBkMode(TRANSPARENT);   

17.     

18.   if( bHighlight ) //如果被选中  

19.   {   

20.     pDC->SetTextColor(RGB(255,255,255));              //文本颜色  

21.     pDC->FillRect(rcBack, &CBrush(RGB(90,162,100)));  //行背景色  

22.   }   

23.   else   

24.   {   

25.     pDC->SetTextColor(RGB(0,0,0));                    //文本颜色  

26.     pDC->FillRect(rcBack, &CBrush(RGB(255,255,255))); //行背景色  

27.   }   

28.     

29.   //绘制文本  

30.   if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)   

31.   {   

32.     //得到列数  

33.     int nCollumn = GetHeaderCtrl()->GetItemCount();  

34.       

35.     //循环处理  

36.     CString szText;   

37.     for (int i = 0; i < GetHeaderCtrl()->GetItemCount(); i++)   

38.     {    

39.       CRect rcItem;   

40.       if ( !GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, rcItem ))  

41.       {   

42.         continue;   

43.       }  

44.         

45.       szText = GetItemText( lpDrawItemStruct->itemID, i );  

46.         

47.       rcItem.left += 5; rcItem.right -= 1;   

48.       pDC->DrawText(szText, lstrlen(szText), &rcItem,    

49.       DT_LEFT | DT_VCENTER | DT_NOPREFIX | DT_SINGLELINE);    

50.     }   

51.   }   

52. }  




改变行高的方法II:也可以通过在每一行插入图标来撑起高,图标可以根据需要是否要真正插入

先设置ListCtrl属性

[cpp] view plain copy

1.  //加载ListCtrl  

2.  LONG lStyle;  

3.  lStyle = GetWindowLong(m_TaskList.m_hWnd, GWL_STYLE); //获取当前窗口Style  

4.  lStyle &= ~LVS_TYPEMASK; //清除显示方式  

5.  lStyle |= LVS_REPORT | LVSIL_SMALL | LVS_ALIGNTOP | LVS_SHOWSELALWAYS; //设置Style  

6.  SetWindowLong(m_TaskList.m_hWnd, GWL_STYLE, lStyle);  

7.  DWORD dwStyle = m_TaskList.GetExtendedStyle();  

8.  //dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(只适用与report风格的listctrl  

9.  dwStyle |= LVS_EX_SUBITEMIMAGES; //subitem添加图标  

10. dwStyle |= LVS_EX_DOUBLEBUFFER;  

11. m_TaskList.SetExtendedStyle(dwStyle);  

12. //::SendMessage(m_TaskList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);  


再设置图标(行高)

[cpp] view plain copy

1.  //设置ListCtrl行高(仅通过cy=44来控制行高,但这里并不需要加载图标,需要再APP下载时根据不同的APP动态加载具体的图标)  

2.  m_ImageList.Create(44, 44, ILC_COLOR32 | ILC_MASK, 0, 10); //如果用32*32的会改变行高.ILC_MASK将图标背景设为透明,否则空白地方均为黑色  

3.  m_ImageList.SetBkColor(RGB(255, 255, 255)); //需要设置背景色为白色,否则图标镂空的地方都是黑色,且图标有黑边框  

4.  //m_nInstall = m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));   //只能是.ico图片,.bmp格式不显示, Add返回索引0  

5.  m_nInstall = m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));  //或者这个  

6.  m_TaskList.SetImageList(&m_ImageList, LVSIL_SMALL); //LVSIL_SMALL为小图标(16*16),LVSIL_NORMAL为大图标(32*32),一定要配套使用,否则不显示  




引用:

http://bbs.csdn.net/topics/390471207

http://www.cnblogs.com/rainbowzc/archive/2009/08/30/1556904.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC ListCtrl自绘是指通过自定义绘制方法,对MFC List Control控件进行个性化的绘制。通过自绘,我们可以修改List Control的外观,使其更加符合我们的设计需求。 实现MFC ListCtrl自绘的步骤如下: 1. 首先,在资源编辑器中创建一个List Control控件,并为其添加一个自定义的ID。 2. 在对应的对话框类中,添加一个成员变量来控制这个List Control控件。 3. 在对话框类的OnInitDialog()函数中,使用GetDlgItem()函数来获取该List Control控件的指针,并给该指针赋值。 4. 在对话框类的DrawItem函数中,通过使用CDC类的相关函数来进行自绘。可以根据需要,对List Control的各个部分进行个性化的绘制,如背景、行、列、文本等。 5. 在对话框类的MeasureItem函数中,设置每一项的高度和宽度。 6. 在对话框类的PreSubclassWindow函数中,重写该函数,并调用List Control控件的SetExtendedStyle()函数,设置扩展风格,以便在自绘时进行绘制。 通过以上步骤,实现了MFC ListCtrl自绘的效果。 需要注意的是,在绘制自定义的List Control时,需要对List Control的相关消息进行响应,如LVM_DRAWITEM、LVM_MEASUREITEM等消息。在对应的消息响应函数中,调用自定义的绘制函数。 总之,MFC ListCtrl自绘是一种个性化的控件绘制方式,通过重写绘制函数,可以达到自定义外观的目的。它使我们可以对List Control控件进行更加灵活的个性化定制,以满足我们的设计需求。 ### 回答2: MFC ListCtrl自绘是指在使用MFC(Microsoft Foundation Class)框架下的ListCtrl控件时,通过自定义绘制的方式改变其外观。 ListCtrl是MFC中常用的列表控件,可以展示多行多列的数据。如果我们想要自定义ListCtrl的外观,例如改变其背景色、文本颜色、行高等,就需要进行自绘操作。 首先,我们需要派生一个自定义的ListCtrl控件类,例如CMFCListCtrl。通过重载父类的OnPaint函数,我们可以在绘制控件的时候对其进行修改。在OnPaint函数中,我们可以使用CDC(Device Context)对象来进行绘制操作。 具体的绘制方式可以根据需求来定。例如,如果我们想要改变ListCtrl的背景色,可以在OnPaint函数中使用CDC对象的FillSolidRect函数来填充指定的矩形区域。如果我们想要改变某一行或列的文本颜色,可以使用CDC对象的SetTextColor函数来设置文本颜色。如果我们想要改变行高,可以使用CDC对象的SetTextAlign函数来设置文本对齐方式。 在进行自绘操作时,我们需要注意防止内存泄漏。可以使用CDC对象的SaveDC和RestoreDC函数来保存和恢复绘制环境。此外,我们还可以通过调用CMFCListCtrl类中的相应函数来设置特定行或列的颜色、字体等属性。 总之,通过自绘的方式,我们可以对MFC ListCtrl控件的外观进行个性化的定制。这样可以使控件更符合实际需求,提升用户体验。需要注意的是,在进行自绘操作时,要确保代码的健壮性和可维护性,避免出现不必要的错误。 ### 回答3: MFC(Microsoft Foundation Classes)是微软公司提供的一套基于C++的编程框架,用于开发Windows应用程序。ListCtrl(列表控件)是MFC中的一种常用控件,用于显示和管理列表型数据。 MFC ListCtrl自绘是指通过修改ListCtrl的绘制行为,自定义列表项的外观和样式。在MFC中自绘ListCtrl主要涉及以下几个步骤: 1. 创建ListCtrl控件:在对话框或窗口中添加ListCtrl控件,并设置对应的属性,如显示方式、列数等。 2. 继承CListCtrl类:创建自定义类并继承CListCtrl,以便重载相关的绘制函数。 3. 重载绘制函数:在自定义的ListCtrl类中,根据需要重载绘制函数,如OnPaint、OnCustomDraw等。通过在绘制函数中修改绘制参数和代码逻辑,实现自定义绘制效果。 4. 修改绘制样式:根据自定义绘制的需求,可以使用相关的绘图函数绘制背景、文本、图标等。也可以调用SetItem或DrawItem接口来自定义列表项的样式。 5. 构建自定义项数据结构:为了便于管理自定义项的数据,可以构建一个自定义的数据结构,并使用ListCtrl的SetItemData接口为每个项设置关联的数据。 通过以上步骤,我们可以实现对ListCtrl自绘,以展现更加独特和个性化的列表项外观。需要注意的是,在自定义绘制过程中,要确保良好的代码结构和性能优化,避免不必要的计算和绘制操作,以提高程序的运行效率和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值