Skip to content

Instantly share code, notes, and snippets.

@Nia-TN1012
Forked from Myoga1012/14seq.h
Last active January 30, 2023 09:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nia-TN1012/2f14cf6946c3355bb96c2259cab07945 to your computer and use it in GitHub Desktop.
Save Nia-TN1012/2f14cf6946c3355bb96c2259cab07945 to your computer and use it in GitHub Desktop.
7セグ or 14セグメントのドットマトリックスで日付を表示するカレンダーです。言語はC++、ライブラリはDXライブラリです。
#pragma once
#include "DxLib.h"
#include <vector>
// sourceの値が、targetのリストのいずれかとマッチするかどうかを判別します。
bool AnyOneOfMatch( char source, std::vector<char> target ) {
bool ans = false;
std::vector<char>::iterator titer = target.begin();
while( titer != target.end() ) {
if( source == *titer++ ) {
ans = true; break;
}
}
return ans;
}
// 数値 0~9、アルファベット A~Z を14セグメントの符号に変換し、ドットマトリックスとして表示します。
class FourteenSegDotMatrix {
private:
// 数値 -> 14セグメント符号
static void DecodeFor14seg( char dec, bool seg[] ) {
if( !( dec >= '0' && dec <= '9' || dec >= 'A' && dec <= 'Z' || dec == ' ' ) )
return;
/*
■ : 0
▲ : 8
◆ : 10 ◆ : 11
■■■■■■■
■◆□▲□◆■
■ : 5 ■□◆▲◆□■ ■ : 1
■□◆▲◆□■
▲ : 6 ■▲▲▲▲▲■ ▲ : 7
■□◆▲◆□■
■ : 4 ■□◆▲◆□■ ■ : 2
■◆□▲□◆■
■■■■■■■
◆ : 13 ◆ : 12
▲ : 9
■ : 3
0 1 2 3 4 5 6 7 8 9 10 11 12 13
-----------------------------------------
0 : ○ ○ ○ ○ ○ ○ ○ ○ - - - ○ - ○ ※Oと区別するため、斜線を入れています。
1 : - ○ ○ - - - - - - - - - - -
2 : ○ ○ - ○ ○ - ○ ○ - - - - - -
3 : ○ ○ ○ ○ - - ○ ○ - - - - - -
4 : - ○ ○ - - ○ ○ ○ - - - - - -
5 : ○ - ○ ○ - ○ ○ ○ - - - - - -
6 : ○ - ○ ○ ○ ○ ○ ○ - - - - - -
7 : ○ ○ ○ - - - - - - - - - - -
8 : ○ ○ ○ ○ ○ ○ ○ ○ - - - - - -
9 : ○ ○ ○ ○ - ○ ○ ○ - - - - - -
A : ○ ○ ○ - ○ ○ ○ ○ - - - - - -
B : ○ ○ ○ ○ - - - ○ ○ ○ - - - -
C : ○ - - ○ ○ ○ - - - - - - - -
D : ○ ○ ○ ○ - - - - ○ ○ - - - -
E : ○ - - ○ ○ ○ ○ ○ - - - - - -
F : ○ - - - ○ ○ ○ ○ - - - - - -
G : ○ - ○ ○ ○ ○ - ○ - - - - - -
H : - ○ ○ - ○ ○ ○ ○ - - - - - -
I : ○ - - ○ - - - - ○ ○ - - - -
J : - ○ ○ ○ ○ - - - - - - - - -
K : - - - - ○ ○ ○ - - - - ○ ○ -
L : - - - ○ ○ ○ - - - - - - - -
M : - ○ ○ - ○ ○ - - - - ○ ○ - -
N : - ○ ○ - ○ ○ - - - - ○ - ○ -
O : ○ ○ ○ ○ ○ ○ ○ ○ - - - - - -
P : ○ ○ - - ○ ○ ○ ○ - - - - - -
Q : ○ ○ ○ ○ ○ ○ ○ ○ - - - - ○ -
R : ○ ○ - - ○ ○ ○ ○ - - - - ○ -
S : ○ - ○ ○ - ○ ○ ○ - - - - - -
T : ○ - - - - - - - ○ ○ - - - -
U : - ○ ○ ○ ○ ○ ○ ○ - - - - - -
V : - - - - ○ ○ - - - - - ○ - ○
W : - ○ ○ - ○ ○ - - - - - - ○ ○
X : - - - - - - - - - - ○ ○ ○ ○
Y : - ○ - - - ○ ○ ○ - ○ - - - -
Z : ○ - - ○ - - - - - - - ○ - ○
_ : - - - - - - - - - - - - - - ※空白です。
*/
seg[0] = !AnyOneOfMatch( dec, { '1', '4', 'H', 'J', 'K', 'L', 'M', 'N', 'U', 'V', 'W', 'X', 'Y', ' ' } );
seg[1] = !AnyOneOfMatch( dec, { '5', '6', 'C', 'E', 'F', 'G', 'I', 'K', 'L', 'S', 'T', 'V', 'X', 'Z', ' ' } );
seg[2] = !AnyOneOfMatch( dec, { '2', 'C', 'E', 'F', 'I', 'K', 'L', 'P', 'R', 'T', 'V', 'X', 'Y', 'Z', ' ' } );
seg[3] = !AnyOneOfMatch( dec, { '1', '4', '7', 'A', 'F', 'H', 'K', 'M', 'N', 'P', 'R', 'T', 'V', 'W', 'X', 'Y', ' ' } );
seg[4] = !AnyOneOfMatch( dec, { '1', '3', '4', '5', '7', '9', 'B', 'D', 'I', 'S', 'T', 'X', 'Y', 'Z', ' ' } );
seg[5] = !AnyOneOfMatch( dec, { '1', '2', '3', '7', 'B', 'D', 'I', 'J', 'T', 'X', 'Z', ' ' } );
seg[6] = AnyOneOfMatch( dec, { '2', '3', '4', '5', '6', '8', '9', 'A', 'E', 'F', 'H', 'K', 'P', 'R', 'S', 'Y' } );
seg[7] = AnyOneOfMatch( dec, { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'E', 'F', 'G', 'H', 'P', 'R', 'S', 'Y' } );
seg[8] = AnyOneOfMatch( dec, { 'B', 'D', 'I', 'T' } );
seg[9] = AnyOneOfMatch( dec, { 'B', 'D', 'I', 'T', 'Y' } );
seg[10] = AnyOneOfMatch( dec, { 'M', 'N', 'X' } );
seg[11] = AnyOneOfMatch( dec, { '0', 'K', 'M', 'V', 'X', 'Z' } );
seg[12] = AnyOneOfMatch( dec, { 'K', 'N', 'Q', 'R', 'W', 'X' } );
seg[13] = AnyOneOfMatch( dec, { '0', 'V', 'W', 'X', 'Z' } );
}
// 14セグメント符号から7×9のドットマトリックスを構成します。
static void Convert14segToDotMatrix( const bool seg14[], bool seg14dmt[][7] ) {
for( int i = 0; i < 9; i++ )
for( int j = 0; j < 7; j++ )
seg14dmt[i][j] = false;
// 水平1
for( int i = 1; i < 6; i++ ) {
seg14dmt[0][i] = seg14[0];
seg14dmt[8][i] = seg14[3];
}
// 水平
for( int i = 1; i < 3; i++ ) {
seg14dmt[0][i] = seg14dmt[0][i + 3] = seg14[0];
seg14dmt[8][i] = seg14dmt[8][i + 3] = seg14[3];
seg14dmt[4][i] = seg14[6];
seg14dmt[4][i + 3] = seg14[7];
}
// 垂直
for( int i = 1; i < 4; i++ ) {
seg14dmt[i][0] = seg14[5];
seg14dmt[i][3] = seg14[8];
seg14dmt[i][6] = seg14[1];
seg14dmt[i + 4][0] = seg14[4];
seg14dmt[i + 4][3] = seg14[9];
seg14dmt[i + 4][6] = seg14[2];
}
// ナナメ
seg14dmt[1][1] = seg14[10];
seg14dmt[1][5] = seg14[11];
seg14dmt[7][5] = seg14[12];
seg14dmt[7][1] = seg14[13];
for( int i = 2; i < 4; i++ ) {
seg14dmt[i][2] = seg14[10];
seg14dmt[i][4] = seg14[11];
seg14dmt[i + 3][4] = seg14[12];
seg14dmt[i + 3][2] = seg14[13];
}
// クロスポイント
seg14dmt[0][0] = seg14[0] || seg14[5] || seg14[10];
seg14dmt[0][3] = seg14[0] || seg14[8];
seg14dmt[0][6] = seg14[0] || seg14[1] || seg14[11];
seg14dmt[4][6] = seg14[1] || seg14[2] || seg14[7];
seg14dmt[8][6] = seg14[2] || seg14[3] || seg14[12];
seg14dmt[8][3] = seg14[3] || seg14[9];
seg14dmt[8][0] = seg14[3] || seg14[4] || seg14[13];
seg14dmt[4][0] = seg14[4] || seg14[5] || seg14[6];
seg14dmt[4][3] = seg14[6] || seg14[7] || seg14[8] || seg14[9] || seg14[10] || seg14[11] || seg14[12] || seg14[13];
}
public:
static const int DotSize = 7; // ドットのサイズ
static const int SegSizeX = DotSize * 7; // 1セグメント当たりのサイズ
static const int SegSizeY = DotSize * 9;
static const int SegMargin = 3; // セグメントのマージン
static void DrawNumAlpha( int x, int y, char na, int fillColor, int edgeColor = 0, int xoff = 0, int yoff = 0 ) {
if( !( na >= '0' && na <= '9' || na >= 'A' && na <= 'Z' || na == ' ' ) ){
for( int i = 0; i < 9; i++ )
for( int j = 0; j < 7; j++ )
DrawBlank( x, y, i, j, xoff, yoff );
return;
}
bool seg14[14] = { false };
bool seg14dmt[9][7] = { false };
DecodeFor14seg( na, seg14 );
Convert14segToDotMatrix( seg14, seg14dmt );
// ドットマトリックスを表示します。
for( int i = 0; i < 9; i++ ) {
for( int j = 0; j < 7; j++ ) {
if( seg14dmt[i][j] ) {
DrawBox(
DotSize * j + x * ( SegSizeX + SegMargin * 2 ) + SegMargin + xoff, // x1
DotSize * i + y * ( SegSizeY + SegMargin * 2 ) + SegMargin + yoff, // y1
DotSize * ( j + 1 ) + x * ( SegSizeX + SegMargin * 2 ) + SegMargin + xoff, // x2
DotSize * ( i + 1 ) + y * ( SegSizeY + SegMargin * 2 ) + SegMargin + yoff, // y2
edgeColor, true
);
DrawBox(
DotSize * j + x * ( SegSizeX + SegMargin * 2 ) + SegMargin + 1 + xoff, // x1
DotSize * i + y * ( SegSizeY + SegMargin * 2 ) + SegMargin + 1 + yoff, // y1
DotSize * ( j + 1 ) + x * ( SegSizeX + SegMargin * 2 ) + SegMargin - 1 + xoff, // x2
DotSize * ( i + 1 ) + y * ( SegSizeY + SegMargin * 2 ) + SegMargin - 1 + yoff, // y2
fillColor, true
);
}
else DrawBlank( x, y, i, j, xoff, yoff );
}
}
}
private:
static void DrawBlank( int x, int y, int i, int j, int xoff, int yoff ) {
DrawBox(
DotSize * j + x * ( SegSizeX + SegMargin * 2 ) + SegMargin + 1 + xoff, // x1
DotSize * i + y * ( SegSizeY + SegMargin * 2 ) + SegMargin + 1 + yoff, // y1
DotSize * ( j + 1 ) + x * ( SegSizeX + SegMargin * 2 ) + SegMargin - 1 + xoff, // x2
DotSize * ( i + 1 ) + y * ( SegSizeY + SegMargin * 2 ) + SegMargin - 1 + yoff, // y2
0x101010, true
);
}
};
// 上の14セグメントドットマトリックスを表示するクラスを使って、2桁の10進数を値を表示します。
// X座標では1桁分だけ間隔をあけます。
class FourteenSegDotMatrixForDate {
public:
static void DrawDate( int x, int y, char day, int fillColor, int edgeColor = 0, int xoff = 0, int yoff = 0 ) {
if( day >= 1 && day <= 31 ) {
char ten = day / 10, one = day % 10;
FourteenSegDotMatrix::DrawNumAlpha( x * 3, y, ten == 0 ? ' ' : ( char )( ten + '0' ), fillColor, edgeColor, xoff, yoff );
FourteenSegDotMatrix::DrawNumAlpha( x * 3 + 1, y, ( char )( one + '0' ), fillColor, edgeColor, xoff, yoff );
}
else {
FourteenSegDotMatrix::DrawNumAlpha( x * 3, y, -1, fillColor, edgeColor, xoff, yoff );
FourteenSegDotMatrix::DrawNumAlpha( x * 3 + 1, y, -1, fillColor, edgeColor, xoff, yoff );
}
}
};
// 上の14セグメントドットマトリックスを表示するクラスを使って、文字列(英数字のみですが)を表示します。
class FourteenSegDotMatrixForString {
public:
static void DrawString( int x, int y, const char* na, int length, int fillColor, int edgeColor = 0, int xoff = 0, int yoff = 0 ) {
int xn = 0;
while( *na && xn < length - 1 ) {
FourteenSegDotMatrix::DrawNumAlpha( x + xn++, y, *na++, fillColor, edgeColor, xoff, yoff );
}
}
};
#pragma once
#include "DxLib.h"
// 数値 0~9 を7セグメントの符号に変換し、ドットマトリックスとして表示します。
class SevenSegDotMatrix {
private:
/*
0
■■■■
5 ■□□■ 1
■□□■
■■■■ <- 6
■□□■
4 ■□□■ 2
■■■■
3
0 : 0000 : 1 1 1 1 1 1 0
1 : 0001 : 0 1 1 0 0 0 0
2 : 0010 : 1 1 0 1 1 0 1
3 : 0011 : 1 1 1 1 0 0 1
4 : 0100 : 0 1 1 0 0 1 1
5 : 0101 : 1 0 1 1 0 1 1
6 : 0110 : 1 0 1 1 1 1 1
7 : 0111 : 1 1 1 0 0 0 0
8 : 1000 : 1 1 1 1 1 1 1
9 : 1001 : 1 1 1 1 0 1 1
*/
// 数値 -> 7セグメント符号
static void DecodeFor7seg( char dec, bool seg[] ) {
if( dec < 0 || dec > 9 )
return;
seg[0] = dec != 1 && dec != 4;
seg[1] = dec != 5 && dec != 6;
seg[2] = dec != 2;
seg[3] = seg[0] && dec != 7;
seg[4] = dec == 0 || dec == 2 || dec == 6 || dec == 8;
seg[5] = dec == 0 || dec >= 4 && dec <= 6 || dec >= 8;
seg[6] = dec >= 2 && dec <= 6 || dec >= 8;
}
// 7セグメント符号から4×7のドットマトリックスを構成します。
static void Convert7segToDotMatrix( const bool seg7[], bool seg7dmt[][4] ) {
for( int i = 0; i < 7; i++ )
for( int j = 0; j < 4; j++ ) seg7dmt[i][j] = false;
for( int i = 1; i < 3; i++ ) {
seg7dmt[0][i] = seg7[0];
seg7dmt[6][i] = seg7[3];
seg7dmt[3][i] = seg7[6];
seg7dmt[i][0] = seg7[5];
seg7dmt[i][3] = seg7[1];
seg7dmt[i + 3][0] = seg7[4];
seg7dmt[i + 3][3] = seg7[2];
}
seg7dmt[0][0] = seg7[0] || seg7[5];
seg7dmt[0][3] = seg7[0] || seg7[1];
seg7dmt[3][0] = seg7[5] || seg7[6] || seg7[4];
seg7dmt[3][3] = seg7[1] || seg7[6] || seg7[2];
seg7dmt[6][0] = seg7[4] || seg7[3];
seg7dmt[6][3] = seg7[2] || seg7[3];
}
public:
static const int DotSize = 10; // ドットのサイズ
static const int SegSizeX = DotSize * 4; // 1セグメント当たりのサイズ
static const int SegSizeY = DotSize * 7;
static const int SegMargin = 5; // セグメントのマージン
static void DrawNum( int x, int y, char num, int fillColor, int edgeColor = 0 ) {
if( num < 0 || num > 9 ) {
for( int i = 0; i < 7; i++ )
for( int j = 0; j < 4; j++ )
DrawBlank( x, y, i, j, num );
return;
}
bool seg7[7] = { false };
bool seg7dmt[7][4] = { false };
DecodeFor7seg( num, seg7 );
Convert7segToDotMatrix( seg7, seg7dmt );
// ドットマトリックスを表示します。
for( int i = 0; i < 7; i++ ) {
for( int j = 0; j < 4; j++ ) {
if( seg7dmt[i][j] ) {
DrawBox(
DotSize * j + x * ( SegSizeX + SegMargin * 2 ) + SegMargin, // x1
DotSize * i + y * ( SegSizeY + SegMargin * 2 ) + SegMargin, // y1
DotSize * ( j + 1 ) + x * ( SegSizeX + SegMargin * 2 ) + SegMargin, // x2
DotSize * ( i + 1 ) + y * ( SegSizeY + SegMargin * 2 ) + SegMargin, // y2
edgeColor, true
);
DrawBox(
DotSize * j + x * ( SegSizeX + SegMargin * 2 ) + SegMargin + 1, // x1
DotSize * i + y * ( SegSizeY + SegMargin * 2 ) + SegMargin + 1, // y1
DotSize * ( j + 1 ) + x * ( SegSizeX + SegMargin * 2 ) + SegMargin - 1, // x2
DotSize * ( i + 1 ) + y * ( SegSizeY + SegMargin * 2 ) + SegMargin - 1, // y2
fillColor, true
);
}
else DrawBlank( x, y, i, j, num );
}
}
}
private:
static void DrawBlank( int x, int y, int i, int j, char num ) {
DrawBox(
DotSize * j + x * ( SegSizeX + SegMargin * 2 ) + SegMargin + 1, // x1
DotSize * i + y * ( SegSizeY + SegMargin * 2 ) + SegMargin + 1, // y1
DotSize * ( j + 1 ) + x * ( SegSizeX + SegMargin * 2 ) + SegMargin - 1, // x2
DotSize * ( i + 1 ) + y * ( SegSizeY + SegMargin * 2 ) + SegMargin - 1, // y2
0x101010, true
);
}
};
// 上の7セグメントドットマトリックスを表示するクラスを使って、2桁の10進数を値を表示します。
// X座標では1桁分だけ間隔をあけます。
class SevenSegDotMatrixForDate {
public:
static void DrawNum( int x, int y, char num, int fillColor, int edgeColor = 0 ) {
if( num < 0 || num > 31 ){
SevenSegDotMatrix::DrawNum( x * 3, y, -1, fillColor, edgeColor );
SevenSegDotMatrix::DrawNum( x * 3 + 1, y, -1, fillColor, edgeColor );
return;
}
else {
char ten = num / 10, one = num % 10;
SevenSegDotMatrix::DrawNum( x * 3, y, ten == 0 ? -1 : ten, fillColor, edgeColor );
SevenSegDotMatrix::DrawNum( x * 3 + 1, y, one, fillColor, edgeColor );
}
}
};
// 名前 : Nia Tomonaka
// Twitter : https://twitter.com/nia_tn1012
#include "DxLib.h"
#include "14Seg.h"
// Zellerの公式でddの1日目の曜日を求めます。
int Zeller( DATEDATA& dd ) {
return ( dd.Year + dd.Year / 4 - dd.Year / 100 + dd.Year / 400 + ( 13 * dd.Mon + 8 ) / 5 + 1 ) % 7;
}
// ddの月末日を求めます。
int DaysInMonth( DATEDATA& dd ) {
if( dd.Mon == 2 )
return dd.Year % 4 == 0 ? 29 : 28;
else
return ( dd.Mon <= 7 && dd.Mon % 2 == 1 || dd.Mon >= 8 && dd.Mon % 2 == 0 ) ? 31 : 30;
}
// 月の英語を取得します。
const char* GetMonthName( int mon ) {
switch( mon ) {
case 1: return "JANUARY"; break;
case 2: return "FEBRARY"; break;
case 3: return "MARCH"; break;
case 4: return "APRIL"; break;
case 5: return "MAY"; break;
case 6: return "JUNE"; break;
case 7: return "JULY"; break;
case 8: return "AUGUST"; break;
case 9: return "SEPTEMBER"; break;
case 10: return "OCTOBER"; break;
case 11: return "NOVEMBER"; break;
case 12: return "DECEMBER"; break;
default: return "NA"; break;
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
SetMainWindowText( "14セグメント ドットマトリックス" ); // ウインドウタイトルの変更
ChangeWindowMode( TRUE ); // ウィンドウモード
SetGraphMode( 1120, 540, 16 ); // ウィンドウサイズの変更
SetOutApplicationLogValidFlag( false ); // ログを出力しない
// DXライブラリの初期化
if( DxLib_Init() == -1 ) return -1;
// 画面の描画先をリアバッファーに設定する場合、このコメントアウトを解除します。
SetDrawScreen( DX_SCREEN_BACK );
// ここから開始
DATEDATA now;
GetDateTime( &now ); // 現在の日時を取得します。
int lastDay = DaysInMonth( now ); // 当月末日を求めます。
// YYYY年MM月とタイトルバーに表示します。
char ds[64];
sprintf_s( ds, "カレンダー - %4d年%02d月", now.Year, now.Mon );
SetMainWindowText( ds );
// 年月を描画します。
char ym[15];
for( int i = 0; i < 21; i++ )
FourteenSegDotMatrix::DrawNumAlpha( i, 0, -1, 0, 0, 10, 10 );
sprintf_s( ym, "%s %4d", GetMonthName( now.Mon ), now.Year );
FourteenSegDotMatrixForString::DrawString( 0, 0, ym, 15, 0x80FF80, 0x00FF00, 10, 10 );
// ドットマトリックスの背景を描画します。
for( int i = 0; i < 42; i++ )
FourteenSegDotMatrixForDate::DrawDate( i % 7, i / 7 + 1, -1, 0, 0, 10, 40 );
// 日付を描画します。
for( int seq = Zeller( now ), day = 1; day <= lastDay; seq++, day++ ) {
FourteenSegDotMatrixForDate::DrawDate(
seq % 7, seq / 7 + 1, day,
seq % 7 == 0 ? 0xFF80DF : ( seq % 7 == 6 ? 0x00FFFF : 0xFFFFFF ),
seq % 7 == 0 ? 0xFF00FF : ( seq % 7 == 6 ? 0x2464FF : 0xAAAAAA ),
10, 40
);
}
ScreenFlip();
WaitKey();
// DXライブラリ終了処理
DxLib_End();
return 0;
}
// CalendarWith14SegDotMatrix.cpp ( C++ with DXライブラリ )
// Copyright (c) 2014-2023 Nia T.N. Tech Lab. / Chronoir.net.
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// 名前 : Nia Tomonaka
// Twitter : https://twitter.com/nia_tn1012
#include <stdio.h>
#include "DxLib.h"
#include "7seg.h"
// Zellerの公式でddの1日目の曜日を求めます。
int Zeller( DATEDATA& dd ) {
return ( dd.Year + dd.Year / 4 - dd.Year / 100 + dd.Year / 400 + ( 13 * dd.Mon + 8 ) / 5 + 1 ) % 7;
}
// ddの月末日を求めます。
int DaysInMonth( DATEDATA& dd ) {
if( dd.Mon == 2 )
return dd.Year % 4 == 0 ? 29 : 28;
else
return ( dd.Mon <= 7 && dd.Mon % 2 == 1 || dd.Mon >= 8 && dd.Mon % 2 == 0 ) ? 31 : 30;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
SetMainWindowText( "カレンダー" ); // ウインドウタイトルの変更
ChangeWindowMode( TRUE ); // ウィンドウモード
SetGraphMode( 1000, 480, 16 ); // ウィンドウサイズの変更
SetOutApplicationLogValidFlag( false ); // ログを出力しない
// DXライブラリの初期化を行います。
if( DxLib_Init() == -1 )
return -1;
// 画面の描画先をリアバッファーに設定します。
SetDrawScreen( DX_SCREEN_BACK );
// ここから開始
DATEDATA now;
GetDateTime( &now ); // 現在の日時を取得します。
int last = DaysInMonth( now ); // 当月末日を求めます。
// YYYY年MM月とタイトルバーに表示します。
char ds[64];
sprintf_s( ds, "カレンダー - %4d年%02d月", now.Year, now.Mon );
SetMainWindowText( ds );
// カレンダーを出力します。
// https://gist.github.com/Nia-TN1012/bdda8d68f0f2c8cd54f3b70bd0b7a42a ソースコードの名残です。
/*const int XArea = 30, YArea = 20;
for( int seq = Zeller( now ), day = 1; day <= last; seq++, day++ ) {
DrawFormatString(
10 + ( seq % 7 ) * XArea, 10 + ( seq / 7 ) * YArea,
// 日曜は赤系、土曜は青系、それ以外は白です。
seq % 7 == 0 ? 0xFF00CC : ( seq % 7 == 6 ? 0x00CCFF : 0xFFFFFF ),
"%2d", day
);
}*/
// ドットマトリックスの背景を描画します。
for( int i = 0; i < 42; i++ )
SevenSegDotMatrixForDate::DrawNum( i % 7, i / 7, -1, 0, 0 );
// 日付を描画します。
for( int seq = Zeller( now ), day = 1; day <= last; seq++, day++ ) {
SevenSegDotMatrixForDate::DrawNum(
seq % 7, seq / 7, day,
// 日曜は赤系、土曜は青系、それ以外は白です。
seq % 7 == 0 ? 0xFF80DF : ( seq % 7 == 6 ? 0x00FFFF : 0xFFFFFF ),
seq % 7 == 0 ? 0xFF00FF : ( seq % 7 == 6 ? 0x2464FF : 0xAAAAAA )
);
}
ScreenFlip(); // リアバッファーに描画した内容をウィンドウに反映します。
WaitKey(); // キーボードの入力を待ちます。
// DXライブラリ終了処理を行います。
DxLib_End();
return 0;
}
// CalendarWith7SegDotMatrix.cpp ( C++ with DXライブラリ )
// Copyright (c) 2014-2023 Nia T.N. Tech Lab. / Chronoir.net.
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
@Nia-TN1012
Copy link
Author

GitHubのアカウント統合のため、Myoga1012→Nia-TN1012に移行しました。

旧URL: https://gist.github.com/Myoga1012/8e56f44ecd710555a06c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment