【问题标题】:Failing to insert multiple items into single row of List view control无法将多个项目插入列表视图控件的单行
【发布时间】:2012-11-22 13:30:34
【问题描述】:

我正在尝试使用以下代码创建具有两列的 Listview 控件。

LV_COLUMN lvc = {0};
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 180;
lvc.pszText = _T("Title");
lvc.cchTextMax = _tcslen(lvc.pszText);
ListView_InsertColumn(hwndList, 0, &lvc);

lvc.pszText = _T("ApplicationName");
lvc.cchTextMax = _tcslen(lvc.pszText);
ListView_InsertColumn(hwndList, 1, &lvc);

插入两个列。这是成功插入的。 然后我想在第一行分别为 Title & ApplicationName 列添加 2 个项目。

我正在使用结构:

typedef struct{
   TCHAR m_title[512];
   TCHAR m_Application[512];
  }APPLICATION_LIST;

然后尝试在同一行中插入多个项目:

APPLICATION_LIST *pAppList = new APPLICATION_LIST;
    if(pAppList)
    {
        _tcscpy(pAppList->m_title,TEXT("My Mozilla"));
        _tcscpy(pAppList->m_Application,TEXT("FireFox"));

    }

            LVITEM lvi = {0};
            lvi.mask =  LVIF_PARAM | LVIF_TEXT;
        lvi.iItem = ListView_GetItemCount(hwndList);
            lvi.pszText = LPSTR_TEXTCALLBACK ;
            ListView_InsertItem(hwndList,&lvi);

但我无法使用这个将多个项目插入同一行!我哪里出错了?这样做时不会插入任何项目!

请帮我纠正这个代码?那么如何在列表视图控件的同一行中插入多个项目。

【问题讨论】:

    标签: listview user-interface win32gui


    【解决方案1】:

    您指定了LVIF_PARAM 标志,但没有分配lvi.lParam 字段。你需要添加它。那么,要正确使用LPSTR_TEXTCALLBACK,ListView的父窗口的消息过程需要处理LVN_GETDISPINFO通知。它将提供一个指向 LVITEM 结构的指针,该结构指定它希望您为其提供文本的列表项和列。您可以使用该项目的lParam 访问您的APPLICATION_LIST 指针并将相应的字符串复制到该项目的pszText 缓冲区中。

    例如:

    LV_COLUMN lvc = {0};
    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    lvc.fmt = LVCFMT_LEFT;
    lvc.cx = 180;
    lvc.pszText = TEXT("Title");
    lvc.cchTextMax = lstrlen(lvc.pszText);
    ListView_InsertColumn(hwndList, 0, &lvc);
    ...
    lvc.pszText = TEXT("ApplicationName");
    lvc.cchTextMax = lstrlen(lvc.pszText);
    ListView_InsertColumn(hwndList, 1, &lvc);
    

    .

    typedef struct
    {
       TCHAR m_title[512];
       TCHAR m_Application[512];
    } APPLICATION_INFO;
    
    APPLICATION_INFO *pAppInfo = new APPLICATION_INFO;
    lstrcpy(pAppInfo->m_title, TEXT("My Mozilla"));
    lstrcpy(pAppInfo->m_Application, TEXT("FireFox"));
    
    LVITEM lvi = {0};
    lvi.mask =  LVIF_PARAM | LVIF_TEXT;
    lvi.iItem = ListView_GetItemCount(hwndList);
    lvi.pszText = LPSTR_TEXTCALLBACK;
    lvi.lParam = reinterpret_cast<LPARAM>(pAppInfo);
    ListView_InsertItem(hwndList,&lvi);
    

    .

    case WM_NOTIFY:
    {
        NMDR *nmhdr = reinterpret_cast<NMHDR*>(msg.lParam);
        if ((nmhdr->hwndFrom == hwndList) && (nmhdr->code == LVN_GETDISPINFO))
        {
            NMLVDISPINFO pdi = reinterpret_cast<NMLVDISPINFO*>(msg.lParam);
    
            if (pdi->item.mask & LVIF_TEXT)
            {
                APPLICATION_INFO *pAppInfo = reinterpret_cast<APPLICATION_INFO*>(pdi->item.lParam);
    
                switch (pdi->item.iSubItem)
                {
                    case 0:
                        lstrcpyn(pdi->item.pszText, pAppInfo->m_Title, pdi->item->cchTextMax);
                        break;
    
                    case 1:
                        lstrcpyn(pdi->item.pszText, pAppInfo->m_Application, pdi->item->cchTextMax);
                        break;
                }
            }
        }
        else
        {
            ...
        }
        break;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多