# Month Calendar Control

* [Styles of Month Calendar](#styles-of-month-calendar)
* [Messages of Month Calendar](#messages-of-month-calendar)
  * [Getting Date](#getting-date)
  * [Setting Date](#setting-date)
  * [Adjusting Colors](#adjusting-colors)
  * [Size of Control](#size-of-control)
* [Notification Codes of Month Calendar](#notification-codes-of-month-calendar)
* [Sample Program](#sample-program)

The month calendar control provides a user interface similar to a calendar, and makes the user be able to select and set the date conveniently. The application can get or set the date by sending message to a month calendar control.

You can create a month calendar control by calling `CreateWindow` function with `CTRL_MONTHCALENDAR` as the control class name.

## Styles of Month Calendar

A month calendar control can use several forms of Chinese or English and so on to display the date information such as week, month, etc. Specifying the control style to be `MCS_CHN`, `MCS_ENG_L`, or `MCS_ENG_S` can complete this. If a month calendar control has the style `MCS_CHN`, the control will display the date information in Chinese; if having the style `MCS_ENG_L`, the control will display the date information in English; and if having the style `MCS_ENG_S`, the control displays the date information in abbreviate English.

If having the style `MCS_NOTIFY`, the month calendar control will generate corresponding notification messages in cases such as responding to the user’s operation.

## Messages of Month Calendar

### Getting Date

`MCM_GETCURDAY` message is used to get the day of the month of the current selected date:

```cpp
int day;
day = SendMessage (hwndMonthcal, MCM_GETCURDAY, 0, 0) ;
```

The return value of `SendMessage` is the current day of the month, in the range 1 to 31.

`MCM_GETCURMONTH` message is used to get the number of months of the current selected date:

```cpp
int month;
month = SendMessage (hwndMonthcal, MCM_GETCURMONTH, 0, 0) ;
```

The return value of `SendMessage` is the number of months since January, in the range 0 to 11.

`MCM_GETCURYEAR` message is used to get the number of years of the current selected date:

```cpp
int year;
year = SendMessage (hwndMonthcal, MCM_GETCURYEAR, 0, 0) ;
```

```cpp

The return value of SendMessage is the current number of years.

MCM_GETCURMONLEN message is used to get the length (how many days in a month) of the current month:

```

```cpp
int monthlen;
monthlen = SendMessage (hwndMonthcal, MCM_GETCURMONLEN, 0, 0) ;
```

The return value of `SendMessage` is the length of the current month.

`MCM_GETFIRSTWEEKDAY` message is used to determine which weekday is the first day in the current month:

```cpp
int weekday;
weekday = SendMessage (hwndMonthcal, MCM_GETFIRSTWEEKDAY, 0, 0) ;
```

The return value of `SendMessage` is the weekday number of the first day in the current month. The weekday number is the number of days since Sunday, in the range 0 to 6.

`MCM_GETCURDATE` message gets the current selected date in a month calendar control:

```cpp
SYSTEMTIME systime;
SendMessage (hwndMonthcal, MCM_GETCURDATE, 0, (LPARAM)&systime) ;
```

Here `systime` is a structure of `SYSTEMTIME` type, which stores the gotten date information such as year, month, day, and week, etc. This structure is also used for messages such as `MCM_GETTODAY` and so on. The definition of `SYSTEMTIME` structure is as follows:

```cpp
typedef struct _SYSTEMTIME
{
    /* Year */
    int year;
    /* Month */
    int month;
    /* Date */
    int day;
    /* Day */
    int weekday;
} SYSTEMTIME;
typedef SYSTEMTIME *PSYSTEMTIME;
```

`MCM_GETTODAY` message gets the date of "today".

```cpp
SYSTEMTIME systime;
SendMessage (hwndMonthcal, MCM_GETTODAY, 0, (LPARAM)&systime) ;
```

Here `systime` is also a structure of `SYSTEMTIME` type.

### Setting Date

It should be noted that special user right (such as root) may needed to set the date in Linux/UNIX system.

`MCM_SETCURDAY` message sets the current day, `MCM_SETCURMONTH` message sets the current month, and `MCM_SETCURYEAR` sets the current year:

```cpp
int day;
int month;
int year;
SendMessage (hwndMonthcal, MCM_SETCURDAY, day, 0) ;
SendMessage (hwndMonthcal, MCM_SETCURMONTH, month, 0) ;
SendMessage (hwndMonthcal, MCM_SETCURYEAR, year, 0) ;
```

Here, day, month, and year specify the new day, month and year respectively, and if these values exceed the rational values, the control will adopt the most approached day, month, or year.

`MCM_SETCURDATE` message sets a specified date as the current selected data:

```cpp
SYSTEMTIME systime;
SendMessage (hwndMonthcal, MCM_SETCURDATE, 0, (LPARAM)&systime) ;
```

`MCM_SETTODAY` sets today as the current selected date:

```cpp
SendMessage (hwndMonthcal, MCM_SETTODAY, 0, 0) ;
```

### Adjusting Colors

An application can set or get the color of each element in a month calendar control by `MCM_GETCOLOR` and `MCM_SETCOLOR` messages:

```cpp
MCCOLORINFO color;
SendMessage (hwndMonthcal, MCM_GETCOLOR, 0, (LPARAM)&color) ;
SendMessage (hwndMonthcal, MCM_SETCOLOR, 0, (LPARAM)&color) ;
```

Here color is a structure of `MCCOLORINFO`, and is used to store color information:

```cpp
typedef struct _MCCOLORINFO
{
    /* background color of the title */
    int clr_titlebk;
    /* text color of the title */
    int clr_titletext;
    /* color of the arrows */
    int clr_arrow;
    /* background color of the highlighted arrows */
    int clr_arrowHibk;

    /* background color of the weekday */
    int clr_weekcaptbk;
    /* text color of the weekday */
    int clr_weekcapttext;

    /* backgroud color of the day */
    int clr_daybk;
    /* background color of the highlighted day */
    int clr_dayHibk;
    /* text color of the current day */
    int clr_daytext;
    /* text color of the other day */
    int clr_trailingtext;
    /* text color of the hilighted day */
    int clr_dayHitext;
} MCCOLORINFO;
```

### Size of Control

A month calendar has a minimum limit for the window to display content in it normally. `MCM_GETMINREQRECTW` and `MCM_GETMINREQRECTH` messages are used to get the minimum width and the minimum height respectively:

```cpp
int minw, minh;
minw = SendMessage (hwndMonthcal, MCM_GETMINREQRECTW, 0, 0) ;
minh = SendMessage (hwndMonthcal, MCM_GETMINREQRECTH, 0, 0) ;
```

The return values of `SendMessage` functions are the minimum width and height.

## Notification Codes of Month Calendar

When user clicked month calendar and the currently selected date is changed, the control will generate `MCN_DATECHANGE` notification code.

## Sample Program

Program in List 1 illustrates the use of month calendar control. Please refer to `monthcal.c` file of the demo program package of this guide for the complete source code.

**List 1** Sample Program of month calendar control

```cpp
#define IDC_MC                100
#define IDC_OK                200

/* Dialog box template: only two controls: month calendar control and “OK” button  */
static CTRLDATA CtrlTime[]=
{
        {
                "monthcalendar",
                WS_CHILD | WS_VISIBLE | MCS_NOTIFY | MCS_ENG_L,
                10, 10, 240, 180,
                IDC_MC,
                "",
                0
        },
        {
                "button",
                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                260, 180, 50, 22,
                IDC_OK,
                "OK",
                0
        }
};

static DLGTEMPLATE DlgTime =
{
        WS_VISIBLE | WS_CAPTION | WS_BORDER,
        WS_EX_NONE,
        0, 0, 320, 240,
        "Date time",
        0, 0,
        2, CtrlTime,
        0
};

static int TimeWinProc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
    switch (message) {
        case MSG_INITDIALOG:
        break;

        case MSG_COMMAND:
        {
            int id = LOWORD(wParam);
            if (id == IDC_OK) {
                char info[100];
                 SYSTEMTIME date;
                 /* Get the current date of month calendar */
                 SendMessage (GetDlgItem(hDlg, IDC_MC), MCM_GETCURDATE, 0, (LPARAM)&date);
                 sprintf (info, "You will meet Bush president on  %d.%d.%d",
                                  date.year, date.month, date.day);
                 MessageBox (hDlg, info, "Date", MB_OK);
                 EndDialog (hDlg, 0);
            }
        }
        break;

    case MSG_CLOSE:
        {
            EndDialog (hDlg, 0);
        }
        return 0;
    }

    return DefaultDialogProc (hDlg, message, wParam, lParam);
}
```

![alt](https://3533682497-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F95Qe4b8fOBT2JZL5WDlF%2Fuploads%2Fgit-blob-10cafd42aa6b1fed4fe96028375ecb1242bae20d%2F33.1.jpeg?alt=media)

**Figure 1** Use of month calendar

***

[<< List View Control](miniguiprogguidepart6chapter14) | [Table of Contents](..) | [Spin Box Control >>](miniguiprogguidepart6chapter16)
