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

  • 相关阅读:
    win32 tcp文件传输客户端
    Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析
    和菜鸟一起深入学习国嵌实验之vim常用命令
    和菜鸟一起深入学习国嵌实验之linux常用命令
    和菜鸟一起深入学习国嵌实验之文件编程
    和菜鸟一起深入学习国嵌实验之gcc分步编译&&gdb调试
    和菜鸟一起深入学习国嵌实验之简单Makefile
    获得创建表脚本
    oralce中获得创建脚本
    所有数据库连接字符串
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4623100.html
Copyright © 2011-2022 走看看