我有一个项目列表,每个项目都与开始和结束时间和日期相关联。我想要做的是,给定一个时间和日期范围,只显示该窗口内的项目,甚至部分显示。
我正在做的是创建一个包含其中所有项目的CListCtrl,并且默认情况下CListCtrl按开始时间排序。但是考虑到时间范围,我不知道如何搜索范围内的第一个项目。
列表控件的另一个问题是它显示为一个列表,如果有一个控件也可以显示并发的内容,那就太好了。
我在对话框应用程序中执行此操作。
答案 0 :(得分:2)
您需要一些非常具体的功能。听起来你要么正在构建一个调度应用程序,要么正在尝试显示过去发生的事情的日志。这称为Gantt Chart。您可以在网上购买MFC的Gannt Chart控件。一些谷歌。
你的问题不仅仅是如何描绘它;您不能也不应该使用CListCtrl作为数据结构。你似乎有一系列的对象是开始&结束时间。例如:
struct Range {
int startTime;
int endTime;
};
std::vector<Range> events;
将事件放入此简单向量后,您必须遍历所有元素并比较开始/结束时间,以查看它们是否与您正在考虑的范围重叠:
typedef std::vector<Range> RangeVec;
typedef RangeVec::iterator RangeIter;
void is_between(int time, const Range& r)
{
return time >= r.start && time <= r.end;
}
void findRanges(RangeVec *matches, const RangeVec& input, const Range& query)
{
for (RangeIter it = input.begin(); it != input.end(); ++it) {
if (is_between(it.start, query) || is_between(it.end, query) ||
(it.start <= query.start && it.end >= query.end))
{
matches->push_back(*it);
}
}
您现在可以遍历您的匹配并根据需要显示它们。如果你很勇敢,用一个子类化的CWnd :: OnPaint()来编写一个自定义控件是相当容易的,只要你的重叠范围代表每个匹配,它就会绘制矩形。
答案 1 :(得分:0)
并行的事情需要一个自定义控件。
使用数据范围内的内容填充列表是通过在将它们插入列表框时检查哪个项目在该范围内来完成的。所以不要列出所有项目。这很明显,我想我误解了你的问题。