0

次のコードを使用して、2列のリストビューコントロールを作成しようとしています。

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);

2つの列を挿入します。これは正常に挿入されました。次に、TitleとApplicationName列の1行目にそれぞれ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);

しかし、これを使用して同じ行に複数のアイテムを挿入することはできません!どこが間違っていたの?その間、アイテムは挿入されません!

このコードを修正するのを手伝ってください。次に、リストビューコントロールの同じ行に複数のアイテムを挿入するにはどうすればよいですか。

4

1 に答える 1

0

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;
}
于 2012-11-30T23:15:39.870 に答える