Click here to Skip to main content
14,600,878 members

A Time-line control using WTL

Rate this:
4.56 (17 votes)
Please Sign up or sign in to vote.
4.56 (17 votes)
23 May 2003
An alternative approach to selecting date ranges.

Screen shot

Introduction

CTimeLineCtrl provides an alternative way of selecting a regularly recurring date range.

Features

  • one-click date range selection at different granularities (eg week, month, year)
  • display today's date highlighted
  • year digits kept in view
  • display n 'date-range bands' in whatever ordering is required
  • scroll limits can be set

Using CTimeLineCtrl in a WTL Application

This control was developed using VS.NET, WTL 7, and the Feb 2003 Platform SDK. It has been tested under WindowsXP only.

To use CTimeLineCtrl in your application:

  1. Copy the following files to your application directory:
    • atlgdix.h (it's included in the zip files, but you can also download it here)
    • TimeLineScroll.h
    • TimeLineCtrl.cpp
    • TimeLineCtrl.h
    • TimeLineBand.cpp
    • TimeLineBand.h

    If you want to use the Year, Month, or Week bands, also add the following files:
    • TimeLineBandImpl.cpp
    • TimeLineBandImpl.h
       
  2. Add these files to your project.
  3. If you're not already using them, add <atlcomtime.h> and <atltypes.h> to your <stdafx.h> file.
  4. Insert #include <span class="code-string">"TimeLineCtrl.h"</span> prior to the definition of the parent window class.
  5. Add a new member variable to the parent window class. The class will be CTimeLineCtrl - give it any name you desire.
  6. Add code at an appropriate place (eg OnCreate or OnInitDialog) to create the control window.
Here is an example of how to create the control.
LRESULT
CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, <BR>    LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    ...
    m_wndTimeLine.Create(m_hWnd, 0, 0, WS_CHILD | WS_VISIBLE | WS_HSCROLL,
        WS_EX_STATICEDGE, IDC_TIMELINE);
    m_wndTimeLine.AutoPosition(); // Position the control at the <BR>                                  // bottom of the parent window.
    ...
}

You can also add m_wndTimeLine.AutoPosition() to your OnSize handler to keep the control at the top or bottom of the parent window.

Implementation Details

This control is implemented using a combination of several classes:

CTimeLineScroll<T>

This is a mix-in class that handles the WM_HSCROLL message. If you need to manage scrolling through a range of dates, you can use this class on it's own. For example:

class CMyWindow :
    public CWindowImpl<CMyWindow>
    public CTimeLineScroll<CMyWindow>
{
    ...
    BEGIN_MSG_MAP(CMyWindow)
      ...
      CHAIN_MSG_MAP(CTimeLineScroll<CMyWindow>)
    END_MSG_MAP()
    ...
    // Handle the scroll request here.
    void DoScroll(int cxDelta);
};

CTimeLineBand

This is an abstract base class used by CTimeLineCtrl to handle date-range rendering and selection.

I've included implementations for year, month, and week ranges (ie CTimeLineYearBand, CTimeLineMonthBand, and CTimeLineWeekBand respectively). If you want to add your own custom date-range bands, these will hopefully give you a good place to start.

Note that in this design, these classes are internal implementation classes for use by CTimeLineCtrl. Users of CTimeLineCtrl don't need to be aware of their existence.

CTimeLineCtrl

This is a CWindowImpl-derived class that acts as a host for instances of CTimeLineBand-derived classes. It mixes in CTimeLineScroll to handled WM_HSCROLL, and delegates rendering requests to its collection of bands.

The collection of bands is kept in a std::deque. The order in which bands are displayed in the control follows the ordering of bands in this collection.

Incidentally, in this implementation, I chose to create the different bands on the heap (preferring to keep the implementation details of the bands hidden from users of the control). With a few changes, you could have them as member variables of this (or a derived) control instead. Just make sure you modify the memory management code in OnDestroy if you do.

Here's an example of adding a band to CTimeLineCtrl:

LRESULT
CTimeLineCtrl::OnCreate(LPCREATESTRUCT /*lpcs*/)
{
    ...
    AddBand(new CTimeLineWeekBand(*this));
    ...
}

Enjoy!

Acknowledgements

  • Bjarke Viksoe - atlgdix.h (used for flicker-free drawing)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Tony Ioanides
Web Developer
Australia Australia
No Biography provided

Comments and Discussions

 
Generalfatal error RC1015: cannot open include file 'atlres.h'. Pin
Vicky_Jain5-Oct-08 20:23
MemberVicky_Jain5-Oct-08 20:23 
GeneralRe: fatal error RC1015: cannot open include file 'atlres.h'. Pin
RedFraggle28-Nov-08 6:59
MemberRedFraggle28-Nov-08 6:59 
GeneralRe: fatal error RC1015: cannot open include file 'atlres.h'. Pin
JamesDK9-Sep-09 19:56
MemberJamesDK9-Sep-09 19:56 
QuestionCan this code be in c# Pin
Nhilesh B23-Oct-07 23:12
MemberNhilesh B23-Oct-07 23:12 
GeneralGeneral Purpose Timeline Control Pin
sdancer7513-Sep-07 23:36
Membersdancer7513-Sep-07 23:36 
GeneralRe: General Purpose Timeline Control Pin
gyingLiow20-Jul-08 23:06
MembergyingLiow20-Jul-08 23:06 
GeneralRe: General Purpose Timeline Control Pin
maddinthegreat23-Sep-09 9:50
Membermaddinthegreat23-Sep-09 9:50 
Generalnewer WTL versions compilation problems Pin
Jan Stetka10-Jun-07 1:48
MemberJan Stetka10-Jun-07 1:48 
GeneralAnother timeline control... Pin
DavidJonson3-Mar-06 15:37
MemberDavidJonson3-Mar-06 15:37 
GeneralRe: Another timeline control... Pin
Soliant3-Jun-06 17:05
MemberSoliant3-Jun-06 17:05 
GeneralRe: Another timeline control... Pin
memo-517-Nov-07 7:53
Membermemo-517-Nov-07 7:53 
GeneralThe sample doesn't want to compile Pin
Renny[RuS]28-Feb-06 1:15
MemberRenny[RuS]28-Feb-06 1:15 
GeneralRe: The sample doesn't want to compile Pin
Renny[RuS]28-Feb-06 2:54
MemberRenny[RuS]28-Feb-06 2:54 
It's because new versions of atluser.h and atlgdi.h already contain some classes from atlgdix.h The solution is to find/replace e.g. CLogFont in atlgdix.h with CqweqweqweLogFont and such with all the defined classes.
Generalatltypes and atlcomtime Pin
David Horner27-May-03 13:04
MemberDavid Horner27-May-03 13:04 
GeneralRe: atltypes and atlcomtime Pin
Tony Ioanides27-May-03 13:36
MemberTony Ioanides27-May-03 13:36 
GeneralRe: atltypes and atlcomtime Pin
David Horner27-May-03 13:39
MemberDavid Horner27-May-03 13:39 
GeneralRe: atltypes and atlcomtime Pin
mab9914-Jul-03 2:01
Membermab9914-Jul-03 2:01 
GeneralRe: atltypes and atlcomtime Pin
wayneamurphy10-Mar-04 16:07
Memberwayneamurphy10-Mar-04 16:07 
QuestionMissing the .dsw and .dsp file? Pin
dxhdxh25-May-03 20:50
Memberdxhdxh25-May-03 20:50 
AnswerRe: Missing the .dsw and .dsp file? Pin
Tony Ioanides25-May-03 22:10
MemberTony Ioanides25-May-03 22:10 
AnswerRe: Missing the .dsw and .dsp file? Pin
Anonymous14-Jul-03 0:43
MemberAnonymous14-Jul-03 0:43 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Article
Posted 23 May 2003

Stats

192.7K views
4.1K downloads
40 bookmarked