1

Visual Studio 2013 (C++) に項目のリスト (レポート ビュー) を含む MFC リスト コントロールがあります。

   LVCOLUMN lvColumn;

        lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
        lvColumn.fmt = LVCFMT_LEFT;
        lvColumn.cx = 120;
        lvColumn.pszText = "Full Name";
        ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(0, &lvColumn);

        lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
        lvColumn.fmt = LVCFMT_LEFT;
        lvColumn.cx = 75;
        lvColumn.pszText = "Profession";
        ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(1, &lvColumn);

        lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
        lvColumn.fmt = LVCFMT_LEFT;
        lvColumn.cx = 80;
        lvColumn.pszText = "Fav Sport";
        ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(2, &lvColumn);

        lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
        lvColumn.fmt = LVCFMT_LEFT;
        lvColumn.cx = 75;
        lvColumn.pszText = "Hobby";
        ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(3, &lvColumn);

        LVITEM lvItem;
        int nItem;

        lvItem.mask = LVIF_TEXT;
        lvItem.iItem = 0;
        lvItem.iSubItem = 0;
        lvItem.pszText = "Sandra C. Anschwitz";
        nItem = ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(&lvItem);

        ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 1, "Singer");
        ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 2, "HandBall");
        ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 3, "Beach");

フルネーム、職業、スポーツ、趣味の複数項目を作成するにはどうすればよいですか?

4

1 に答える 1

2

驚くべきことに、これはデフォルトの CListCtrl では不可能です。しかし、ちょっとしたカスタム コーディング (およびいくつかのトリック) を使用すると、必要な効果を得ることができます。

まず、CListCtrl から独自のクラスを派生させ、コントロール スタイルのオーナー描画ビット ( Owner Draw Fixed = true ) を設定する必要があります。親のダイアログ クラスで、イメージ リストを作成します (これがトリッキーです)。画像リストは、リスト コントロールの各行の高さを指定するために使用されます。以下の例では、次を使用しました。

m_imagelist.Create(48, 48, ILC_COLOR4, 10, 10);
m_listctrl.SetImageList(&m_imagelist, LVSIL_SMALL);

必要に応じて、イメージ リストのcx値とcy値をいじる必要があります。コントロールは、アイコンを表示することを想定しているため、イメージ リストを使用して各行のサイズを調整します。次に、次のような DrawItem のハンドラーを追加します。

void MyClistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

    CString text = _T("Now is the time \nfor all good men\nto come to the aid");
    pDC->DrawText(text , &lpDrawItemStruct->rcItem, DT_TOP);
    // TODO:  Add your code to draw the specified item
    }

私の例では、これにより…</p>

ここに画像の説明を入力

エレガントなソリューションではないかもしれませんが、機能します。注: このアプローチでは、すべての行が同じ高さになります。

EDIT : 行テキストを取得する方法はいくつかあります。最も簡単なのは、次のように GetItemText を使用することです。

CString txt = GetItemText(lpDrawItemStruct->itemID, 0);
pDC->DrawText(txt, &lpDrawItemStruct->rcItem, DT_TOP);

上記は、テキストを設定する CListCtrl メソッドのいずれかを使用して各行のテキストを設定することを前提としています。

于 2015-06-10T16:01:43.930 に答える