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 OnItemsharingList(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 回答