我有一个项目列表,每个项目都与开始和结束时间及日期相关。我想要做的是,在给定时间和日期范围的情况下,仅显示该窗口内的项目,甚至部分显示。

我正在做的是创建一个包含所有项目的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/

10-11 23:51