我有一个项目列表,每个项目都与开始和结束时间和日期相关联。我想要做的是,给定时间和日期范围,仅显示该窗口内的项目,甚至部分显示。
我正在做的是创建一个包含所有项目的 CListCtrl,并且 CListCtrl 默认按开始时间排序。但是给定一个时间范围,我不知道如何搜索该范围内的第一个项目。
列表控件的另一个问题是它显示为列表,而如果有一个控件也可以并排显示并发的内容,那就太好了。
我在对话应用程序中执行此操作。
您要求一些非常具体的功能。听起来您要么正在构建日程安排应用程序,要么正在尝试显示过去发生的事情的日志。这称为甘特图。您可以在 Web 上购买 MFC 的甘特图控件。谷歌一些。
您的问题不仅仅是如何绘制它;您不能也不应该使用 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() 的自定义控件相当容易,只要你的重叠范围代表每个匹配项,它就会绘制矩形。
并行的事情需要自定义控件。
用数据范围内的事物填充列表是通过在将它们插入列表框时检查哪些项目在该范围内来完成的。所以不要列出所有项目。这很明显,我想我误解了你的问题。