3

それぞれ開始時刻と終了時刻と日付に関連付けられているアイテムのリストがあります。私がやりたいのは、時間と日付の範囲を指定して、そのウィンドウ内にあるアイテムのみを部分的にでも表示することです。

私がやっていることは、すべてのアイテムを含む CListCtrl を作成することであり、CListCtrl はデフォルトで開始時間によってソートされます。しかし、時間範囲が与えられた場合、その範囲内にある最初のアイテムを検索する方法がわかりません。

リスト コントロールのもう 1 つの問題は、それがリストとして表示されることです。一方、並行しているものを並べて表示できるコントロールがあればいいのですが。

ダイアログアプリケーション内でこれを行っています。

4

2 に答える 2

2

非常に具体的な機能を求めています。スケジューリング アプリを作成しているか、過去に起こったことのログを表示しようとしているようです。これをガント チャートと呼びます。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() を使用してカスタム コントロールを作成するのはかなり簡単です。これは、オーバーラップした範囲が各一致を表す限り、長方形を描画するだけです。

于 2010-05-14T03:02:51.217 に答える
0

並行処理を行うには、カスタム コントロールが必要になります。

データ範囲内のものでリストを埋めるには、リスト ボックスに項目を挿入した時点でその範囲内にある項目を確認します。したがって、すべての項目を含むリストを作成しないでください。これは非常に明白なので、あなたの質問を誤解していると思います。

于 2010-04-12T12:54:56.743 に答える