Как лучше составить расписание в МФЦ? - PullRequest
3 голосов
/ 11 апреля 2010

У меня есть список элементов, каждый из которых связан с начальной и конечной датой и временем. Я хочу, чтобы с учетом диапазона времени и дат отображались только элементы, попадающие в это окно, даже частично.

То, что я делаю, - это создание CListCtrl со всеми элементами в нем, а CListCtrl по умолчанию сортируется по времени запуска. Но учитывая временной диапазон, я не знаю, как искать первый элемент, который находится в этом диапазоне.

Другая проблема, связанная с элементом управления списком, заключается в том, что он отображается в виде списка, хотя было бы неплохо, если бы был элемент управления, который также мог бы отображать параллельные элементы.

Я делаю это в диалоговом приложении.

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Вы запрашиваете какую-то очень специфическую функциональность. Похоже, вы либо создаете приложение для планирования, либо пытаетесь отобразить журнал событий, которые произошли в прошлом. Это называется Диаграмма Ганта . Вы можете купить элементы управления Gannt Chart для MFC в Интернете. Google для некоторых.

В твоем вопросе есть нечто большее, чем просто как его нарисовать; Вы не можете и не должны использовать 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 (), который просто рисует прямоугольники, пока ваш перекрывающийся диапазон представляет каждое совпадение.

0 голосов
/ 12 апреля 2010

Параллельные вещи будут требовать пользовательского элемента управления.

Заполнение списка элементами в диапазоне данных выполняется путем проверки того, какие элементы находятся в этом диапазоне в тот момент, когда вы вставляете их в список. Так что не делайте список со всеми предметами. Это настолько очевидно, что, я думаю, я неправильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...