MFC:CListCtrl.EnableWindow(FALSE),但仍可滚动?

时间:2015-05-22 18:36:10

标签: mfc

我有一个CListCtrl列表框,我希望在完整功能之间切换,并且是只读的(即用户无法更改选择)。

成员函数CListCtrl.EnableWindow(FALSE)似乎是为此设计的,除非我打电话

m_listCtrl.EnableWindow(FALSE);
GetDlgItem( IDC_LIST_CTRL_EDIT )->EnableWindow(FALSE);

它上面的滚动条停止工作(假设我的内容多于CListCtrl中的内容)。

是否有一种优雅的方法来实现只读但仍然滚动的行为,除了覆盖鼠标处理程序,或重置每页刷新时的选择?

1 个答案:

答案 0 :(得分:1)

您可以通过从CListCtrl派生自己的类并处理LVN_ITEMCHANGING通知来实现此目的。请参阅下面的示例代码......

void MyClistCtrl::OnLvnItemchanging(NMHDR *pNMHDR, LRESULT *pResult)
    {
    *pResult = FALSE;

    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    // TODO: Add your control notification handler code here
    // If there is no selection allowed, prevent the item from changing 
    if ((pNMLV->uNewState & LVIS_SELECTED) /* check flag to if it should be read only ie check radiobutton state*/)
        {
        *pResult = TRUE;
        }

    }

上面的代码将无条件地阻止选择,同时仍允许滚动条起作用。控制此行为的能力可以添加到&#34; if&#34;声明(例如,检查绑在单选按钮上的标志)。