-
-
Save Nia-TN1012/2f14cf6946c3355bb96c2259cab07945 to your computer and use it in GitHub Desktop.
7セグ or 14セグメントのドットマトリックスで日付を表示するカレンダーです。言語はC++、ライブラリはDXライブラリです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 ); | |
} | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 ); | |
} | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 名前 : 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 名前 : 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
GitHubのアカウント統合のため、Myoga1012→Nia-TN1012に移行しました。
旧URL: https://gist.github.com/Myoga1012/8e56f44ecd710555a06c