如何禁用CListCtrl的选择选项

4

我不知道如何禁用 CListCtrl 的选择选项。我想要覆盖 CListCtrl 类的方法或处理任何窗口命令?谢谢。


CListCtrl 是一个用于管理 Windows 公共控件 ListView 控件的类。像所有的 Windows 公共控件一样,您可能需要提供一个通知处理程序来执行您想要(或不想要)完成的任何操作或不操作。可以获取一本关于 MFC 的书籍或尝试这个链接 - WhozCraig
1个回答

8
如果您想阻止用户在 CListCtrl 中选择一个项目,您需要从 CListCtrl 派生出自己的类,并为 LVN_ITEMCHANGING 通知添加消息处理程序。

例如,一个名为 CMyListCtrl 的示例类将具有一个头文件:

MyListCtrl.h

#pragma once

class CMyListCtrl : public CListCtrl
{
    DECLARE_DYNAMIC(CMyListCtrl)

protected:
    DECLARE_MESSAGE_MAP()

public:
    // LVN_ITEMCHANGING notification handler
    afx_msg void OnLvnItemchanging(NMHDR *pNMHDR, LRESULT *pResult);
};

然后是MyListCtrl.cpp:

#include "MyListCtrl.h"

IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(LVN_ITEMCHANGING, &CMyListCtrl::OnLvnItemchanging)
END_MESSAGE_MAP()

void CMyListCtrl::OnLvnItemchanging(NMHDR *pNMHDR, LRESULT *pResult)
{
    // LVN_ITEMCHANGING notification handler
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

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

所以,例如,您可以将普通的CListCtrl添加到对话框中,然后为其创建一个成员变量(默认情况下它将是CListCtrl),然后编辑对话框的头文件以#include "MyListCtrl.h并将列表控件成员变量从CListCtrl更改为CMyListCtrl


我试过了,但现在它是无效的。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接