CFilterHeaderCtrl 和 CFilterListCtrl - 让用户有机会过滤您提供给他们的数据!






4.79/5 (21投票s)
一个自绘标题控件和一个使用它的 CListControl。
引言
CListCtrl
是我首选的控件。大多数时候,我以“报告”模式使用它,因为它是一种美观的方式来显示用户可以轻松滚动、排序和查看的“数据行”。但通常我需要一种让用户选择对他有意义的数据的方式。 你会发现 MSDN 上有一个不错的 HDS_FILTERBAR
... 但在我需要它的时候它还没有出现! 所以,这里是 CFilterHeaderCtrl
,你可以单独使用它,也可以在 CFilterListCtrl
中使用。
CFilterHeaderCtrl
这个控件是从 CHeaderCtrl
派生的,并且是所有者绘制的。 你可以在这里看到从控件发送到父窗口的通知消息
#define FLCN_FILTERCHANGING 101 #define FLCN_FILTERCHANGED 102 #define FLCN_SHOWINGEDIT 103 #define FLCN_BEGINFILTEREDIT 104 #define FLCN_ENDFILTEREDIT 105
FLCN_FILTERCHANGING
和 FLCN_FILTERCHANGED
在用户更改过滤器之前和之后调用。 你可以在这里阻止过滤器更改。 消息处理程序将接收以下 结构体
struct NMFILTERHDR : public NMHDR { char* szText; // read only!!! };
FLCN_SHOWINGEDIT
在即将显示编辑控件时调用。
FLCN_BEGINFILTEREDIT
和 FLCN_ENDFILTEREDIT
在用户开始编辑一个或多个过滤器时调用,并使用 TAB 键在它们之间移动。 在示例代码中,你可以看到如何跟踪有多少过滤器已被更改,并在那一刻重新加载列表,而无需为每个 filterchange
事件重新加载。
对于你添加的每一列,你可以选择以下样式之一
#define FILTER_NONE 0 #define FILTER_ENABLED 1 #define FILTER_DISABLED 2
CFilterListCtrl
与其使用 cFilterHeaderCtrl
,你可能会发现用 CFilterListCtrl
替换你的 CListCtrl
更有用。 CFilterListCtrl
将用 CFilterHeaderCtrl
替换标准的标题控件,并将通知消息转发到父窗口。
结论
我相信你在示例代码中找到更多问题的答案。 在示例项目中,你必须添加自己的代码来重新加载列表!
非常感谢 CodeProject 和 CodeGuru 社区提供的关于所有者绘制和自定义控件实现的大量文章。 玩得开心!