227 lines
5.2 KiB
C++
227 lines
5.2 KiB
C++
|
This virtual calender shows current month and user can navigate
|
|||
|
through previous or next month / year using arrow keys
|
|||
|
|
|||
|
Code :
|
|||
|
#include "conio.h"
|
|||
|
#include "stdlib.h"
|
|||
|
#include "dos.h"
|
|||
|
#include "string.h"
|
|||
|
#include "stdio.h"
|
|||
|
|
|||
|
void draw(int, int); //DRAWS BOX WITH MONTH & YEAR IN HEADER
|
|||
|
void show_time(); //DISPLAYS CURRENT TIME IN FOOTER OF BOX
|
|||
|
void print_cal( int, int); //PRINTS DATES WITHIN BOX
|
|||
|
int getkey(); //SCANS USER KEY AND RETUEN ITS SCAN CODE
|
|||
|
int first_day( int, int ); //DETEMINES FIRST DAY OF MONTH
|
|||
|
int today;
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
int year, month;
|
|||
|
char ch;
|
|||
|
struct date d;
|
|||
|
getdate(&d); //RETURNS CURRENT DATE
|
|||
|
year = d.da_year;
|
|||
|
month = d.da_mon - 1;
|
|||
|
today = d.da_day - 1; //GET CURRENT DATE
|
|||
|
print_cal(year, month); //PRINTS CALENDER OF CURRENT MONTH
|
|||
|
flushall();
|
|||
|
while((ch = getkey()) != 1) //KEEP TRACK OF KEYS UNTILL 'ESC' PRESSED
|
|||
|
{
|
|||
|
switch(ch)
|
|||
|
{
|
|||
|
case 72: year++; //UP ARROW KEY
|
|||
|
break;
|
|||
|
case 80: year--; //DOWN ARROW KEY
|
|||
|
break;
|
|||
|
|
|||
|
case 77: month++; //RIGHT ARROW KEY
|
|||
|
if(month > 11)
|
|||
|
{
|
|||
|
month = 0;
|
|||
|
year++;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 75: month--; //LEFT ARROW KEY
|
|||
|
if(month < 0)
|
|||
|
{
|
|||
|
month = 11;
|
|||
|
year--;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
print_cal(year, month); //PRINTS CALENDER OF CHANGED MONTH OR YEAR
|
|||
|
}
|
|||
|
}
|
|||
|
void show_time()
|
|||
|
{
|
|||
|
struct time t;
|
|||
|
while(!kbhit())
|
|||
|
{
|
|||
|
textcolor(YELLOW);
|
|||
|
gettime(&t); //GET CURRENT TIME
|
|||
|
gotoxy(22,2);
|
|||
|
if(t.ti_hour < 13)
|
|||
|
printf(" CURRENT TIME => %2d:%02d:%02d AM",t.ti_hour, t.ti_min,
|
|||
|
t.ti_sec);
|
|||
|
else
|
|||
|
{
|
|||
|
t.ti_hour -= 12;
|
|||
|
printf(" CURRENT TIME => %2d:%02d:%02d PM",t.ti_hour, t.ti_min,
|
|||
|
t.ti_sec);
|
|||
|
}
|
|||
|
|
|||
|
delay(1000);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int first_day(int year, int month) //DETEMINES FIRST DAY OF MONTH
|
|||
|
{
|
|||
|
int mdays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304,
|
|||
|
334};
|
|||
|
int lpyear = ((year-1900)/4) + ((year-1900)/400) - ((year-1900)/100);
|
|||
|
long unsigned days = ((year-1900)*365) + lpyear + mdays[month];
|
|||
|
return days % 7;
|
|||
|
}
|
|||
|
int getkey() //SCANS USER KEY AND RETURN ITS SCAN CODE
|
|||
|
{
|
|||
|
union REGS i,o;
|
|||
|
while(!kbhit())
|
|||
|
;
|
|||
|
i.h.ah = 0;
|
|||
|
int86(22,&i,&o);
|
|||
|
return(o.h.ah);
|
|||
|
}
|
|||
|
void draw(int year, int month) //DRAWS BOX WITH MONTH & YEAR IN HEADER
|
|||
|
{
|
|||
|
char *mo[] = { "January", "Feburary", "March", "April",
|
|||
|
"May", "June", "July", "August", "September",
|
|||
|
"October", "November", "December" };
|
|||
|
char *day[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
|
|||
|
int i, j;
|
|||
|
int ro = 205, co = 186; //GARPH CHAR 205 '<27>', 186 '<27>'
|
|||
|
clrscr();
|
|||
|
gotoxy(16, 8);
|
|||
|
printf("USE ARROW KEYS TO NAVIGATE AND ESC KEY TO CLOSE");
|
|||
|
for( i = 16; i <= 65; i++)
|
|||
|
{ gotoxy(i,10);
|
|||
|
printf ("%c",ro);
|
|||
|
gotoxy(i,14);
|
|||
|
printf ("%c",ro);
|
|||
|
gotoxy(i,36);
|
|||
|
printf ("%c",ro);
|
|||
|
gotoxy(i,40);
|
|||
|
printf ("%c",ro);
|
|||
|
}
|
|||
|
for(i = 11; i <= 39; i++)
|
|||
|
{ gotoxy(15,i);
|
|||
|
printf ("%c",co);
|
|||
|
gotoxy(66,i);
|
|||
|
printf ("%c",co);
|
|||
|
}
|
|||
|
gotoxy(15,10);
|
|||
|
printf("%c",201); //GARPH CHAR 201 '<27>'
|
|||
|
gotoxy(66,10);
|
|||
|
printf("%c",187); //GARPH CHAR 187 '<27>'
|
|||
|
gotoxy(15,40);
|
|||
|
printf("%c",200); //GARPH CHAR 200 '<27>'
|
|||
|
gotoxy(66,40);
|
|||
|
printf("%c",188); //GARPH CHAR 188 '<27>'
|
|||
|
gotoxy(15,14);
|
|||
|
printf("%c",204); //GARPH CHAR 204 '<27>'
|
|||
|
gotoxy(66,14);
|
|||
|
printf("%c",185); //GARPH CHAR 185 '<27>'
|
|||
|
gotoxy(15,36);
|
|||
|
printf("%c",204); //GARPH CHAR 204 '<27>'
|
|||
|
gotoxy(66,36);
|
|||
|
printf("%c",185); //GARPH CHAR 185 '<27>'
|
|||
|
|
|||
|
textcolor(YELLOW + BLINK);
|
|||
|
int hed_sp = 16 +((49 - (strlen(mo[month]) + 5))/2); //ALLIGN HEADER
|
|||
|
TO
|
|||
|
CENTER
|
|||
|
gotoxy(hed_sp,12);
|
|||
|
cprintf("%s %d",mo[month],year);
|
|||
|
window(16,15,65,35);
|
|||
|
clrscr();
|
|||
|
for(i=1, j = 0; i<49; i+=7,j++) //PRINT DAY NAMES
|
|||
|
{
|
|||
|
if(i < 7)
|
|||
|
textcolor(RED); // FOR SUNDAY
|
|||
|
else
|
|||
|
textcolor(YELLOW); //OTHER THAN SUNDAY
|
|||
|
gotoxy(i,3);
|
|||
|
cprintf("%5s",day[j]);
|
|||
|
}
|
|||
|
}
|
|||
|
void print_cal(int year, int month)
|
|||
|
{
|
|||
|
int i, j, start, count, limit;
|
|||
|
textmode(64);
|
|||
|
start = first_day(year, month);
|
|||
|
count = 0, limit = 31;
|
|||
|
draw(year, month);
|
|||
|
if( month == 3 || month == 5 || month == 8 || month == 10 )
|
|||
|
limit = 30; //FOR APRIL, JUNE, SEPT, NOV
|
|||
|
if(month == 1 ) //FOR FEB
|
|||
|
limit = (year% 4==0 && year%100 != 0 || year%400==0)? 29: 28;
|
|||
|
for(j=7; j< 20; j+=3) //ROW COUNTER
|
|||
|
{
|
|||
|
for(i=1; i<49; i+=7) //COLUMN COUNTER
|
|||
|
{
|
|||
|
if(i < 7)
|
|||
|
textcolor(RED); //DATES ON SUNDAY
|
|||
|
else
|
|||
|
textcolor(YELLOW);
|
|||
|
gotoxy(i,j);
|
|||
|
if(start)
|
|||
|
start--; //EMPTY SPACES TILL NUMBERING STARTS
|
|||
|
else
|
|||
|
{
|
|||
|
if(count == today) //HILIGHT CURRENT DATE
|
|||
|
{
|
|||
|
textcolor(BLUE);
|
|||
|
textbackground(YELLOW);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
textcolor(YELLOW);
|
|||
|
textbackground(BLACK);
|
|||
|
}
|
|||
|
cprintf("%4d",count+1); //PRINT DATE
|
|||
|
count++;
|
|||
|
}
|
|||
|
if(count >= limit)
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if(count <= 30 && count < limit) //FOR PRINTING IN FIRST ROW IF ALL
|
|||
|
ROWS
|
|||
|
EXUASTED
|
|||
|
{ for(i=1; i<49; i+=7)
|
|||
|
{
|
|||
|
if(i < 7)
|
|||
|
textcolor(RED);
|
|||
|
else
|
|||
|
textcolor(YELLOW);
|
|||
|
gotoxy(i,7);
|
|||
|
if(count == today)
|
|||
|
{
|
|||
|
textcolor(BLUE);
|
|||
|
textbackground(YELLOW);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
textcolor(YELLOW);
|
|||
|
textbackground(BLACK);
|
|||
|
}
|
|||
|
cprintf("%4d",count+1);
|
|||
|
count++;
|
|||
|
if(count >= limit)
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
window(16,37,65,39); //SETS WINDOW TO BOTTOM OF BOX
|
|||
|
show_time(); //SHOWS TIME
|
|||
|
}
|