jxtvaudioer 2023-06-06 09:18 采纳率: 50%
浏览 273
已结题

MFC中如何对ListCtrl的某一列的文本能换行显示

如何实现在MFC中ListCtrl的某一列的文本超过该列宽度后能自动换行显示

  • 写回答

15条回答 默认 最新

  • Minuw 2023-06-06 09:25
    关注

    这个可以试试参考
    设置ListCtrl的扩展风格

    1. 点击ListCtrl的属性窗口,选择"Styles"选项卡,勾选"Full Row Select"和"Gridlines"选项。

    2. 在代码中使用ListCtrl的SetExtendedStyle函数来设置扩展风格。例如,如果要让第2列中文本自动换行显示,可以参考下面代码:

      m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle() | LVS_EX_WRAPTEXT);
      m_ListCtrl.SetColumnWidth(1, LVSCW_AUTOSIZE_USEHEADER);
      

      LVS_EX_WRAPTEXT表示启用文本自动换行的功能,LVSCW_AUTOSIZE_USEHEADER表示根据列标题和文本内容自动调整列宽度。

    3. 在ListCtrl的OnCustomDraw函数中处理自动换行显示。代码参考如下:

      void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
      {
       LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
       *pResult = CDRF_DODEFAULT;
      
       switch (lpLVCustomDraw->nmcd.dwDrawStage)
       {
       case CDDS_PREPAINT:
           *pResult = CDRF_NOTIFYITEMDRAW;
           break;
      
       case CDDS_ITEMPREPAINT:
           *pResult = CDRF_NOTIFYSUBITEMDRAW;
           break;
      
       case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
           {
               int nItem = lpLVCustomDraw->nmcd.dwItemSpec;
               int nSubItem = lpLVCustomDraw->iSubItem;
               CString strText = GetItemText(nItem, nSubItem);
               CDC* pDC = CDC::FromHandle(lpLVCustomDraw->nmcd.hdc);
               CRect rect(lpLVCustomDraw->nmcd.rc);
               rect.DeflateRect(2, 2);
      
               UINT nFormat = DT_LEFT | DT_VCENTER | DT_WORDBREAK | DT_END_ELLIPSIS;
               pDC->DrawText(strText, &rect, nFormat);
      
               *pResult = CDRF_SKIPDEFAULT;
           }
           break;
       }
      }
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月6日