zoukankan      html  css  js  c++  java
  • CListCtrl行高问题最终解决方法

    原文链接: http://blog.csdn.net/benny5609/article/details/1967078

    解决方案:

       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中,调用此方法。

    以下DrawItem实现片断:

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

    备注: 此方法同样适用于Combo Box, List Control, Menu

  • 相关阅读:
    格式刷的一小步,原型工具的一大步
    精益设计,敏捷开发,一个都不能少
    慢工出细活,Facebook点赞按钮设计中的门道
    5个范例告诉你什么是自适应网页设计
    用户体验设计5大目标
    poj1251Jungle Roads(最小生成树)
    hdu2222Keywords Search
    hdu2328Corporate Identity
    hdu1238Substrings
    hdu4763Theme Section
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4623100.html
Copyright © 2011-2022 走看看