修改List Control的行高

 

解决方案:

1. 设置List Control的属性 Owen Draw Fixed.

2. 自定义CMyListCtrl, 继承于CListCtrl,并重载CListCtrl::DrawItem.
必须重载DrawItem函数,而不能自己处理WM_DRAWITEM,否则MFC处理时运行到CListCtrl::DrawItem会抱错。( 此函数的内容只有一条语句: ASSERT(FALSE),所以,坚决不能运行^_^)

3. 为List Control所在的对话框添加对WM_MEASUREITEM消息的处理OnMeasureItem。在响应过程中修改结构中的itemHeight参数。

注意: 不能简单地在CMyListCtrl中响应WM_MEASUREITEM消息,原因很简单,它根本收不到此消息。如果要更好的实现,可以提供一个CMyListCtrl::MeasureItem的函数,在对话框的消息OnMeasureItem中,调用此方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
  TCHAR  lpBuffer[256];   
  
  LV_ITEM lvi;   
  
  lvi.mask = LVIF_TEXT | LVIF_PARAM ;
  lvi.iItem = lpDrawItemStruct->itemID ;
  lvi.iSubItem = 0;
  lvi.pszText = lpBuffer ;
  lvi.cchTextMax = sizeof (lpBuffer);
  VERIFY(GetItem(&lvi));   
  
  LV_COLUMN lvc, lvcprev ;
  ::ZeroMemory(&lvc, sizeof (lvc));
  ::ZeroMemory(&lvcprev, sizeof (lvcprev));
  lvc.mask = LVCF_WIDTH | LVCF_FMT;
  lvcprev.mask = LVCF_WIDTH | LVCF_FMT;   
  
  for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
  {
   if ( nCol > 0 )
   {
    // Get Previous Column Width in order to move the next display item
    GetColumn(nCol-1, &lvcprev) ;
    lpDrawItemStruct->rcItem.left += lvcprev.cx ;
    lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left ;
   }   
  
   // Get the text
   ::ZeroMemory(&lvi, sizeof (lvi));
   lvi.iItem = lpDrawItemStruct->itemID;
   lvi.mask = LVIF_TEXT | LVIF_PARAM;
   lvi.iSubItem = nCol;
   lvi.pszText = lpBuffer;
   lvi.cchTextMax = sizeof (lpBuffer);
   VERIFY(GetItem(&lvi));   
  
   CDC* pDC;
   pDC = CDC::FromHandle(lpDrawItemStruct->hDC);   
  
   if ( lpDrawItemStruct->itemState & ODS_SelectED )
   {
    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_HIGHLIGHT)) ;
    pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;
   }
   else
   {
    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_WINDOW)) ;
    pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT)) ;
   }   
  
   pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));   
  
   UINT  uFormat    = DT_LEFT ;   
  
   ::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen (lpBuffer),
     &lpDrawItemStruct->rcItem, uFormat) ;   
  
   pDC->SelectStockObject(SYSTEM_FONT) ;
  }
}

以上代码来自codeproject: http://www.codeproject.com/listctrl/changerowheight.asp

其上有一种解决方案如下,第1,2步相同,最后则如下处理:

3. 在CMyListCtrl的MESSAGE_MAP中手动添加如下宏: ON_WM_MEASUREITEM_REFLECT()

4. 重载CMyListCtrl::MeasureItem函数。同样要注意,并不是给CMyListCtrl添加消息处理函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值