1

良い一日、

List_Control Report ビューを作成する目的は、データのリストを生成することであり、もちろんユーザーは必要なデータを選択できます。そして、私の問題は、表示された最初の項目が参照(または)読み取り専用であることです。つまり、ユーザーに選択させたくないということです。私はオンラインで検索しましたが、数か月のプログラミングのバックグラウンドを理解するのは本当に困難でした。以下の方法を使用して、データのリストを生成しました。

    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = cnt;
    lvItem.iSubItem = 0;
    lvItem.pszText = data1;
    nItem = m_List.InsertItem(&lvItem);
    m_List.SetItemText(nItem, 1, data2);
    m_List.SetItemText(nItem, 2, data3);
    m_List.SetItemText(nItem, 3, data4);
    m_List.SetItemText(nItem, 4, data5);
    m_List.SetExtendedStyle(m_List.GetExtendedStyle()
    |LVS_EX_FULLROWSELECT);

私の幼稚な考えでは、「lvitem.ROWSELECTLock = TRUE」のように追加できる機能があることを願っていますが、もちろんこのMFCはそれを提供していません。

*余談ですが、私のような初心者におすすめの MFC 本はありますか?

(前もって)ご返信に感謝いたします。

/ケビン

4

1 に答える 1

1

それを見つけた!

独自のクラスを派生させるか、CListView を使用する場合

選択を無効にするために必要な情報を収集できるスタックオーバーフローに関する別の質問が既にあります。 CListCtrl 選択オプションを無効にする方法

したがって、最初のアイテムだけで選択を「防止」するには、「if」に条件を追加して、「変更」アイテムが必要なものであるかどうかを確認する必要があります。この場合、最初のアイテムです(インデックスは0から始まります)

if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVNI_SELECTED) && pNMLV->iItem == 0)

独自のクラスを派生させずにダイアログ内で実行したい場合

  1. ダイアログ クラスで CListCtrl 変数を宣言します。
  2. メソッド宣言をダイアログに追加します

    afx_msg void OnItemchingList(NMHDR *pNMHDR, LRESULT *pResult);

  3. メッセージ マップにエントリを追加する BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_NOTIFY(LVN_ITEMCHANGING, IDC_LIST1, &CMyDialog::OnItemchangingList) END_MESSAGE_MAP()

  4. ダイアログの「.cpp」ファイルにメソッドを追加します (ClistView メソッドと同じです)。

    void CMyDialog::OnItemchangingList(NMHDR *pNMHDR, LRESULT *pResult) { // LVN_ITEMCHANGING notification handler LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);

    // is the user selecting an item?
    if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVNI_SELECTED) && pNMLV->iItem == 0)
    {       
        // yes - never allow a selected item
        *pResult = 1;
    }
    else
    {
        // no - allow any other change
        *pResult = 0;
    }
    

    }

于 2015-04-22T09:40:14.120 に答える