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

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

这个可以试试参考
设置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;
     }
    }
    

这个组件本身是不支持自动换行的,如果要重载实现也很困难,因为很多数据的绘制和高度需要自己计算,即使做出来可能也不是很可靠,建议考虑用其他组件代替,比如GridControl

在MFC中,ListCtrl控件默认不支持自动换行显示。然而,你可以通过继承CListCtrl类并重写其绘制过程来实现这一功能。以下是一个示例代码,演示了如何在ListCtrl的某一列中实现文本自动换行显示:

  1. 创建一个自定义的ListCtrl类,例如CMyListCtrl,继承自CListCtrl。
class CMyListCtrl : public CListCtrl
{
public:
    CMyListCtrl() {}

protected:
    afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    DECLARE_MESSAGE_MAP()
};
  1. 在源文件中添加消息映射和自定义绘制函数的实现。
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnCustomDraw)
END_MESSAGE_MAP()

void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    *pResult = CDRF_DODEFAULT;

    if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
    {
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
    {
        int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec);
        int nSubItem = pLVCD->iSubItem;

        // 获取文本
        CString strText = GetItemText(nItem, nSubItem);

        // 获取列宽度
        CRect rect;
        GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
        int nColumnWidth = rect.Width();

        // 设置绘制的矩形区域
        rect.left += 2;
        rect.right = rect.left + nColumnWidth - 4;

        // 绘制文本
        CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
        pDC->DrawText(strText, rect, DT_WORDBREAK | DT_LEFT | DT_END_ELLIPSIS);

        *pResult = CDRF_SKIPDEFAULT;
    }
}
  1. 使用CMyListCtrl替代原来的CListCtrl控件,并调用SetExtendedStyle函数启用自定义绘制。
CMyListCtrl m_ListCtrl;
m_ListCtrl.Create(WS_VISIBLE | WS_CHILD | LVS_REPORT, CRect(10, 10, 400, 200), this, IDC_MY_LISTCTRL);

// 启用自定义绘制
m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT);

现在,当你在ListCtrl的某一列中插入文本时,如果文本超过列宽度,它将自动换行显示。注意,这只适用于单元格的绘制,如果用户

创建一个派生自 CListCtrl 的自定义控件类,并在这个类的 OnPaint() 函数中进行绘制
在 OnPaint() 函数中,获取列表控件的绘制 DC,并使用 CDC::ExtTextOut() 函数输出文本。
在调用 CDC::ExtTextOut() 函数前,设置 DT_WORDBREAK 标志, 这样你在试一下.

{
public:
    virtual void OnPaint()
    {
        CPaintDC dc(this);
        // 获取列表控件的绘制 DC
        CDC* pDC = &dc;
        // 设置字体
        CFont font;
        font.CreatePointFont(80, _T("微软雅黑"));
        pDC->SelectObject(&font);
        // 输出文本
        CString strText = _T("这是一段长长长长长长长长长长长长长长长长长的文本,需要自动换行");
        CRect rect;
        GetClientRect(&rect);
        rect.DeflateRect(5, 5);
        UINT uFormat = DT_LEFT | DT_TOP | DT_WORDBREAK;
        pDC->DrawText(strText, &rect, uFormat);
    }
};

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在 MFC 中,可以通过设置 List Control 的样式来实现列文本自动换行显示。具体步骤如下:

  1. 在资源编辑器中打开 List Control 的属性对话框,切换到 "Styles" 选项卡。

  2. 在 "Styles" 选项卡中勾选 "LVS_EX_LABELWRAP" 样式。

  3. 在代码中获取 List Control 对象,并设置相应列的格式。例如,如果需要设置第二列的文本自动换行,可以使用以下代码:

CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_LIST1);

// 设置第二列的格式,使文本自动换行
pListCtrl->SetExtendedStyle(pListCtrl->GetExtendedStyle() | LVS_EX_LABELWRAP);
pListCtrl->SetColumnFormat(1, LVCFMT_LEFT);

在上面的代码中,IDC_LIST1 是 List Control 的控件 ID,SetExtendedStyle 方法用于设置 List Control 的扩展样式,SetColumnFormat 方法用于设置指定列的显示格式。这里将第二列的格式设置为左对齐,并启用文本自动换行。

注意:使用 LVS_EX_LABELWRAP 样式后,如果某一行的文本较长,可能会导致行高度自适应,从而使行高度不一致。如果需要保持行高度一致,可以在 List Control 的属性对话框中设置 "Owner Draw" 样式,并在代码中通过重写 DrawItem 方法来自定义行的绘制。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

没问题,可以通过重载drawitem来实现,实现逻辑稍显复杂,需要考虑布局和重绘。

在MFC当中,ListCtrl默认是不支持自动换行的,但我们可以通过自定义ListCtrl控件来实现。关键在于重载ListCtrl的NM_CUSTOMDRAW消息处理函数,这个消息会在绘制表格子项时被触发。我们可以在处理这个消息时测量并截取单元格内容,以使其适应列宽并自动换行。

下面是一个示例代码:假设ListCtrl有两列,其中第二列支持自动换行。

// 自定义ListCtrl控件类
class CMyListCtrl : public CListCtrl
{
public:
    CMyListCtrl();
    virtual ~CMyListCtrl();

protected:
    afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);

    DECLARE_MESSAGE_MAP()
};

CMyListCtrl::CMyListCtrl()
{
}

CMyListCtrl::~CMyListCtrl()
{
}

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnCustomDraw)
END_MESSAGE_MAP()

void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    *pResult = CDRF_DODEFAULT;

    // 只对第二列应用自动换行
    if (pLVCD->iSubItem == 1)
    {
        *pResult = CDRF_NOTIFYITEMDRAW;

        if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT || pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT | CDDS_SUBITEM)
        {
            // 启用多行文本格式
            pLVCD->nmcd.uItemState = pLVCD->nmcd.uItemState | CDIS_MULTILINE;

            CString strItem = GetItemText(pLVCD->nmcd.dwItemSpec, 1);
            CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
            CRect rect = pLVCD->nmcd.rc;
            pDC->DrawText(strItem, &rect, DT_LEFT | DT_WORDBREAK | DT_EDITCONTROL | DT_CALCRECT | DT_NOPREFIX);

            // 溢出时修剪字符串并添加悬停提示
            if (rect.Height() > pLVCD->nmcd.rc.bottom - pLVCD->nmcd.rc.top)
            {
                CString strTooltip = strItem.Left(strItem.GetLength() - 3) + _T("...");
                SetToolTipText(pLVCD->nmcd.dwItemSpec, 1, strItem);
                strItem = strTooltip;
            }

            // 绘制文本
            pLVCD->clrTextBk = RGB(255, 255, 255);
            pLVCD->clrText = RGB(0, 0, 0);
            rect = pLVCD->nmcd.rc;
            pDC->DrawText(strItem, &rect, DT_LEFT | DT_WORDBREAK | DT_EDITCONTROL | DT_NOPREFIX);
            *pResult = CDRF_SKIPDEFAULT;
        }
    }
}

在MFC中,可以直接将控件从工具箱中拖动并放置在对话框或窗体上。接着,在相应的代码文件中添加上述CMyListCtrl类的实现。最后,在对话框初始化函数中使用以下方法之一来将控件与CMyListCtrl对象关联(假设控件ID为IDC_MY_LIST):

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_MY_LIST, m_listCtrl);
    // 将控件与CMyListCtrl对象关联
    m_listCtrl.SubclassDlgItem(IDC_MY_LIST, this);
    // 或者
    // m_listCtrl.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, CRect(0, 0, 0, 0), this, IDC_MY_LIST);
}

这样,当窗口调用 RedrawWindow 函数时即可看到自动换行的效果。

若要在MFC中ListCtrl的列超过该列的宽度时实现该列中文本的自动换行,可以对列表控件使用“LVS_EX_LABELWRAP”扩展样式。
若要将此样式添加到列表控件,可以在初始化或创建代码中使用以下代码:

//假设m_myListCtrl是你的CListCtrl对象
DWORD dwStyle = m_myListCtrl.GetExtendedStyle();
m_myListCtrl.SetExtendedStyle(dwStyle | LVS_EX_LABELWRAP);

启用此样式后,任何列中超过该列宽度的文本都将自动换行到下一行。此样式将影响列表控件中的所有列,如果只想在特定列中换行,需要调整代码以手动换行文本并自己插入换行符。

在MFC中,可以通过设置ListCtrl的风格(LVS_EX_LABELWRAP)来实现ListCtrl的某一列的文本可以自动换行显示。
1.在资源编辑器中打开ListCtrl的属性对话框(右键点击ListCtrl控件,选择Properties)。
2.选择Extended Styles选项卡,勾选“LabelWrap”,然后点击OK保存。
此时ListCtrl中该列的文本就可以自动换行显示了。
如果想要调整列的宽度以允许更多的文本换行显示,可以通过代码实现:
1.获取需要调整列的索引号,例如第2列:
int nColumn = 1; // 第2列索引号为1(从0开始)
2.计算列的宽度:
CRect rc;
m_ListCtrl.GetClientRect(&rc);
int nWidth = rc.Width() - m_ListCtrl.GetColumnWidth(0) - m_ListCtrl.GetColumnWidth(nColumn);
3.调整列的宽度:
m_ListCtrl.SetColumnWidth(nColumn, nWidth);
这样就可以通过改变列宽度来自适应显示文本了。

要实现在MFC中ListCtrl的某一列的文本超过该列宽度后能自动换行显示,可以按照以下步骤进行:

  1. 创建一个自定义的ListCtrl类,例如CMyListCtrl,继承自CListCtrl。
  2. 在CMyListCtrl类的头文件中添加一个成员变量m_nWrapCol,用于保存需要自动换行显示的列的索引。
  3. 在CMyListCtrl类的构造函数中初始化m_nWrapCol成员变量。
  4. 在CMyListCtrl类中覆盖OnCustomDraw()函数,该函数会在绘制ListCtrl时被调用。
  5. 在OnCustomDraw()函数中,判断当前需要绘制的列是否是需要自动换行显示的列,如果是,则获取该列的文本并进行自动换行处理。
  6. 在进行自动换行处理时,可以使用CRect类中的方法来获取当前单元格的坐标和大小,然后使用DrawText()函数来绘制多行文本。

下面是一个简单的示例代码:

class CMyListCtrl : public CListCtrl
{
public:
    CMyListCtrl();
    virtual ~CMyListCtrl();
 protected:
    int m_nWrapCol; // 需要自动换行显示的列的索引
     afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    DECLARE_MESSAGE_MAP()
};
 CMyListCtrl::CMyListCtrl()
{
    m_nWrapCol = 1; // 默认第二列需要自动换行显示
}
 CMyListCtrl::~CMyListCtrl()
{
}
 BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnCustomDraw)
END_MESSAGE_MAP()
 void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLVCUSTOMDRAW lpCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
     switch (lpCustomDraw->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
        *pResult = CDRF_NOTIFYITEMDRAW;
        break;
     case CDDS_ITEMPREPAINT:
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
        break;
     case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
        {
            int nItem = lpCustomDraw->nmcd.dwItemSpec;
            int nSubItem = lpCustomDraw->iSubItem;
             if (nSubItem == m_nWrapCol)
            {
                CString strText = GetItemText(nItem, nSubItem);
                CRect rcItem;
                GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rcItem);
                 CDC* pDC = CDC::FromHandle(lpCustomDraw->nmcd.hdc);
                CFont* pOldFont = pDC->SelectObject(GetFont());
                 int nLineHeight = pDC->GetTextExtent(_T(" "), 1).cy;
                int nMaxWidth = rcItem.Width() - 4; // 减去一些边距
                 int nStart = 0;
                CString strLine;
                int nLineCount = 0;
                 while (nStart < strText.GetLength())
                {
                    int nEnd = strText.Find(_T('\n'), nStart);
                     if (nEnd == -1)
                        nEnd = strText.GetLength();
                     strLine = strText.Mid(nStart, nEnd - nStart);
                     if (pDC->GetTextExtent(strLine).cx <= nMaxWidth)
                    {
                        pDC->TextOut(rcItem.left + 2, rcItem.top + nLineCount * nLineHeight, strLine);
                        nLineCount++;
                    }
                    else
                    {
                        int nLastSpace = strLine.ReverseFind(_T(' '));
                         if (nLastSpace == -1)
                            nLastSpace = strLine.GetLength() - 1;
                         strLine = strLine.Left(nLastSpace);
                         pDC->TextOut(rcItem.left + 2, rcItem.top + nLineCount * nLineHeight, strLine);
                        nLineCount++;
                         nStart += nLastSpace + 1;
                    }
                }
                 pDC->SelectObject(pOldFont);
                *pResult = CDRF_SKIPDEFAULT;
            }
            else
            {
                *pResult = CDRF_DODEFAULT;
            }
        }
        break;
     default:
        *pResult = CDRF_DODEFAULT;
        break;
    }
}


在上面的示例代码中,我们重写了CMyListCtrl类的OnCustomDraw()函数,该函数会在绘制ListCtrl时被调用。在该函数中,我们判断当前需要绘制的列是否是需要自动换行显示的列,如果是,则获取该列的文本并进行自动换行处理。在进行自动换行处理时,我们使用CRect类中的方法来获取当前单元格的坐标和大小,然后使用DrawText()函数来绘制多行文本。

给你找到一个合适的解决方法:https://zhuanlan.zhihu.com/p/635042020

https://download.csdn.net/download/frank90_z/12356160
直接购买也不贵

可以通过LVN_GETDISPINFO消息来实现在MFC中ListCtrl的某一列的文本超过该列宽度后能自动换行显示。具体步骤如下:

在List Control的风格中加入LVS_EX_LABELTIP,确保它能够显示全部的文本。

响应LVN_GETDISPINFO消息,在该消息中处理需要自动换行的列的文本。

在LVN_GETDISPINFO消息处理函数中使用DrawText()函数绘制多行文本,并将最终结果存储在pDispInfo->item.pszText指针中。

以下是示例代码:

void CMyListCtrl::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    LV_ITEM& lvItem = pDispInfo->item;

    if ((lvItem.mask & LVIF_TEXT) && (lvItem.iSubItem == 0))
    {
        CString strText = GetItemText(lvItem.iItem, lvItem.iSubItem);
        if (!strText.IsEmpty())
        {
            // 设置字体
            CDC* pDC = GetDC();
            CFont* pOldFont = pDC->SelectObject(GetFont());

            // 获取文本区域大小
            CRect rcText(0, 0, 0, 0);
            pDC->DrawText(strText, &rcText, DT_CALCRECT | DT_WORDBREAK | DT_NOPREFIX);

            int nWidth = GetColumnWidth(lvItem.iSubItem);
            if (rcText.Width() > nWidth)
            {
                // 文本超过列宽度,进行换行处理
                CString strNewText;
                int nStart = 0, nEnd = 0;
                while ((nEnd = strText.Find(_T(' '), nStart)) != -1)
                {
                    CString strLine = strText.Mid(nStart, nEnd - nStart);
                    CRect rcLine(0, 0, 0, 0);
                    pDC->DrawText(strLine, &rcLine, DT_CALCRECT | DT_SINGLELINE | DT_NOPREFIX);

                    if (rcLine.Width() + rcText.left > nWidth)
                    {
                        strNewText += _T("\r\n");
                        rcText.bottom += rcText.Height();
                        rcText.right = max(rcText.right, rcLine.Width());
                    }

                    strNewText += strLine;
                    strNewText += _T(' ');
                    nStart = nEnd + 1;
                }
                strNewText += strText.Mid(nStart);
                lvItem.pszText = _tcsdup(strNewText);
            }
            else
            {
                lvItem.pszText = _tcsdup(strText);
            }

            // 恢复字体
            pDC->SelectObject(pOldFont);
            ReleaseDC(pDC);
        }
    }

    *pResult = 0;
}

在上述代码中,我们首先获取需要显示的文本内容,并计算出其需要占用的区域大小。然后,如果该区域的宽度超过了列的宽度,就进行自动换行处理,使用DrawText()函数绘制多行文本,并将最终结果存储在pDispInfo->item.pszText指针中。最后,需要使用_tcsdup()函数将结果复制到pszText中,并在函数结束前释放该指针的内存空间。

11

基于ChatGPT4与博主叶秋学长的回答,望采纳!!!有其他问题也可以询问我哦💕:
在Microsoft Foundation Classes (MFC)中,CListCtrl 是用于显示列表数据的类。然而,CListCtrl 不直接支持单元格内容的自动换行。它的设计主要是以行为单位来展示数据的,所以在一行的某一列上进行换行并不是它的本意。

但是,如果你的需求确实需要在一个CListCtrl的单元格内进行自动换行,你可以通过一些额外的方法来实现。

一种可能的方法是使用自定义的单元格渲染。这可能会涉及到CListCtrl的自定义子类,并重写DrawItem方法。在这个方法中,你可以使用CDC::DrawText方法来渲染文本,这个方法支持自动换行。

以下是一种可能的方法:

void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);

    // 获取单元格的文本
    CString strText = GetItemText(lpDrawItemStruct->itemID, lpDrawItemStruct->itemAction);

    // 设置文本的绘制区域
    CRect rcItem(lpDrawItemStruct->rcItem);

    // 使用 DrawText 绘制文本,其中 DT_WORDBREAK 选项可以实现文本的自动换行
    dc.DrawText(strText, &rcItem, DT_WORDBREAK);

    dc.Detach();
}

注意这只是一个基本的例子,你可能需要根据你的具体需求对其进行调整,例如处理不同列的不同绘制方式,处理选中状态等。

另外一种可能的方法是不使用CListCtrl,而是使用支持单元格内容自动换行的控件,比如CRichEditCtrl。但是这将需要更大的改动,并可能不适合所有的情况。

请注意,以上都是对于标准MFC的做法,如果你使用的是比如MFC Feature Pack或其他的扩展库,可能有更好的支持单元格内容自动换行的方法。

要实现在MFC中的ListCtrl的某一列的文本超过列宽度后自动换行显示,您可以按照以下步骤进行操作:

  1. 确定要自动换行的列的索引。假设要处理的列索引为nColumnIndex
  2. 在ListCtrl的创建过程中,启用扩展风格(Extended Style)LVS_EX_LABELTIP,它可以支持自动换行。
    m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle() | LVS_EX_LABELTIP);
     
  3. 在绘制ListCtrl的子项文本时,处理自动换行的逻辑。您可以通过子类化ListCtrl,并重写OnCustomDraw函数来实现。
    void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
     {
         NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
     
         if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
         {
             *pResult = CDRF_NOTIFYITEMDRAW;
         }
         else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
         {
             *pResult = CDRF_NOTIFYSUBITEMDRAW;
         }
         else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
         {
             int nColumnIndex = pLVCD->iSubItem;
     
             if (nColumnIndex == YOUR_COLUMN_INDEX)
             {
                 pLVCD->nmcd.uItemState |= CDIS_SHOWUNDERLINE;
                 pLVCD->nmcd.uItemState |= CDIS_SHOWUNDERLINEALWAYS;
                 pLVCD->nmcd.uItemState &= ~CDIS_HOT;
             }
     
             *pResult = CDRF_DODEFAULT;
         }
     }
     
    在上述代码中,将YOUR_COLUMN_INDEX替换为要自动换行的列的索引。然后,通过设置CDIS_SHOWUNDERLINECDIS_SHOWUNDERLINEALWAYS标志,将下划线显示样式应用于该列。

通过以上步骤,您应该能够在MFC中的ListCtrl的特定列中实现文本超过列宽度后自动换行显示。