You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MFC对话框C++程序中如何在_T包装器内使用格式化字符串变量?

解决MFC列表控件生成17个格式化服务名称的问题

核心修正点:

  • 先插入列再添加行:List Control需要先定义列结构,否则行内容无法正常显示
  • 循环内动态格式化字符串:将CString::Format放到循环内部,每次迭代更新服务名称
  • 正确使用列表项索引:用循环变量作为插入行的索引,避免覆盖已有条目

修正后的完整代码

// TODO: 在此添加额外初始化代码
#define MAX_VALUE 17

// 先插入列,必须在添加行之前执行
m_List.InsertColumn(0, _T("Názov služby"), LVCFMT_LEFT, 150);
m_List.InsertColumn(1, _T("Status"), LVCFMT_LEFT, 90);
m_List.InsertColumn(2, _T(""), LVCFMT_LEFT, 90);

CString strServiceName;
for (int numberOfService = 0; numberOfService < MAX_VALUE; numberOfService++)
{
    // 每次循环格式化服务名称,numberOfService从0开始,显示时+1让编号从1开始
    strServiceName.Format(_T("Sense Counter %d"), numberOfService + 1);
    
    // 直接传入CString对象,它会自动转换为LPCTSTR,无需额外_T包装
    int nIndex = m_List.InsertItem(numberOfService, strServiceName);
    
    // 示例:交替设置服务状态
    if (numberOfService % 2 == 0)
    {
        m_List.SetItemText(nIndex, 1, _T("Running"));
    }
    else
    {
        m_List.SetItemText(nIndex, 1, _T("Stopped"));
    }
    m_List.SetItemText(nIndex, 2, _T("✓"));
}

关键说明:

  • _T的使用场景:_T是用来包裹字符串字面量(比如_T("Sense Counter")),让代码兼容ANSI和Unicode字符集。而CString本身已经是适配字符集的类,格式化后的CString对象可以直接作为InsertItem的参数,不需要再用_T包裹。
  • 索引问题:原代码中InsertItem(0, ...)会每次都覆盖第0行,改用循环变量numberOfService作为索引,就能依次插入17行(索引0到16)。
  • 编号显示:如果希望服务编号从1开始(比如"Sense Counter 1"到"Sense Counter 17"),格式化时用numberOfService + 1即可。

内容的提问来源于stack exchange,提问作者JanČi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:06:23