home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
SPIN.ZIP
/
SPIN.C
Wrap
Text File
|
1991-10-04
|
4KB
|
127 lines
This is code some code for using spinbuttons as requested on Compuserve.
Sorry its not in a state to compile as it comes from a large app that uses
Client-Server architecture. I have extracted the relevant parts.
It is used to get a date from the user where the date is usually Today or very
close. It must deal with the number of days in the month and also leap years.
I hope it helps you.
Don't forget to use 1.3 Header files.
Regards
Toby
/*.RC file*/
BEGIN
DIALOG "Update", IDLG_UPDATE, 9, 40, 302, 190,
FS_NOBYTEALIGN | FS_DLGBORDER | WS_VISIBLE | WS_CLIPSIBLINGS | WS_SAVEBITS,
FCF_TITLEBAR
BEGIN
CONTROL "", ID_SB_DAY, 20, 30, 40, 20, WC_SPINBUTTON, WS_TABSTOP | WS_VISIBLE |
SPBS_MASTER | SPBS_READONLY | SPBS_JUSTCENTER | SPBS_NUMERICONLY
CONTROL "", ID_SB_MONTH, 60, 30, 40, 20, WC_SPINBUTTON, WS_VISIBLE |
SPBS_MASTER | SPBS_READONLY | SPBS_JUSTCENTER
CONTROL "", ID_SB_YEAR, 100, 30, 40, 20, WC_SPINBUTTON, WS_VISIBLE |
SPBS_MASTER | SPBS_READONLY | SPBS_JUSTCENTER | SPBS_NUMERICONLY
CONTROL "Send", DID_OK, 19, 6, 38, 13,
WC_BUTTON, BS_PUSHBUTTON | BS_DEFAULT | WS_TABSTOP | WS_VISIBLE
CONTROL "Cancel", DID_CANCEL, 79, 6, 38, 13,
WC_BUTTON, BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE
END
END
/*Message loop for dialog box with spinbuttons*/
case WM_INITDLG: /*set range and value for spinbuttons*/
DosGetDateTime(&DateTime);
WinSendDlgItemMsg(hWndDlg, ID_SB_YEAR, SPBM_SETLIMITS, (MPARAM)1999L, (MPARAM)1900L); /*This centuary only*/
WinSendDlgItemMsg(hWndDlg, ID_SB_YEAR, SPBM_SETCURRENTVALUE, (MPARAM)DateTime.year, NULL);
WinSendDlgItemMsg(hWndDlg, ID_SB_MONTH, SPBM_SETLIMITS, (MPARAM)11L, (MPARAM)0L);
WinSendDlgItemMsg(hWndDlg, ID_SB_MONTH, SPBM_SETCURRENTVALUE, (MPARAM)(DateTime.month -1), NULL);
WinSendDlgItemMsg(hWndDlg, ID_SB_MONTH, SPBM_SETARRAY, (MPARAM)pszMonths, (MPARAM)12);
WinSendDlgItemMsg(hWndDlg, ID_SB_DAY, SPBM_SETLIMITS, (MPARAM)31L, (MPARAM)1L);
WinSendDlgItemMsg(hWndDlg, ID_SB_DAY, SPBM_SETCURRENTVALUE, (MPARAM)DateTime.day, NULL);
break;
case WM_CONTROL: /*Work done here is to control SB's range only*/
switch(SHORT1FROMMP(mp1))
{
case ID_SB_DAY:
case ID_SB_MONTH:
switch (SHORT2FROMMP(mp1))
{
case SPBN_CHANGE: /*spin button used*/
{
LONG lMonth;
WinSendDlgItemMsg(hWndDlg, /*query month*/
ID_SB_MONTH,
SPBM_QUERYVALUE,
&lMonth, /*Dont allow values out of range*/
MPFROM2SHORT(NULL, SPBQ_UPDATEIFVALID));
switch(lMonth) /*Set days' spinbutton's limits according to days in month*/
{ /*Months are zero based*/
case 0: case 2: case 4: case 6: case 7: case 9: case 11:
WinSendDlgItemMsg(hWndDlg, ID_SB_DAY, SPBM_SETLIMITS, (MPARAM)31L, (MPARAM)1L);
break;
case 1:
WinSendDlgItemMsg(hWndDlg,
ID_SB_YEAR,
SPBM_QUERYVALUE, /*Get year*/
&lYear,
MPFROM2SHORT(NULL, SPBQ_UPDATEIFVALID));
if ((lYear % 4)) /*leap year*/
WinSendDlgItemMsg(hWndDlg, ID_SB_DAY, SPBM_SETLIMITS, (MPARAM)28L, (MPARAM)1L);
else
WinSendDlgItemMsg(hWndDlg, ID_SB_DAY, SPBM_SETLIMITS, (MPARAM)29L, (MPARAM)1L);
break;
default:
WinSendDlgItemMsg(hWndDlg, ID_SB_DAY, SPBM_SETLIMITS, (MPARAM)30L, (MPARAM)1L);
break;
}
}
break;
}
case ID_SB_YEAR:
DosSleep(5L); /*slow spinbutton down, it's very quick!*/
break;
}
break;
/*Function to get date from spinbuttons*/
USHORT GetDateFromDialogBox(HWND hWnd,
PCHAR szDate)
{
LONG lDay, lMonth, lYear;
WinSendDlgItemMsg(hWnd,
ID_SB_DAY,
SPBM_QUERYVALUE,
&lDay,
MPFROM2SHORT(NULL, SPBQ_UPDATEIFVALID));
WinSendDlgItemMsg(hWnd,
ID_SB_MONTH,
SPBM_QUERYVALUE,
&lMonth,
MPFROM2SHORT(NULL, SPBQ_UPDATEIFVALID));
WinSendDlgItemMsg(hWnd,
ID_SB_YEAR,
SPBM_QUERYVALUE,
&lYear,
MPFROM2SHORT(NULL, SPBQ_UPDATEIFVALID));
sprintf(szDate, "%lu-%lu-%lu",lDay, lMonth+1,lYear);
return 0; /*months zero based*/
}