我有一个项目列表,每个项目都与开始和结束时间及日期相关。我想要做的是,在给定时间和日期范围的情况下,仅显示该窗口内的项目,甚至部分显示。
我正在做的是创建一个包含所有项目的CListCtrl,默认情况下,CListCtrl按开始时间排序。但是给定时间范围,我不知道如何搜索该范围内的第一项。
列表控件的另一个问题是它显示为列表,而如果有一个控件还可以同时显示并发的东西,那就太好了。
我正在对话框应用程序中执行此操作。
最佳答案
您需要一些非常特定的功能。听起来您正在构建调度应用程序或试图显示过去发生的事情的日志。这称为Gantt Chart。您可以在网上购买MFC的Gannt Chart控件。谷歌的一些。
您的问题不仅仅在于如何绘画。您不能也不应使用CListCtrl作为数据结构。您似乎有一组开始时间和结束时间的对象。例如:
struct Range {
int startTime;
int endTime;
};
std::vector<Range> events;
将事件放到这个简单的 vector 中后,您将不得不遍历所有元素并比较开始/结束时间,以查看它们是否与您正在考虑的范围重叠:
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()的自定义控件相当容易,只要覆盖代表每个匹配项的重叠范围,它就可以绘制矩形。
关于c++ - 在MFC中进行计划的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2616272/