MFC:CListCtrl.EnableWindow(FALSE),但仍可滚动? [复制]
Posted
技术标签:
【中文标题】MFC:CListCtrl.EnableWindow(FALSE),但仍可滚动? [复制]【英文标题】:MFC: CListCtrl.EnableWindow(FALSE), but still scrollable? [duplicate] 【发布时间】:2015-05-22 18:36:10 【问题描述】:我有一个 CListCtrl 列表框,我想在完整功能和只读(即用户无法更改选择)之间切换。
成员函数CListCtrl.EnableWindow(FALSE)
似乎是为此设计的,除了当我调用时
m_listCtrl.EnableWindow(FALSE);
GetDlgItem( IDC_LIST_CTRL_EDIT )->EnableWindow(FALSE);
它上面的滚动条停止工作(假设我的内容多于 CListCtrl 中的内容)。
除了覆盖鼠标处理程序或在每次页面刷新时重置选择之外,是否有一种优雅的方式来实现只读但仍滚动的行为?
【问题讨论】:
【参考方案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;
上面的代码将无条件地阻止选择,同时仍然允许滚动条起作用。可以将控制这种行为的能力添加到“if”语句中(例如,检查与单选按钮相关联的标志)。
【讨论】:
以上是关于MFC:CListCtrl.EnableWindow(FALSE),但仍可滚动? [复制]的主要内容,如果未能解决你的问题,请参考以下文章