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

MFC: CListCtrl.EnableWindow(FALSE), but still scrollable?

我有一个 CListCtrl 列表框,我想在完整功能和只读状态之间切换(即用户无法更改选择)。

成员函数CListCtrl.EnableWindow(FALSE)似乎是为此设计的,除了当我调用

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

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

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

您可以通过从 CListCtrl 派生您自己的 class 并处理 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;
        }

    }

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