C言語関係掲示板

過去ログ

No771 現在日が点滅するカレンダー

[戻る] [ホームページ]
No.9593

点滅について
投稿者---mimi(2003/10/06 19:11:41)


カレンダーで現在の日にちを取得し、
現在の日を点滅するようにしたいのですが
それってできるのでしょうか??
誰か分かる方よろしくお願いします。
最後になりましたが、環境は
windowsでボーランドのコンパイラです。
よろしくお願いします

No.9596

Re:点滅について
投稿者---通りすがりさん(2003/10/06 21:23:40)


No.9579に貼ってあるリンク先がヒントになるかもしれませんよ。

No.9599

Re:点滅について
投稿者---mimi(2003/10/07 13:14:58)


上記のところを参考にがんばってみてるのですがどのようにしたら点滅が
できるのかわかりません(泣
色を変えて表示するようにしても一月分のカレンダーを一度に表示した後に現在の日だけを点滅するようにしようとしているのですが、
点滅をどのようにしたらいいかわからないんです。
まことにもうしわけないんですが、
誰か分かる方よろしくお願いします...

No.9738

Re:点滅について
投稿者---ともじ(2003/10/13 20:57:20)


ちょっと日にちが経ちすぎてお役に立てないかもしれませんが…。

>カレンダーで現在の日にちを取得し、
>現在の日を点滅するようにしたいのですが
>それってできるのでしょうか??
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>

void calendar(HANDLE hOut, int y, int m, int d);
int is_leap_year(int y);
int week_of_day(int y, int m, int d);
int month_last_day(int y, int m);
int Locate(HANDLE hOut, int x, int y);

int main(void)
{
    time_t timer;
    struct tm *t_st;
    HANDLE hStdout;
        
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    
    time(&timer);
    t_st = localtime(&timer);
   
    /* カレンダーの表示 */
    calendar(hStdout, t_st->tm_year+1900, t_st->tm_mon+1, t_st->tm_mday);

    return 0;
}

/* カレンダーの表示 */
void calendar(HANDLE hStdout, int y, int m, int d)
{
    int i, e, fw, xz, yz;
    static int sw = 0;

    fw = week_of_day(y, m, 1);
    e = month_last_day(y, m);
    
    Locate(hStdout, 0, 0);
    printf(" %d年%d月\n", y, m);
    printf(" 日 月 火 水 木 金 土\n");
    printf("---------------------\n");
       
    for (i = 1; i <= fw; i++)
        printf("   ");
    for (i = 1; i <= e; i++) {
        printf(" %2d", i);
        if ( (i + fw) % 7 == 0) 
            putchar('\n');
    }

    xz = (d + fw - 1) % 7 * 3;
    yz = (d + fw - 1) / 7 + 3;
    while(!kbhit()) {
        Locate(hStdout, xz, yz);
        if (sw == 0) {
            printf(" %2d", d);
            sw = 1;
        }
        else {
            printf("   ");
            sw = 0;
        }
        Sleep(500);
    }
}

/* 閏年の判定 */
int is_leap_year(int y)
{
    return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
}

/* 月の最終日を求める */
int month_last_day(int y, int m)
{
    int d = 0, last[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    if (m == 2)
        d = last[m-1] + is_leap_year(y);
    else if (m >= 1 && m <= 12)
        d = last[m-1];
    
    return d;
}

/* 指定日の曜日を求める */
int week_of_day(int y, int m, int d)
{
    if(m==1) {
        y=y-1;
        m=13;
    }
    else if(m==2) {
        y=y-1;
        m=14; 
    }
  
    return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
}

/* カーソル位置の指定 */
int Locate(HANDLE hOut, int x, int y)
{
    COORD dwPos;
    dwPos.X = (SHORT)x;
    dwPos.Y = (SHORT)y;

    if (SetConsoleCursorPosition(hOut, dwPos) == 0)
        return -1;
    else
        return 0;
}