65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2003年5月12日

CPOL

2分钟阅读

viewsIcon

107351

downloadIcon

1733

一个自绘标题控件和一个使用它的 CListControl。

Sample Image - FilterHeaderCtrl.jpg

引言

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_FILTERCHANGINGFLCN_FILTERCHANGED 在用户更改过滤器之前和之后调用。 你可以在这里阻止过滤器更改。 消息处理程序将接收以下 结构体

struct NMFILTERHDR : public NMHDR
{
    char* szText; // read only!!!
};

FLCN_SHOWINGEDIT 在即将显示编辑控件时调用。

FLCN_BEGINFILTEREDITFLCN_ENDFILTEREDIT 在用户开始编辑一个或多个过滤器时调用,并使用 TAB 键在它们之间移动。 在示例代码中,你可以看到如何跟踪有多少过滤器已被更改,并在那一刻重新加载列表,而无需为每个 filterchange 事件重新加载。

对于你添加的每一列,你可以选择以下样式之一

#define FILTER_NONE                0
#define FILTER_ENABLED             1
#define FILTER_DISABLED            2

CFilterListCtrl

与其使用 cFilterHeaderCtrl,你可能会发现用 CFilterListCtrl 替换你的 CListCtrl 更有用。 CFilterListCtrl 将用 CFilterHeaderCtrl 替换标准的标题控件,并将通知消息转发到父窗口。

结论

我相信你在示例代码中找到更多问题的答案。 在示例项目中,你必须添加自己的代码来重新加载列表!

非常感谢 CodeProject 和 CodeGuru 社区提供的关于所有者绘制和自定义控件实现的大量文章。 玩得开心!

© . All rights reserved.