以下のコードはカレンダーを作成して出力するコードです(誰かのコードメモ)
カレンダーで各日付をクリックすると
to-do listを出力し、やるべきことを入力してチェックできるカレンダープラン?作りたい
現在のコードは、キーボードで日付を選択できる状態です。マウスクリックで可能であればいいのですが、キーボードで選ぶ方法も悪くないと思います。
DxLibでは難しいことがわかりますが、Cに戻るライブラリがこれだけだと思います。
プログラムはVisual StudioのC ++を使用しましたが、Cコードで書かれています((C言語を使用する予定です)
DxLibは最強だと思います
よろしくお願いします
#include <stdio.h>
#include "DxLib.h"
int Zeller(DATEDATA& dd) {
return (dd.Year + dd.Year / 4 - dd.Year / 100 + dd.Year / 400 + (13 * dd.Mon + 8) / 5 + 1) % 7;
}
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;
}
// カレンダーを表示する関数
void DrawCalendar(DATEDATA& currentDate, int selectedDay) {
// YYYY年MM月とタイトルバーに表示
char windowTitle[64];
sprintf_s(windowTitle, "%4d年%02d月", currentDate.Year, currentDate.Mon);
SetMainWindowText(windowTitle);
const char* dayOfWeek[] = { "日", "月", "火", "水", "木", "金", "土" };
// 曜日を表示
for (int i = 0; i < 7; ++i) {
DrawFormatString(
10 + i * 30, 48,
0xFFFFFF,
dayOfWeek[i]
);
}
DrawFormatString(62, 20, 0xFFFFFF, "%4d年 %02d月", currentDate.Year, currentDate.Mon);
DrawFormatString(25, 20, 0xFFFFFF, "←");
DrawFormatString(170, 20, 0xFFFFFF, "→");
// セルを埋めるための空白の計算
int startOffset = Zeller(currentDate);
int xOffset = 30; // 各セルの横サイズ
int yOffset = 20; // 各セルの縦サイズ
int last = DaysInMonth(currentDate);
// カレンダー表示
for (int seq = startOffset, day = 1; day <= last; seq++, day++) {
// 日曜日は赤、土曜日は青、その他は白
unsigned int textColor = seq % 7 == 0 ? 0xFF0000 : (seq % 7 == 6 ? 0x0000FF : 0xFFFFFF);
DrawFormatString(
10 + (seq % 7) * xOffset, 70 + (seq / 7) * yOffset,
textColor,
"%2d", day
);
// ボックス表示
if (day == selectedDay) {
DrawBox(
10 + (seq % 7) * xOffset - 2, 70 + (seq / 7) * yOffset - 2,
10 + (seq % 7) * xOffset + 30 + 2, 70 + (seq / 7) * yOffset + 20 + 2,
0xFF0000, FALSE
);
}
}
}
// 前の月に移動する関数
void MoveToPreviousMonth(DATEDATA& currentDate) {
currentDate.Mon--;
if (currentDate.Mon < 1) {
currentDate.Mon = 12;
currentDate.Year--;
}
}
// 次の月に移動する関数
void MoveToNextMonth(DATEDATA& currentDate) {
currentDate.Mon++;
if (currentDate.Mon > 12) {
currentDate.Mon = 1;
currentDate.Year++;
}
}
// 前の週に移動する関数
void MoveToPreviousWeek(DATEDATA& currentDate, int& selectedDay) {
selectedDay -= 7; // 1週間前 (上)
if (selectedDay < 1) { // 1未満なら移動キャンセル
selectedDay = selectedDay + 7;
}
}
// 次の週に移動する関数
void MoveToNextWeek(DATEDATA& currentDate, int& selectedDay) {
selectedDay += 7; // 1週間後 (下)
if (selectedDay > DaysInMonth(currentDate)) { // 月の日数を超えたら移動キャンセル
selectedDay = selectedDay - 7;
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
SetMainWindowText("カレンダー");
ChangeWindowMode(TRUE);
SetGraphMode(320, 240, 16);
SetOutApplicationLogValidFlag(false);
if (DxLib_Init() == -1) return -1;
SetDrawScreen(DX_SCREEN_BACK);
DATEDATA currentDate;
GetDateTime(¤tDate);
int selectedDay = currentDate.Day; // 選択された日付
int leftKeyPrevState = 0;
int rightKeyPrevState = 0;
int upKeyPrevState = 0;
int downKeyPrevState = 0;
while (ProcessMessage() == 0) {
ClearDrawScreen();
DrawCalendar(currentDate, selectedDay);
ScreenFlip();
// ← キーを押すと前の月に移動
int leftKeyState = CheckHitKey(KEY_INPUT_LEFT);
if (leftKeyState == 1 && !leftKeyPrevState) { // キー入力状態確認
selectedDay--; // 1日前に移動
if (selectedDay < 1) { // 1日未満の場合
MoveToPreviousMonth(currentDate); // 前の月に移動
selectedDay = DaysInMonth(currentDate); // 前の月の最終日に設定
}
}
leftKeyPrevState = leftKeyState;
// → キーを押すと次の月に移動
int rightKeyState = CheckHitKey(KEY_INPUT_RIGHT);
if (rightKeyState == 1 && !rightKeyPrevState) { // キー入力状態確認
selectedDay++; // 1日後に移動
if (selectedDay > DaysInMonth(currentDate)) { // 月の最終日を超えたら
MoveToNextMonth(currentDate); // 次の月に移動
selectedDay = 1; // 次の月の初日に設定
}
}
rightKeyPrevState = rightKeyState;
// ↑ キーを押すとボックスを上に移動
int upKeyState = CheckHitKey(KEY_INPUT_UP); // キー入力確認
if (upKeyState == 1 && !upKeyPrevState) {
MoveToPreviousWeek(currentDate, selectedDay); // 上に移動する関数を実行
}
upKeyPrevState = upKeyState;
// ↓ キーを押すとボックスを下に移動
int downKeyState = CheckHitKey(KEY_INPUT_DOWN); // キー入力確認
if (downKeyState == 1 && !downKeyPrevState) {
MoveToNextWeek(currentDate, selectedDay); // 下に移動する関数を実行
}
downKeyPrevState = downKeyState;
if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) {
break;
}
}
DxLib_End();
return 0;
}
能力者を探す