修改List Control的行高

来源:互联网 发布:淘宝出售假冒商品 编辑:程序博客网 时间:2024/06/03 18:29
 

解决方案:

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添加消息处理函数。

原创粉丝点击