Please enable JavaScript to view this site.

A-Shell Reference

Retrieve Date

To retrieve the selected date (either in response to receiving the click string or exitcode, or whenever you like), use opcode CTLOP_QRYCB (5) to query the control. This opcode was previously only used for querying a checkbox, but takes on a slightly different meaning here:

xcall AUI, AUI_CONTROL, CTLOP_QRYCB, id, ctext$, cstate, ctype, cmd$, "", cstatus

Set id to the id number of the control (as returned from the CTLOP_ADD) operation. The currently selected date will be returned in cstatus as a number with the following format: CCYYMMDD. (You can convert it to a string and parse it out into subfields as you like.) The ctext$, cstate, ctype, and cmd$ parameters are ignored.

Set Date

To set the date in the calendar, use the CTLOP_CHG opcode and put the date (in CCYYMMDD format) into the ctext$ parameter, as if you were changing the text of a control. Set the cstate parameter to MBST_TEXTONLY:

xcall AUI, AUI_CONTROL, CTLOP_CHG, id, ctext$, MBST_TEXTONLY

Set Limits

To limit the calendar to a range of dates, Use the CTLOP_CHG operation as for setting the date, except format the ctext$ parameter as a 17 byte string of two dates in CCYYMMDD format with a dash in between, for example:

CTEXT$ = "20050120-20070630"   ! range of 15-Jan-05 thru 30-Jun-07

xcall AUI, AUI_CONTROL, CTLOP_CHG, ID, CTEXT$, MBST_TEXTONLY

Set Day States

As an added feature, you can force selected dates to be shown in bold. To do so, specify the MCS_DAYSTATES flag (in the winstyle parameter) when creating the control. You must then send a string of 0's and 1's to the control to update the day states for the current month when the control is first displayed and whenever the month changes (which will require you to respond to the click code). Set the ctext$ parameter to a string 31 digits long, representing the days 1-31 of the current month. (Set any extra days to 0). 0 indicates the normal state, and 1 the bold state. Then use the same CTLOP_CHG format as shown above for setting the date. The control will determine which attribute you are setting by the fact that the ctext$ string is exactly 31 bytes long. For example::

CTEXT$ = "1000000000000010000000000000000"  ! bold 1st & 15th

xcall AUI, AUI_CONTROL, CTLOP_CHG, ID, CTEXT$, MBST_TEXTONLY

Note that this mechanism currently is only supported for one month at a time; see the discussion above about specifying the coordinates to make sure that the control is not big enough to show multiple months.

Set Color Attributes

There are two standard style/color variations of the calendar control, depending on whether the ctype2 MBF2_NOTHEME bit is set when the control is created:

moncal11

 

moncal22

Standard themed version (Win11)

Standard non-themed version

To change the color scheme for the non-themed version, use the following:

xcall AUI, AUI_CONTROL, CTLOP_CHG, ctlid, ctext$, MBST_TEXTONLY

where ctext$ should set to the an attribute name string followed by a colon followed by hex representation for the blue, green and red color values, e.g.

AttributeID:&hbbggrr

The available attributes (not case sensitive) for which colors can be set are as follows:

AttributeID

Description

SETCOLOR_BACKGROUND

Background (area outside the calendars but inside the control borders)

SETCOLOR_MONTHBK

Background for the calendar(s)

SETCOLOR_TEXT

Color of the text within a month (days)

SETCOLOR_TITLEBK

Background of the title area

SETCOLOR_TITLETEXT

Title text color

SETCOLOR_HDRTRAILINGTEXT

Text color for the display header day and trailing day text (leading and trailing days from previous and following months)

Example

ctext$ = "SETCOLOR_MONTHBK:&heecc88"

xcall AUI, AUI_CONTROL, CTLOP_CHG, ctlid, ctext$, MBST_TEXTONLY

 

Visibility Issues

The calendar control, when positioned on top of another control in the same window, allows the control underneath to "bleed" through (both visually and when processing mouse clicks). (This is just a Windows quirk of that control.) The normal way to avoid such problems with it is to not position on top of another control (seems reasonable), or, if you insist, then first enclose it in a separate dialog. However, if neither of those options is desirable, yet another possibility is to remove the child flag from the control, so that it acts like a top-level popup or overlapped window. To do so, add the WS_VISIBLE flag, and optionally, the WS_POPUP flags in the dwStyle parameter. (e.g. DWSTYLE = WS_CAPTION + WS_SYSMENU + WS_VISIBLE). This essentially turns the calendar control into its own dialog, which has its own downsides (affecting the positioning and also making it difficult to use in conjunction with another control to receive the date clicked on), but for cases where you just want to have a floating calendar handy, this may be an easier technique than manually creating your own modeless dialog to house the calendar control.

The reason why adding WS_VISIBLE removes the child flag (WS_CHILD) is that if neither WS_VISIBLE nor WS_CHILD are specified, both are turned on by default. Turning on the visible flag explicitly removes the default.

History

March 2024, A-Shell 7.0.1757: ASHMONTHCAL control enhancement: you can now set various color attributes for the control.