Hey SlightHaze:
I've been working on a calendar class for the same reason.
Here's the first draft:
[tt]
CLEAR
PRIVATE dVar
dVar = NULL
oForm = CREATEOBJECT("frmCalendar","dVar"

oForm.SHOW()
READ EVENTS
? dVar
DEFINE CLASS frmCalendar AS FORM
DOCREATE = .T.
AUTOCENTER = .T.
SCALEMODE = 3
MINBUTTON = .F.
MAXBUTTON = .F.
BORDERSTYLE = 2
CAPTION = "Non-ActiveX Calendar"
cVar = ""
dRetDate = DATE()
ADD OBJECT calendar AS calendar
PROCEDURE INIT
LPARAM lcIndirVar
THIS.cVar = lcIndirVar
THIS.HEIGHT = THIS.calendar.HEIGHT
THIS.WIDTH = THIS.calendar.WIDTH
ENDPROC
PROCEDURE DESTROY
THIS.dRetDate = THIS.Calendar.dCurDate
CLEAR EVENTS
ENDPROC
PROCEDURE UNLOAD
LOCAL lcIndirVar
lcIndirVar = THIS.cVar
&lcIndirVar = THIS.dRetDate
ENDPROC
ENDDEFINE
**************************************************
*-- Class: calendar (c:\dev\classes\vfp\dateclasses.vcx)
*-- ParentClass: container
*-- BaseClass: container
*-- Time Stamp: 07/20/03 12:54:04 AM
*
DEFINE CLASS calendar AS CONTAINER
WIDTH = 207
HEIGHT = 250
BACKSTYLE = 0
NAME = "calendar"
dcurdate = .F.
ADD OBJECT lblmonth AS LABEL WITH ;
AUTOSIZE = .T., ;
FONTSIZE = 12, ;
BACKSTYLE = 0, ;
CAPTION = "Month", ;
HEIGHT = 21, ;
LEFT = 36, ;
TOP = 2, ;
WIDTH = 44, ;
NAME = "lblMonth"
ADD OBJECT lblyear AS LABEL WITH ;
AUTOSIZE = .T., ;
FONTSIZE = 12, ;
BACKSTYLE = 0, ;
BORDERSTYLE = 0, ;
CAPTION = "Year", ;
HEIGHT = 21, ;
LEFT = 36, ;
TOP = 24, ;
WIDTH = 34, ;
BACKCOLOR = RGB(236,233,216), ;
NAME = "lblYear"
ADD OBJECT lblToday AS LABEL WITH ;
AUTOSIZE = .T., ;
FONTSIZE = 12, ;
BACKSTYLE = 0, ;
CAPTION = "Today", ;
HEIGHT = 21, ;
LEFT = 158, ;
TOP = 4, ;
WIDTH = 45, ;
NAME = "lblToday"
ADD OBJECT line1 AS LINE WITH ;
HEIGHT = 0, ;
LEFT = 0, ;
TOP = 84, ;
WIDTH = 204, ;
NAME = "Line1"
ADD OBJECT line2 AS LINE WITH ;
HEIGHT = 0, ;
LEFT = 0, ;
TOP = 108, ;
WIDTH = 204, ;
NAME = "Line2"
ADD OBJECT line3 AS LINE WITH ;
HEIGHT = 0, ;
LEFT = 0, ;
TOP = 220, ;
WIDTH = 204, ;
NAME = "Line3"
ADD OBJECT lblcurdate AS LABEL WITH ;
AUTOSIZE = .T., ;
FONTSIZE = 10, ;
BACKSTYLE = 0, ;
CAPTION = "Selected date shows here", ;
HEIGHT = 18, ;
LEFT = 5, ;
TOP = 226, ;
WIDTH = 152, ;
NAME = "lblCurDate"
ADD OBJECT lblmonrev AS LABEL WITH ;
AUTOSIZE = .F., ;
FONTBOLD = .T., ;
FONTNAME = "Arial Black", ;
ALIGNMENT = 2, ;
BACKSTYLE = 0, ;
BORDERSTYLE = 1, ;
CAPTION = "<", ;
HEIGHT = 17, ;
LEFT = 6, ;
TOP = 3, ;
WIDTH = 12, ;
NAME = "lblMonRev"
ADD OBJECT lblmonfwd AS LABEL WITH ;
AUTOSIZE = .F., ;
FONTBOLD = .T., ;
FONTNAME = "Arial Black", ;
ALIGNMENT = 2, ;
BACKSTYLE = 0, ;
BORDERSTYLE = 1, ;
CAPTION = ">", ;
HEIGHT = 17, ;
LEFT = 21, ;
TOP = 3, ;
WIDTH = 12, ;
NAME = "lblMonFwd"
ADD OBJECT lblyearrev AS LABEL WITH ;
AUTOSIZE = .F., ;
FONTBOLD = .T., ;
FONTNAME = "Arial Black", ;
ALIGNMENT = 2, ;
BACKSTYLE = 0, ;
BORDERSTYLE = 1, ;
CAPTION = "<", ;
HEIGHT = 17, ;
LEFT = 6, ;
TOP = 25, ;
WIDTH = 12, ;
NAME = "lblYearRev"
ADD OBJECT lblyearfwd AS LABEL WITH ;
AUTOSIZE = .F., ;
FONTBOLD = .T., ;
FONTNAME = "Arial Black", ;
ALIGNMENT = 2, ;
BACKSTYLE = 0, ;
BORDERSTYLE = 1, ;
CAPTION = ">", ;
HEIGHT = 17, ;
LEFT = 21, ;
TOP = 25, ;
WIDTH = 12, ;
NAME = "lblYearFwd"
PROCEDURE INIT
LOCAL i,j,k,lcLabel,o
LOCAL lnTop,lnLeft
#DEFINE MonTop 50
#DEFINE DowTop 88
#DEFINE DayTop 112
#DEFINE StartLeft 10
#DEFINE ColStep 28
lnTop = MonTop
lnLeft = StartLeft
k = 0
* Add Month labels
FOR i = 1 TO 12
lcLabel = "lblMon"+TRANSFORM(i)
THIS.ADDOBJECT(lcLabel,"monlabel",i)
o = "this."+lcLabel
o = &o
WITH o
.FONTNAME = "courier new"
.WIDTH = 24
.HEIGHT = 24
.ALIGNMENT = 1
.TOP = lnTop
.LEFT = lnLeft+1 && Nudge right to center
.VISIBLE = .T.
.BACKSTYLE = 0
.CAPTION = .PARENT.aMonths[ i ]
.AUTOSIZE = .T.
ENDWITH
IF i == 6
lnLeft = StartLeft
lnTop = lnTop + 16
ELSE
lnLeft = lnLeft + ColStep+4 && Increase spacing for month labels
ENDIF
NEXT
lnLeft = StartLeft
lnTop = DowTop
* Add Day of week labels
FOR i = 1 TO 7
lcLabel = "lblDOW"+TRANSFORM(i)
THIS.ADDOBJECT(lcLabel,"DayOfWeek"

o = "this."+lcLabel
o = &o
WITH o
.FONTNAME = "courier new"
.WIDTH = 24
.HEIGHT = 16
.ALIGNMENT = 2
.TOP = lnTop
.LEFT = lnLeft-2 && Nudge left to center over days
.VISIBLE = .T.
.BACKSTYLE = 0
.CAPTION = .PARENT.aDow[ i ]
ENDWITH
lnLeft = lnLeft + ColStep
NEXT
* Add Day of Month labels
lnLeft = StartLeft
lnTop = DayTop
FOR i = 1 TO 6
FOR j = 1 TO 7
lcLabel = "lblDay"+TRANSFORM(k)
THIS.ADDOBJECT(lcLabel,"calday"

o = "this."+lcLabel
o = &o
WITH o
.FONTNAME = "courier new"
.WIDTH = 16
.HEIGHT = 16
.ALIGNMENT = 1
.TOP = lnTop
.LEFT = lnLeft
.VISIBLE = .T.
.BACKSTYLE = 0
ENDWITH
k = k + 1
IF MOD(k,7)==0
lnTop = lnTop + 18
lnLeft = StartLeft
ELSE
lnLeft = lnLeft + ColStep
ENDIF
NEXT
NEXT
THIS.SetDate(DATE())
ENDPROC
PROCEDURE setdate
LPARAM ldSetDate
#DEFINE HiLight RGB(10,0,255)
#DEFINE LowLight RGB(0,0,0)
WITH THIS
.dCurDate = ldSetDate
.lblMonth.CAPTION = CMONTH(ldSetDate)
.lblYear.CAPTION = TRANSFORM(YEAR(ldSetDate))
.lblMonth.AUTOSIZE = .T.
.lblYear.AUTOSIZE = .T.
LOCAL lnDay, lnFirstDOW, ldCurDate, i, o, k, lnSetDay
lnDay = 1
lnSetDay = DAY(ldSetDate)
k = 0
lnFirstDOW = ;
DOW(CTOD(TRANSFORM(MONTH(ldSetDate)) + "/01/" + ;
TRANSFORM(YEAR(ldSetDate))),1)
FOR i = 1 TO 42
o = ".lblDay"+TRANSFORM(k)
o = &o
ldCurDate = ;
CTOD(TRANSFORM(MONTH(ldSetDate)) + "/" + ;
TRANSFORM(lnDay) + "/" + ;
TRANSFORM(YEAR(ldSetDate)))
o.CAPTION = IIF(i>=lnFirstDOW .AND. !EMPTY(ldCurDate),TRANSFORM(lnDay),""

o.FORECOLOR = IIF(lnDay<>lnSetDay,LowLight,HiLight)
o.BORDERSTYLE = ;
IIF(CTOD(TRANSFORM(MONTH(ldSetDate)) + "/" + ;
o.CAPTION+"/"+TRANSFORM(YEAR(ldSetDate)))<>DATE(),0,1)
k = k + 1
IF i>=lnFirstDOW
lnDay = lnDay + 1
ENDIF
NEXT
FOR i = 1 TO 12
o = ".lblMon"+TRANSFORM(i)
o = &o
o.FORECOLOR = IIF(MONTH(ldSetDate)<>o.nIndex,LowLight,HiLight)
NEXT
.lblCurDate.CAPTION = ;
CDOW(ldSetDate) + " " + ;
CMONTH(ldSetDate) + " " + ;
TRANSFORM(DAY(ldSetDate)) + ", " + ;
TRANSFORM(YEAR(ldSetDate))
FOR i = 1 TO 7
o = ".lblDow"+TRANSFORM(i)
o = &o
o.FORECOLOR = IIF(DOW(ldSetDate)<>i,LowLight,HiLight)
NEXT
ENDWITH
ENDPROC
PROCEDURE lblmonrev.CLICK
LOCAL ldNextDate
ldNextDate = GOMONTH(THIS.PARENT.dCurDate,-1)
THIS.PARENT.SetDate(ldNextDate)
ENDPROC
PROCEDURE lblmonfwd.CLICK
LOCAL ldNextDate
ldNextDate = GOMONTH(THIS.PARENT.dCurDate,1)
THIS.PARENT.SetDate(ldNextDate)
ENDPROC
PROCEDURE lblyearrev.CLICK
LOCAL ldNextDate, lnDownDay
ldNextDate = CTOD("//"

lnDownDay = 0
DO WHILE EMPTY(ldNextDate)
ldNextDate = CTOD( ;
TRANSFORM(MONTH(THIS.PARENT.dCurDate)) + "/" + ;
TRANSFORM(DAY(THIS.PARENT.dCurDate)-lnDownDay) + "/" + ;
TRANSFORM(YEAR(THIS.PARENT.dCurDate)-1) ;
)
lnDownDay = lnDownDay + 1 && Compensates for hitting a month with an invalid day
ENDDO
THIS.PARENT.SetDate(ldNextDate)
ENDPROC
PROCEDURE lblyearfwd.CLICK
LOCAL ldNextDate, lnDownDay
ldNextDate = CTOD("//"

lnDownDay = 0
DO WHILE EMPTY(ldNextDate)
ldNextDate = CTOD( ;
TRANSFORM(MONTH(THIS.PARENT.dCurDate)) + "/" + ;
TRANSFORM(DAY(THIS.PARENT.dCurDate)-lnDownDay) + "/" + ;
TRANSFORM(YEAR(THIS.PARENT.dCurDate)+1) ;
)
lnDownDay = lnDownDay + 1 && Compensates for hitting a month with an invalid day
ENDDO
THIS.PARENT.SetDate(ldNextDate)
ENDPROC
PROCEDURE lblToday.CLICK
THIS.PARENT.SetDate(DATE())
ENDPROC
ENDDEFINE
*
*-- EndDefine: calendar
**************************************************
**************************************************
*-- Class: calday (c:\dev\classes\vfp\dateclasses.vcx)
*-- ParentClass: label
*-- BaseClass: label
*-- Time Stamp: 07/19/03 11:36:02 PM
*
DEFINE CLASS calday AS LABEL
CAPTION = "Label1"
HEIGHT = 17
WIDTH = 40
NAME = "calday"
PROCEDURE CLICK
IF !EMPTY(THIS.CAPTION)
LOCAL ldSetDate
ldSetDate = THIS.PARENT.dCurDate
ldSetDate = TRANSFORM(MONTH(ldSetDate))+ "/"+ ;
THIS.CAPTION +"/"+;
TRANSFORM(YEAR(ldSetDate))
ldSetDate = CTOD(ldSetDate)
THIS.PARENT.SetDate(ldSetDate)
ENDIF
ENDPROC
ENDDEFINE
*
*-- EndDefine: calday
**************************************************
**************************************************
*-- Class: monlabel (c:\dev\classes\vfp\dateclasses.vcx)
*-- ParentClass: label
*-- BaseClass: label
*-- Time Stamp: 07/19/03 11:45:02 PM
*
DEFINE CLASS monlabel AS LABEL
CAPTION = "Label1"
HEIGHT = 17
WIDTH = 40
NAME = "monlabel"
nindex = .F.
PROCEDURE INIT
LPARAM lnIndex
THIS.nIndex = lnIndex
IF !pemstatus(THIS.PARENT,"aMonths",5)
THIS.PARENT.ADDPROPERTY("aMonths[12]"

LOCAL i
#DEFINE Months "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
ALINES(THIS.PARENT.aMonths,STRTRAN(Months,",",CHR(13)))
ENDIF
ENDPROC
PROCEDURE CLICK
LOCAL ldNextDate, lnDownDay
ldNextDate = CTOD("//"

lnDownDay = 0
DO WHILE EMPTY(ldNextDate)
ldNextDate = CTOD( ;
TRANSFORM(THIS.nIndex) + "/" + ;
TRANSFORM(DAY(THIS.PARENT.dCurDate)-lnDownDay) + "/" + ;
TRANSFORM(YEAR(THIS.PARENT.dCurDate)) ;
)
lnDownDay = lnDownDay + 1 && Compensates for hitting a month with an invalid day
ENDDO
THIS.PARENT.SetDate(ldNextDate)
ENDPROC
ENDDEFINE
*
*-- EndDefine: monlabel
**************************************************
**************************************************
*-- Class: dayofweek (c:\dev\classes\vfp\dateclasses.vcx)
*-- ParentClass: label
*-- BaseClass: label
*-- Time Stamp: 07/19/03 11:36:02 PM
*
DEFINE CLASS DAYOFWEEK AS LABEL
CAPTION = "Label1"
HEIGHT = 17
WIDTH = 40
NAME = "dayofweek"
PROCEDURE INIT
IF !pemstatus(THIS.PARENT,"aDow",5)
THIS.PARENT.ADDPROPERTY("aDow[7]"

LOCAL i
#DEFINE DAYOFWEEK "Sun,Mon,Tue,Wed,Thu,Fri,Sat"
ALINES(THIS.PARENT.aDow,STRTRAN(DAYOFWEEK,",",CHR(13)))
ENDIF
ENDPROC
PROCEDURE CLICK
LOCAL lnDow, lnThisDow
lnDow = DOW(THIS.PARENT.dCurDate)
lnThisDow = ASCAN(THIS.PARENT.aDow,THIS.CAPTION)
THIS.PARENT.SetDate(THIS.PARENT.dCurDate+lnThisDow-lnDow)
ENDPROC
ENDDEFINE
*
*-- EndDefine: dayofweek
**************************************************
[/tt]
'We all must do the hard bits so when we get bit we know where to bite'
