我有一個項目列表,每個項目都與開始和結束時間和日期相關聯。我想要做的是,在給定時間和日期範圍的情況下,只顯示落在該窗口內的項目,甚至部分顯示。什麼是在MFC中制定計劃的最佳方式
我在做什麼是創建一個CListCtrl與其中的所有項目和CListCtrl按默認開始時間排序。但是考慮到時間範圍,我不知道如何搜索範圍內的第一個項目。
列表控件的另一個問題是它顯示爲一個列表,而如果有一個控件也可以顯示並行併發的東西,那將會很不錯。
我在對話框應用程序中這樣做。
我有一個項目列表,每個項目都與開始和結束時間和日期相關聯。我想要做的是,在給定時間和日期範圍的情況下,只顯示落在該窗口內的項目,甚至部分顯示。什麼是在MFC中制定計劃的最佳方式
我在做什麼是創建一個CListCtrl與其中的所有項目和CListCtrl按默認開始時間排序。但是考慮到時間範圍,我不知道如何搜索範圍內的第一個項目。
列表控件的另一個問題是它顯示爲一個列表,而如果有一個控件也可以顯示並行併發的東西,那將會很不錯。
我在對話框應用程序中這樣做。
你在問一些非常具體的功能。這聽起來像你要麼建立一個調度應用程序,要麼試圖顯示過去發生的事情的日誌。這被稱爲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()編寫自定義控件是相當容易的,只要你的重疊範圍代表每個匹配,就可以繪製矩形。
並行的事情將需要一個自定義控件。
用數據範圍內的東西填充列表是通過檢查哪些項目在你插入到列表框中的那一段時間內完成的。所以不要列出所有項目。這很明顯,我想我誤解了你的問題。